fwcd / kotlin-language-server

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

stdlib not found with gradle and kotlin 1.8.0 #413

Open troelsbjerre opened 1 year ago

troelsbjerre commented 1 year ago

When using kotlin("jvm") version "1.8.0" in Gradle, as suggested in https://kotlinlang.org/docs/get-started-with-jvm-gradle-project.html, the kotlin language server fails to find the standard library. This causes Unresolved reference: println kotlin(UNRESOLVED_REFERENCE) on a Hello-World program to be show as an error in the editor of choice. The same program builds just fine using Gradle from the command line, so it seems to be limited to the language server. However, it is not clear whether this is the fault of the language server or the kotlin distribution.

The issue is not present with previous version numbers.

themkat commented 1 year ago

Could you share your language server logs? Might be helpful for looking further into your issue 🙂 Unsure on what the issue might be.

troelsbjerre commented 1 year ago

I don't know how to enable language server logging. Any hints?

To reproduce the problem:

themkat commented 1 year ago

The language server logs a lot of information by default, so you shouldn't need to enable anything. How to find the logs will depend on your editor. In Emacs I have a buffer called *lsp-log*, while VScode has an output option called Kotlin:

image

Managed to reproduce it. Seems like the error is the same as for other similar issues:

org.jetbrains.kotlin.codegen.CompilationException: Back-end (JVM) Internal error: Failed to generate function appHasAGreeting
File being compiled: (10,5) in //Users/marie/Programming/Kotlin/langserver413/app/src/test/kotlin/langserver413/AppTest.kt
The root cause java.lang.IllegalStateException was thrown at: org.jetbrains.kotlin.codegen.state.KotlinTypeMapper$typeMappingConfiguration$1.processErrorType(KotlinTypeMapper.kt:128)
    at org.jetbrains.kotlin.codegen.MemberCodegen.genSimpleMember(MemberCodegen.java:206)
    at org.jetbrains.kotlin.codegen.ClassBodyCodegen.generateDeclaration(ClassBodyCodegen.java:168)
    at org.jetbrains.kotlin.codegen.ClassBodyCodegen.generateBody(ClassBodyCodegen.java:88)
    at org.jetbrains.kotlin.codegen.MemberCodegen.generate(MemberCodegen.java:132)
    at org.jetbrains.kotlin.codegen.MemberCodegen.genClassOrObject(MemberCodegen.java:305)
    at org.jetbrains.kotlin.codegen.MemberCodegen.genClassOrObject(MemberCodegen.java:289)
    at org.jetbrains.kotlin.codegen.PackageCodegenImpl.generateClassesAndObjectsInFile(PackageCodegenImpl.java:119)
    at org.jetbrains.kotlin.codegen.PackageCodegenImpl.generateFile(PackageCodegenImpl.java:138)
    at org.jetbrains.kotlin.codegen.PackageCodegenImpl.generate(PackageCodegenImpl.java:70)
    at org.jetbrains.kotlin.codegen.DefaultCodegenFactory.generatePackage(CodegenFactory.kt:77)
    at org.jetbrains.kotlin.codegen.DefaultCodegenFactory.generateModule(CodegenFactory.kt:62)
    at org.jetbrains.kotlin.codegen.KotlinCodegenFacade.compileCorrectFiles(KotlinCodegenFacade.java:35)
    at org.javacs.kt.compiler.Compiler.generateCode(Compiler.kt:572)
    at org.javacs.kt.SourcePath.save(SourcePath.kt:275)
    at org.javacs.kt.SourcePath.saveAllFiles(SourcePath.kt:287)
    at org.javacs.kt.KotlinTextDocumentService$lintAll$1.invoke(KotlinTextDocumentService.kt:270)
    at org.javacs.kt.KotlinTextDocumentService$lintAll$1.invoke(KotlinTextDocumentService.kt:268)
    at org.javacs.kt.util.Debouncer.submitImmediately$lambda-1(Debouncer.kt:27)
    at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539)
    at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
    at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:304)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
    at java.base/java.lang.Thread.run(Thread.java:833)
