fwcd / kotlin-language-server

Kotlin code completion, diagnostics and more for any editor/IDE using the Language Server Protocol
MIT License
1.65k stars 207 forks source link

Go-to-definition crashes when jar has plus sign in name #326

Open clarfonthey opened 2 years ago

clarfonthey commented 2 years ago

Somewhere along the line, the plus in the file:// URL is converted to a space, causing a crash by a NoSuchFileException.

I found this while writing a minecraft mod; I made a (mostly minimal) git repo to replicate the error: https://github.com/clarfonthey/kt-lsp-bug-repro

The following is the output I get from kak-lsp while attempting to go-to-definition for one of the sponge classes in CrashReport_noopMixin.kt. I additionally have the environment variable CLASSPATH=/usr/share/kotlin/lib/*.jar set.

*** This is the debug buffer, where debug info will be written ***
kak-lsp: config-change detected: 
kak-lsp: log: main      Adding script definitions [ScriptTemplateWithArgs]
kak-lsp: log: main      Kotlin Language Server: Version 1.2.0
kak-lsp: log: main      Connected to client
kak-lsp: log: async0    Adding workspace folder null
kak-lsp: log: async0    Adding .../minecraft-test/build.gradle.kts, .../minecraft-test/settings.gradle.kts, .../mixins/CrashReport_noopMixin.kt under /home/ltdk/minecraft-test to source path
kak-lsp: log: async0    Searching for dependencies and Java sources in workspace root /home/ltdk/minecraft-test
kak-lsp: log: async0    Resolving dependencies for 'minecraft-test' through Gradle's CLI using tasks [kotlinLSPProjectDeps]...
kak-lsp: log: async0    Found gradle at /usr/bin/gradle
kak-lsp: log: async0    Successfully resolved dependencies for 'minecraft-test' using Gradle
kak-lsp: log: async0    Resolving dependencies for 'minecraft-test' through Gradle's CLI using tasks [kotlinLSPProjectDeps]...
kak-lsp: log: async0    Found gradle at /usr/bin/gradle
kak-lsp: log: async0    Successfully resolved dependencies for 'minecraft-test' using Gradle
kak-lsp: log: async0    Adding 112 files to class path
kak-lsp: log: async0    Update build script path
kak-lsp: log: async0    Resolving dependencies for 'minecraft-test' through Gradle's CLI using tasks [kotlinLSPKotlinDSLDeps]...
kak-lsp: log: async0    Found gradle at /usr/bin/gradle
kak-lsp: language server is not initialized, parking request
kak-lsp: log: async0    Successfully resolved build script dependencies for 'minecraft-test' using Gradle
kak-lsp: log: async0    Adding 495 files to build script class path
kak-lsp: log: async0    Reinstantiating compiler
kak-lsp: log: async0    Adding script definitions [ScriptTemplateWithArgs]
kak-lsp: log: async0    Configuring Kotlin DSL script templates...
kak-lsp: log: async0    Adding script definitions [ScriptTemplateWithArgs, KotlinInitScript, KotlinSettingsScript, KotlinBuildScript]
kak-lsp: log: debounce0 Linting .../mixins/CrashReport_noopMixin.kt
kak-lsp: log: async2    Go-to-definition at .../mixins/CrashReport_noopMixin.kt 4:36
kak-lsp: log: async3    Updating symbol index...
kak-lsp: log: debounce0 Linting 0 files
kak-lsp: log: async2    Re-parsing CrashReport_noopMixin.kt 0:1-14:1
kak-lsp: log: async2    Hovering DOT_QUALIFIED_EXPRESSION
kak-lsp: log: async2    Found declaration descriptor Lazy Java class org.spongepowered.asm.mixin.Mixin
kak-lsp: log: async2    Finding contents of kls:file:///home/ltdk/.gradle/caches/modules-2/files-2.1/net.fabricmc/sponge-mixin/0.10.7%20mixin.0.8.4/7a4ca9d54d9ae564dea0363d668036a8420ed9b8/sponge-mixin-0.10.7%20mixin.0.8.4.jar!/org/spongepowered/asm/mixin/Mixin.class
kak-lsp: log: async2    Finished in 1389 ms
kak-lsp: log: async2    Internal error: java.nio.file.NoSuchFileException: /home/ltdk/.gradle/caches/modules-2/files-2.1/net.fabricmc/sponge-mixin/0.10.7 mixin.0.8.4/7a4ca9d54d9ae564dea0363d668036a8420ed9b8/sponge-mixin-0.10.7 mixin.0.8.4.jar
kak-lsp: log: java.util.concurrent.CompletionException: java.nio.file.NoSuchFileException: /home/ltdk/.gradle/caches/modules-2/files-2.1/net.fabricmc/sponge-mixin/0.10.7 mixin.0.8.4/7a4ca9d54d9ae564dea0363d668036a8420ed9b8/sponge-mixin-0.10.7 mixin.0.8.4.jar
kak-lsp: log:   at java.base/java.util.concurrent.CompletableFuture.encodeThrowable(CompletableFuture.java:315)
kak-lsp: log:   at java.base/java.util.concurrent.CompletableFuture.completeThrowable(CompletableFuture.java:320)
kak-lsp: log:   at java.base/java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1770)
kak-lsp: log:   at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
kak-lsp: log:   at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
kak-lsp: log:   at java.base/java.lang.Thread.run(Thread.java:833)
kak-lsp: log: Caused by: java.nio.file.NoSuchFileException: /home/ltdk/.gradle/caches/modules-2/files-2.1/net.fabricmc/sponge-mixin/0.10.7 mixin.0.8.4/7a4ca9d54d9ae564dea0363d668036a8420ed9b8/sponge-mixin-0.10.7 mixin.0.8.4.jar
kak-lsp: log:   at java.base/sun.nio.fs.UnixException.translateToIOException(UnixException.java:92)
kak-lsp: log:   at java.base/sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:106)
kak-lsp: log:   at java.base/sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:111)
kak-lsp: log:   at java.base/sun.nio.fs.UnixFileAttributeViews$Basic.readAttributes(UnixFileAttributeViews.java:55)
kak-lsp: log:   at java.base/sun.nio.fs.UnixFileSystemProvider.readAttributes(UnixFileSystemProvider.java:149)
kak-lsp: log:   at java.base/sun.nio.fs.LinuxFileSystemProvider.readAttributes(LinuxFileSystemProvider.java:99)
kak-lsp: log:   at java.base/java.nio.file.Files.readAttributes(Files.java:1851)
kak-lsp: log:   at java.base/java.util.zip.ZipFile$Source.get(ZipFile.java:1264)
kak-lsp: log:   at java.base/java.util.zip.ZipFile$CleanableResource.<init>(ZipFile.java:709)
kak-lsp: log:   at java.base/java.util.zip.ZipFile.<init>(ZipFile.java:243)
kak-lsp: log:   at java.base/java.util.zip.ZipFile.<init>(ZipFile.java:172)
kak-lsp: log:   at java.base/java.util.jar.JarFile.<init>(JarFile.java:347)
kak-lsp: log:   at java.base/sun.net.www.protocol.jar.URLJarFile.<init>(URLJarFile.java:103)
kak-lsp: log:   at java.base/sun.net.www.protocol.jar.URLJarFile.getJarFile(URLJarFile.java:72)
kak-lsp: log:   at java.base/sun.net.www.protocol.jar.JarFileFactory.getOrCreate(JarFileFactory.java:106)
kak-lsp: log:   at java.base/sun.net.www.protocol.jar.JarURLConnection.connect(JarURLConnection.java:132)
kak-lsp: log:   at java.base/sun.net.www.protocol.jar.JarURLConnection.getJarEntry(JarURLConnection.java:97)
kak-lsp: log:   at org.javacs.kt.externalsources.KlsURI.extractToTemporaryFile(KlsURI.kt:104)
kak-lsp: log:   at org.javacs.kt.externalsources.JarClassContentProvider.tryReadContentOf(JarClassContentProvider.kt:60)
kak-lsp: log:   at org.javacs.kt.externalsources.JarClassContentProvider.contentOf(JarClassContentProvider.kt:42)
kak-lsp: log:   at org.javacs.kt.definition.GoToDefinitionKt.goToDefinition(GoToDefinition.kt:48)
kak-lsp: log:   at org.javacs.kt.KotlinTextDocumentService$definition$1.invoke(KotlinTextDocumentService.kt:129)
kak-lsp: log:   at org.javacs.kt.KotlinTextDocumentService$definition$1.invoke(KotlinTextDocumentService.kt:124)
kak-lsp: log:   at org.javacs.kt.util.AsyncExecutor.compute$lambda-2(AsyncExecutor.kt:19)
kak-lsp: log:   at java.base/java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1768)
kak-lsp: log:   ... 3 more
kak-lsp: kotlin language server error: 'Internal error.'

Focusing on the specific crash:

kak-lsp: log: async2    Internal error: java.nio.file.NoSuchFileException: /home/ltdk/.gradle/caches/modules-2/files-2.1/net.fabricmc/sponge-mixin/0.10.7 mixin.0.8.4/7a4ca9d54d9ae564dea0363d668036a8420ed9b8/sponge-mixin-0.10.7 mixin.0.8.4.jar

If you check out the file it's trying to access, you'll notice that the issue is it converting a plus sign to a space, which normally should only be done in query strings:

-.gradle/caches/modules-2/files-2.1/net.fabricmc/sponge-mixin/0.10.7 mixin.0.8.4/7a4ca9d54d9ae564dea0363d668036a8420ed9b8/sponge-mixin-0.10.7 mixin.0.8.4.jar
+.gradle/caches/modules-2/files-2.1/net.fabricmc/sponge-mixin/0.10.7+mixin.0.8.4/7a4ca9d54d9ae564dea0363d668036a8420ed9b8/sponge-mixin-0.10.7+mixin.0.8.4.jar

Not 100% sure what's happening here, but if you run gradle build by itself, it passes, meaning that the paths definitely are working in gradle internally.

theoparis commented 1 year ago

Unfortunately this bug is still an issue and it is preventing from using this server instead of using Intellij for developing minecraft mods in Kotlin 😕 Has anyone found a fix that can be applied via a git checkout locally?

vladaviedov commented 3 months ago

I encountered the same issue with MC Fabric. The plus character is converted to a space when it's parsed as a URI. It looks like the parseURI function only handles spaces, but not other special symbols.