Caused by: java.lang.IllegalStateException: Error type encountered: [ERROR : Test] (UnresolvedType).
    at org.jetbrains.kotlin.codegen.state.KotlinTypeMapper$typeMappingConfiguration$1.processErrorType(KotlinTypeMapper.kt:128)
    at org.jetbrains.kotlin.load.kotlin.DescriptorBasedTypeSignatureMappingKt.mapType(descriptorBasedTypeSignatureMapping.kt:83)
    at org.jetbrains.kotlin.codegen.state.KotlinTypeMapper.mapType(KotlinTypeMapper.kt:284)
    at org.jetbrains.kotlin.codegen.state.KotlinTypeMapper.mapType$default(KotlinTypeMapper.kt:275)
    at org.jetbrains.kotlin.codegen.state.KotlinTypeMapper.mapType(KotlinTypeMapper.kt)
    at org.jetbrains.kotlin.codegen.AnnotationCodegen.genAnnotation(AnnotationCodegen.java:386)
    at org.jetbrains.kotlin.codegen.AnnotationCodegen.genAnnotations(AnnotationCodegen.java:154)
    at org.jetbrains.kotlin.codegen.FunctionCodegen.generateMethodAnnotationsIfRequired(FunctionCodegen.java:309)
    at org.jetbrains.kotlin.codegen.FunctionCodegen.generateMethod(FunctionCodegen.java:226)
    at org.jetbrains.kotlin.codegen.FunctionCodegen.generateMethod(FunctionCodegen.java:166)
    at org.jetbrains.kotlin.codegen.FunctionCodegen.gen(FunctionCodegen.java:137)
    at org.jetbrains.kotlin.codegen.MemberCodegen.genSimpleMember(MemberCodegen.java:200)
    ... 23 more
org.jetbrains.kotlin.codegen.CompilationException: Back-end (JVM) Internal error: Failed to generate expression: KtCallExpression
File being compiled: (14,5) in //Users/marie/Programming/Kotlin/langserver413/app/src/main/kotlin/langserver413/App.kt
The root cause java.lang.AssertionError was thrown at: org.jetbrains.kotlin.resolve.calls.callUtil.CallUtilKt.getResolvedCallWithAssert(callUtil.kt:209)
    at org.jetbrains.kotlin.codegen.ExpressionCodegen.genQualified(ExpressionCodegen.java:356)
    at org.jetbrains.kotlin.codegen.ExpressionCodegen.genStatement(ExpressionCodegen.java:481)
    at org.jetbrains.kotlin.codegen.ExpressionCodegen.generateBlock(ExpressionCodegen.java:1362)
    at org.jetbrains.kotlin.codegen.ExpressionCodegen.generateBlock(ExpressionCodegen.java:1307)
    at org.jetbrains.kotlin.codegen.CodegenStatementVisitor.visitBlockExpression(CodegenStatementVisitor.java:56)
    at org.jetbrains.kotlin.codegen.CodegenStatementVisitor.visitBlockExpression(CodegenStatementVisitor.java:22)
    at org.jetbrains.kotlin.psi.KtBlockExpression.accept(KtBlockExpression.java:79)
    at org.jetbrains.kotlin.codegen.ExpressionCodegen.genQualified(ExpressionCodegen.java:332)
    at org.jetbrains.kotlin.codegen.ExpressionCodegen.genStatement(ExpressionCodegen.java:481)
    at org.jetbrains.kotlin.codegen.ExpressionCodegen.gen(ExpressionCodegen.java:438)
    at org.jetbrains.kotlin.codegen.ExpressionCodegen.returnExpression(ExpressionCodegen.java:1866)
    at org.jetbrains.kotlin.codegen.FunctionGenerationStrategy$FunctionDefault.doGenerateBody(FunctionGenerationStrategy.java:64)
    at org.jetbrains.kotlin.codegen.FunctionGenerationStrategy$CodegenBased.generateBody(FunctionGenerationStrategy.java:86)
    at org.jetbrains.kotlin.codegen.FunctionCodegen.generateMethodBody(FunctionCodegen.java:646)
    at org.jetbrains.kotlin.codegen.FunctionCodegen.generateMethodBody(FunctionCodegen.java:484)
    at org.jetbrains.kotlin.codegen.FunctionCodegen.generateMethod(FunctionCodegen.java:261)
    at org.jetbrains.kotlin.codegen.FunctionCodegen.generateMethod(FunctionCodegen.java:166)
    at org.jetbrains.kotlin.codegen.FunctionCodegen.gen(FunctionCodegen.java:137)
    at org.jetbrains.kotlin.codegen.MemberCodegen.genSimpleMember(MemberCodegen.java:200)
    at org.jetbrains.kotlin.codegen.PackagePartCodegen.generateBody(PackagePartCodegen.java:98)
    at org.jetbrains.kotlin.codegen.MemberCodegen.generate(MemberCodegen.java:132)
    at org.jetbrains.kotlin.codegen.PackageCodegenImpl.generateFile(PackageCodegenImpl.java:149)
    at org.jetbrains.kotlin.codegen.PackageCodegenImpl.generate(PackageCodegenImpl.java:70)
    at org.jetbrains.kotlin.codegen.DefaultCodegenFactory.generatePackage(CodegenFactory.kt:77)
    at org.jetbrains.kotlin.codegen.DefaultCodegenFactory.generateModule(CodegenFactory.kt:62)
    at org.jetbrains.kotlin.codegen.KotlinCodegenFacade.compileCorrectFiles(KotlinCodegenFacade.java:35)
    at org.javacs.kt.compiler.Compiler.generateCode(Compiler.kt:572)
    at org.javacs.kt.SourcePath.save(SourcePath.kt:275)
    at org.javacs.kt.SourcePath.saveAllFiles(SourcePath.kt:287)
    at org.javacs.kt.KotlinTextDocumentService$lintAll$1.invoke(KotlinTextDocumentService.kt:270)
    at org.javacs.kt.KotlinTextDocumentService$lintAll$1.invoke(KotlinTextDocumentService.kt:268)
    at org.javacs.kt.util.Debouncer.submitImmediately$lambda-1(Debouncer.kt:27)
    at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539)
    at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
    at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:304)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
    at java.base/java.lang.Thread.run(Thread.java:833)
Caused by: java.lang.AssertionError: No resolved call for 'println(App().greeting)' at (14,5) in //Users/marie/Programming/Kotlin/langserver413/app/src/main/kotlin/langserver413/App.kt
    at org.jetbrains.kotlin.resolve.calls.callUtil.CallUtilKt.getResolvedCallWithAssert(callUtil.kt:209)
    at org.jetbrains.kotlin.codegen.ExpressionCodegen.visitCallExpression(ExpressionCodegen.java:2459)
    at org.jetbrains.kotlin.codegen.ExpressionCodegen.visitCallExpression(ExpressionCodegen.java:125)
    at org.jetbrains.kotlin.psi.KtCallExpression.accept(KtCallExpression.java:35)
    at org.jetbrains.kotlin.codegen.CodegenStatementVisitor.visitKtElement(CodegenStatementVisitor.java:31)
    at org.jetbrains.kotlin.codegen.CodegenStatementVisitor.visitKtElement(CodegenStatementVisitor.java:22)
    at org.jetbrains.kotlin.psi.KtVisitor.visitExpression(KtVisitor.java:182)
    at org.jetbrains.kotlin.psi.KtVisitor.visitReferenceExpression(KtVisitor.java:198)
    at org.jetbrains.kotlin.psi.KtVisitor.visitCallExpression(KtVisitor.java:278)
    at org.jetbrains.kotlin.psi.KtCallExpression.accept(KtCallExpression.java:35)
    at org.jetbrains.kotlin.codegen.ExpressionCodegen.genQualified(ExpressionCodegen.java:332)
    ... 37 more

Very unsure on what causes this 😱 One guess I have for now is a bug in the compiler APIs we use or something, and them having trouble reading the newer stdlib jars (???). Maybe there are some issues with versions of Kotlin deviating? (lang server Kotlin version and Jar version). Several issues have lately reported similar issues with stdlib symbols, notably #409.

If there are any bugs in the compiler APIs we use, then a version upgrade (#414) might help.

EDIT: Tried adding a simple for-loop after seeing this issue: https://github.com/fwcd/vscode-kotlin/issues/118. Seems like we get the same error message as in that issue ("... compiled with an incompatible version of Kotlin"). This causes me to believe that the upgrade of the language server to Kotlin 1.8.0 like #414 is doing will fix the issue. Sadly it causes a new issue I discuss in that PR.

troelsbjerre commented 1 year ago

Oh, I also saw a "... compiled with an incompatible version of Kotlin"-error while having the build.gradle.kts file open, so it sounds perfectly plausible that #414 would fix it. Thank you for looking into this!

nicholascannon commented 1 year ago

I'm still getting this issue after installing the newest version of the kotlin language server via brew. I'm using VSCode and the associated kotlin VSCode plugin. This occurs after opening a default project made with gradle init in vscode.

I have the following installed:

Build time: 2023-02-17 20:09:48 UTC Revision: 68959bf76cef4d28c678f2e2085ee84e8647b77a

Kotlin: 1.8.10 Groovy: 3.0.13 Ant: Apache Ant(TM) version 1.10.11 compiled on July 10 2021 JVM: 19.0.2 (Amazon.com Inc. 19.0.2+7-FR) OS: Mac OS X 13.0 x86_64


`build.gradle.kts` has the following under `plugins`:
```kts
plugins {
    // Apply the org.jetbrains.kotlin.jvm Plugin to add support for Kotlin.
    id("org.jetbrains.kotlin.jvm") version "1.8.10"

    // Apply the application plugin to add support for building a CLI application in Java.
    application
}

Any help would be appreciated. Would prefer not to use Intellij for Kotlin development.

themkat commented 1 year ago

I'm still getting this issue after installing the newest version of the kotlin language server via brew.

That is expected, as that version is almost a year old, and won't contain any of the recent fixes from PRs. We should probably release a new version soon, and we are working on PRs to automate the process and make it easier for us.

If you want bleeding edge, I suggest building from main and trying that one. It should contain a fix for Kotlin 1.8.10. (this is what I do for almost all language servers I use)