kotlin-language-server icon indicating copy to clipboard operation
kotlin-language-server copied to clipboard

Code generation (for Java interop) throws exception on recent Kotlin versions

Open fwcd opened this issue 2 years ago • 5 comments

While tinkering with #493, I've noticed that code generation seems to be broken when compiling the language server with Kotlin 1.9.10; the Kotlin compiler's JVM backend throws a lot of CompilationExceptions (see details for full stack trace).

[Error] org.jetbrains.kotlin.codegen.CompilationException: Back-end (JVM) Internal error: Failed to generate expression: KtNameReferenceExpression
    File being compiled: (2,5) in //Users/<user>/git/kotlin-language-server/server/build/resources/test/completions/BackquotedFunction.kt
    The root cause java.lang.AssertionError was thrown at: org.jetbrains.kotlin.codegen.ExpressionCodegen.visitSimpleNameExpression(ExpressionCodegen.java:1906)
    [Error]     at org.jetbrains.kotlin.codegen.ExpressionCodegen.genQualified(ExpressionCodegen.java:356)
    [Error]     at org.jetbrains.kotlin.codegen.ExpressionCodegen.genStatement(ExpressionCodegen.java:455)
    [Error]     at org.jetbrains.kotlin.codegen.ExpressionCodegen.generateBlock(ExpressionCodegen.java:1336)
    [Error]     at org.jetbrains.kotlin.codegen.ExpressionCodegen.generateBlock(ExpressionCodegen.java:1281)
    [Error]     at org.jetbrains.kotlin.codegen.CodegenStatementVisitor.visitBlockExpression(CodegenStatementVisitor.java:56)
    [Error]     at org.jetbrains.kotlin.codegen.CodegenStatementVisitor.visitBlockExpression(CodegenStatementVisitor.java:22)
    [Error]     at org.jetbrains.kotlin.psi.KtBlockExpression.accept(KtBlockExpression.java:79)
    [Error]     at org.jetbrains.kotlin.codegen.ExpressionCodegen.genQualified(ExpressionCodegen.java:334)
    [Error]     at org.jetbrains.kotlin.codegen.ExpressionCodegen.genStatement(ExpressionCodegen.java:455)
    [Error]     at org.jetbrains.kotlin.codegen.ExpressionCodegen.gen(ExpressionCodegen.java:412)
    [Error]     at org.jetbrains.kotlin.codegen.ExpressionCodegen.returnExpression(ExpressionCodegen.java:1840)
    [Error]     at org.jetbrains.kotlin.codegen.FunctionGenerationStrategy$FunctionDefault.doGenerateBody(FunctionGenerationStrategy.java:64)
    [Error]     at org.jetbrains.kotlin.codegen.FunctionGenerationStrategy$CodegenBased.generateBody(FunctionGenerationStrategy.java:86)
    [Error]     at org.jetbrains.kotlin.codegen.FunctionCodegen.generateMethodBody(FunctionCodegen.java:637)
    [Error]     at org.jetbrains.kotlin.codegen.FunctionCodegen.generateMethodBody(FunctionCodegen.java:481)
    [Error]     at org.jetbrains.kotlin.codegen.FunctionCodegen.generateMethod(FunctionCodegen.java:261)
    [Error]     at org.jetbrains.kotlin.codegen.FunctionCodegen.generateMethod(FunctionCodegen.java:166)
    [Error]     at org.jetbrains.kotlin.codegen.FunctionCodegen.gen(FunctionCodegen.java:137)
    [Error]     at org.jetbrains.kotlin.codegen.MemberCodegen.genSimpleMember(MemberCodegen.java:200)
    [Error]     at org.jetbrains.kotlin.codegen.PackagePartCodegen.generateBody(PackagePartCodegen.java:98)
    [Error]     at org.jetbrains.kotlin.codegen.MemberCodegen.generate(MemberCodegen.java:132)
    [Error]     at org.jetbrains.kotlin.codegen.PackageCodegenImpl.generateFile(PackageCodegenImpl.java:167)
    [Error]     at org.jetbrains.kotlin.codegen.PackageCodegenImpl.generate(PackageCodegenImpl.java:70)
    [Error]     at org.jetbrains.kotlin.codegen.DefaultCodegenFactory.generatePackage(CodegenFactory.kt:143)
    [Error]     at org.jetbrains.kotlin.codegen.DefaultCodegenFactory.invokeLowerings(CodegenFactory.kt:122)
    [Error]     at org.jetbrains.kotlin.codegen.CodegenFactory.generateModule(CodegenFactory.kt:44)
    [Error]     at org.jetbrains.kotlin.codegen.KotlinCodegenFacade.compileCorrectFiles(KotlinCodegenFacade.java:45)
    [Error]     at org.jetbrains.kotlin.codegen.KotlinCodegenFacade.compileCorrectFiles(KotlinCodegenFacade.java:54)
    [Error]     at org.javacs.kt.compiler.Compiler.generateCode(Compiler.kt:580)
    [Error]     at org.javacs.kt.SourcePath.save(SourcePath.kt:277)
    [Error]     at org.javacs.kt.SourcePath.saveAllFiles(SourcePath.kt:289)
    [Error]     at org.javacs.kt.KotlinTextDocumentService$lintAll$1.invoke(KotlinTextDocumentService.kt:270)
    [Error]     at org.javacs.kt.KotlinTextDocumentService$lintAll$1.invoke(KotlinTextDocumentService.kt:268)
    [Error]     at org.javacs.kt.util.Debouncer.submitImmediately$lambda$1(Debouncer.kt:27)
    [Error]     at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
    [Error]     at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
    [Error]     at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:304)
    [Error]     at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
    [Error]     at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
    [Error]     at java.base/java.lang.Thread.run(Thread.java:829)
    [Error] Caused by: java.lang.AssertionError: Couldn't find descriptor for 'fu'
    [Error]     at org.jetbrains.kotlin.codegen.ExpressionCodegen.visitSimpleNameExpression(ExpressionCodegen.java:1906)
    [Error]     at org.jetbrains.kotlin.codegen.ExpressionCodegen.visitSimpleNameExpression(ExpressionCodegen.java:127)
    [Error]     at org.jetbrains.kotlin.psi.KtNameReferenceExpression.accept(KtNameReferenceExpression.kt:59)
    [Error]     at org.jetbrains.kotlin.codegen.CodegenStatementVisitor.visitKtElement(CodegenStatementVisitor.java:31)
    [Error]     at org.jetbrains.kotlin.codegen.CodegenStatementVisitor.visitKtElement(CodegenStatementVisitor.java:22)
    [Error]     at org.jetbrains.kotlin.psi.KtVisitor.visitExpression(KtVisitor.java:186)
    [Error]     at org.jetbrains.kotlin.psi.KtVisitor.visitReferenceExpression(KtVisitor.java:202)
    [Error]     at org.jetbrains.kotlin.psi.KtVisitor.visitSimpleNameExpression(KtVisitor.java:198)
    [Error]     at org.jetbrains.kotlin.psi.KtNameReferenceExpression.accept(KtNameReferenceExpression.kt:59)
    [Error]     at org.jetbrains.kotlin.codegen.ExpressionCodegen.genQualified(ExpressionCodegen.java:334)
    [Error]     ... 39 more
    [Error] org.jetbrains.kotlin.codegen.CompilationException: Back-end (JVM) Internal error: Failed to generate expression: KtNameReferenceExpression
    File being compiled: (4,13) in //Users/<user>/git/kotlin-language-server/server/build/resources/test/completions/Statics.kt
    The root cause java.lang.AssertionError was thrown at: org.jetbrains.kotlin.codegen.ExpressionCodegen.visitSimpleNameExpression(ExpressionCodegen.java:1906)
    [Error]     at org.jetbrains.kotlin.codegen.ExpressionCodegen.genQualified(ExpressionCodegen.java:356)
    [Error]     at org.jetbrains.kotlin.codegen.ExpressionCodegen.genQualified(ExpressionCodegen.java:316)
    [Error]     at org.jetbrains.kotlin.codegen.ExpressionCodegen.visitDotQualifiedExpression(ExpressionCodegen.java:3497)
    [Error]     at org.jetbrains.kotlin.codegen.ExpressionCodegen.visitDotQualifiedExpression(ExpressionCodegen.java:127)
    [Error]     at org.jetbrains.kotlin.psi.KtDotQualifiedExpression.accept(KtDotQualifiedExpression.kt:32)
    [Error]     at org.jetbrains.kotlin.codegen.CodegenStatementVisitor.visitKtElement(CodegenStatementVisitor.java:31)
    [Error]     at org.jetbrains.kotlin.codegen.CodegenStatementVisitor.visitKtElement(CodegenStatementVisitor.java:22)
    [Error]     at org.jetbrains.kotlin.psi.KtVisitor.visitExpression(KtVisitor.java:186)
    [Error]     at org.jetbrains.kotlin.psi.KtVisitor.visitQualifiedExpression(KtVisitor.java:290)
    [Error]     at org.jetbrains.kotlin.psi.KtVisitor.visitDotQualifiedExpression(KtVisitor.java:306)
    [Error]     at org.jetbrains.kotlin.psi.KtDotQualifiedExpression.accept(KtDotQualifiedExpression.kt:32)
    [Error]     at org.jetbrains.kotlin.codegen.ExpressionCodegen.genQualified(ExpressionCodegen.java:334)
    [Error]     at org.jetbrains.kotlin.codegen.ExpressionCodegen.genStatement(ExpressionCodegen.java:455)
    [Error]     at org.jetbrains.kotlin.codegen.ExpressionCodegen.generateBlock(ExpressionCodegen.java:1336)
    [Error]     at org.jetbrains.kotlin.codegen.ExpressionCodegen.generateBlock(ExpressionCodegen.java:1281)
    [Error]     at org.jetbrains.kotlin.codegen.CodegenStatementVisitor.visitBlockExpression(CodegenStatementVisitor.java:56)
    [Error]     at org.jetbrains.kotlin.codegen.CodegenStatementVisitor.visitBlockExpression(CodegenStatementVisitor.java:22)
    [Error]     at org.jetbrains.kotlin.psi.KtBlockExpression.accept(KtBlockExpression.java:79)
    [Error]     at org.jetbrains.kotlin.codegen.ExpressionCodegen.genQualified(ExpressionCodegen.java:334)
    [Error]     at org.jetbrains.kotlin.codegen.ExpressionCodegen.genStatement(ExpressionCodegen.java:455)
    [Error]     at org.jetbrains.kotlin.codegen.ExpressionCodegen.gen(ExpressionCodegen.java:412)
    [Error]     at org.jetbrains.kotlin.codegen.ExpressionCodegen.returnExpression(ExpressionCodegen.java:1840)
    [Error]     at org.jetbrains.kotlin.codegen.FunctionGenerationStrategy$FunctionDefault.doGenerateBody(FunctionGenerationStrategy.java:64)
    [Error]     at org.jetbrains.kotlin.codegen.FunctionGenerationStrategy$CodegenBased.generateBody(FunctionGenerationStrategy.java:86)
    [Error]     at org.jetbrains.kotlin.codegen.FunctionCodegen.generateMethodBody(FunctionCodegen.java:637)
    [Error]     at org.jetbrains.kotlin.codegen.FunctionCodegen.generateMethodBody(FunctionCodegen.java:481)
    [Error]     at org.jetbrains.kotlin.codegen.FunctionCodegen.generateMethod(FunctionCodegen.java:261)
    [Error]     at org.jetbrains.kotlin.codegen.FunctionCodegen.generateMethod(FunctionCodegen.java:166)
    [Error]     at org.jetbrains.kotlin.codegen.FunctionCodegen.gen(FunctionCodegen.java:137)
    [Error]     at org.jetbrains.kotlin.codegen.MemberCodegen.genSimpleMember(MemberCodegen.java:200)
    [Error]     at org.jetbrains.kotlin.codegen.PackagePartCodegen.generateBody(PackagePartCodegen.java:98)
    [Error]     at org.jetbrains.kotlin.codegen.MemberCodegen.generate(MemberCodegen.java:132)
    [Error]     at org.jetbrains.kotlin.codegen.PackageCodegenImpl.generateFile(PackageCodegenImpl.java:167)
    [Error]     at org.jetbrains.kotlin.codegen.PackageCodegenImpl.generate(PackageCodegenImpl.java:70)
    [Error]     at org.jetbrains.kotlin.codegen.DefaultCodegenFactory.generatePackage(CodegenFactory.kt:143)
    [Error]     at org.jetbrains.kotlin.codegen.DefaultCodegenFactory.invokeLowerings(CodegenFactory.kt:122)
    [Error]     at org.jetbrains.kotlin.codegen.CodegenFactory.generateModule(CodegenFactory.kt:44)
    [Error]     at org.jetbrains.kotlin.codegen.KotlinCodegenFacade.compileCorrectFiles(KotlinCodegenFacade.java:45)
    [Error]     at org.jetbrains.kotlin.codegen.KotlinCodegenFacade.compileCorrectFiles(KotlinCodegenFacade.java:54)
    [Error]     at org.javacs.kt.compiler.Compiler.generateCode(Compiler.kt:580)
    [Error]     at org.javacs.kt.SourcePath.save(SourcePath.kt:277)
    [Error]     at org.javacs.kt.SourcePath.saveAllFiles(SourcePath.kt:289)
    [Error]     at org.javacs.kt.KotlinTextDocumentService$lintAll$1.invoke(KotlinTextDocumentService.kt:270)
    [Error]     at org.javacs.kt.KotlinTextDocumentService$lintAll$1.invoke(KotlinTextDocumentService.kt:268)
    [Error]     at org.javacs.kt.util.Debouncer.submitImmediately$lambda$1(Debouncer.kt:27)
    [Error]     at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
    [Error]     at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
    [Error]     at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:304)
    [Error]     at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
    [Error]     at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
    [Error]     at java.base/java.lang.Thread.run(Thread.java:829)
    [Error] Caused by: java.lang.AssertionError: Couldn't find descriptor for 'isN'
    [Error]     at org.jetbrains.kotlin.codegen.ExpressionCodegen.visitSimpleNameExpression(ExpressionCodegen.java:1906)
    [Error]     at org.jetbrains.kotlin.codegen.ExpressionCodegen.visitSimpleNameExpression(ExpressionCodegen.java:127)
    [Error]     at org.jetbrains.kotlin.psi.KtNameReferenceExpression.accept(KtNameReferenceExpression.kt:59)
    [Error]     at org.jetbrains.kotlin.codegen.ExpressionCodegen.genQualified(ExpressionCodegen.java:334)
    [Error]     ... 50 more
    [Info] ..ounce126Linting .../completions/When.kt
    [Info] ..ounce126Reported 1 diagnostics in .../completions/When.kt
    [Info] async495  Completing at .../completions/When.kt 9:24

The codegen is invoked here:

https://github.com/fwcd/kotlin-language-server/blob/ba6672023bddb1d118ee34329e6fceb551a53b2f/server/src/main/kotlin/org/javacs/kt/SourcePath.kt#L272-L283

@daplf From what I can tell, you've added this for the JDT.LS extension, any thoughts? My best guess would be that a lot of internals changed due to the IR-based JVM backend.

fwcd avatar Oct 03 '23 13:10 fwcd

Looks like these errors are thrown mostly when the syntax tree is already broken (and apparently therefore contains nulls), e.g. fu in this test resource:

https://github.com/fwcd/kotlin-language-server/blob/8f96c293caf6dd040539d33e05a5d26f427a4a70/server/src/test/resources/completions/BackquotedFunction.kt#L1-L3

fwcd avatar Oct 03 '23 17:10 fwcd

@fwcd Thanks for the heads up! I hope to find some time to look at this soon. I like your idea here though:

daplf avatar Oct 03 '23 21:10 daplf

Yeah, that fixes some of the errors, but not all unfortunately. Feel free to dig deeper if you find the time, that branch contained a few experiments in that direction.

fwcd avatar Oct 03 '23 23:10 fwcd

Not sure if this is related, but it is a CompilationException so I figured I'd post it here.

I'm getting this with both the 1.3.7 version downloaded automatically by the VSCode extension, and with a server built from from a7bc925 (1.3.5), so the cause for my issue may not be the Kotlin version as I believe that was changed in 1.3.6.

Click below for the error message.

Details

The root cause java.lang.IllegalStateException was thrown at: org.jetbrains.kotlin.codegen.state.KotlinTypeMapper$typeMappingConfiguration$1.processErrorType(KotlinTypeMapper.kt:124) [Error - 4:39:19 PM] at org.jetbrains.kotlin.codegen.MemberCodegen.genSimpleMember(MemberCodegen.java:217) [Error - 4:39:19 PM] at org.jetbrains.kotlin.codegen.ClassBodyCodegen.generateDeclaration(ClassBodyCodegen.java:170) [Error - 4:39:19 PM] at org.jetbrains.kotlin.codegen.ClassBodyCodegen.generateBody(ClassBodyCodegen.java:88) [Error - 4:39:19 PM] at org.jetbrains.kotlin.codegen.MemberCodegen.generate(MemberCodegen.java:132) [Error - 4:39:19 PM] at org.jetbrains.kotlin.codegen.MemberCodegen.genClassOrObject(MemberCodegen.java:305) [Error - 4:39:19 PM] at org.jetbrains.kotlin.codegen.MemberCodegen.genClassOrObject(MemberCodegen.java:289) [Error - 4:39:19 PM] at org.jetbrains.kotlin.codegen.PackageCodegenImpl.generateClassesAndObjectsInFile(PackageCodegenImpl.java:119) [Error - 4:39:19 PM] at org.jetbrains.kotlin.codegen.PackageCodegenImpl.generateFile(PackageCodegenImpl.java:138) [Error - 4:39:19 PM] at org.jetbrains.kotlin.codegen.PackageCodegenImpl.generate(PackageCodegenImpl.java:70) [Error - 4:39:19 PM] at org.jetbrains.kotlin.codegen.DefaultCodegenFactory.generatePackage(CodegenFactory.kt:143) [Error - 4:39:19 PM] at org.jetbrains.kotlin.codegen.DefaultCodegenFactory.invokeLowerings(CodegenFactory.kt:122) [Error - 4:39:19 PM] at org.jetbrains.kotlin.codegen.CodegenFactory.generateModule(CodegenFactory.kt:44) [Error - 4:39:19 PM] at org.jetbrains.kotlin.codegen.KotlinCodegenFacade.compileCorrectFiles(KotlinCodegenFacade.java:45) [Error - 4:39:19 PM] at org.jetbrains.kotlin.codegen.KotlinCodegenFacade.compileCorrectFiles(KotlinCodegenFacade.java:54) [Error - 4:39:19 PM] at org.javacs.kt.compiler.Compiler.generateCode(Compiler.kt:580) [Error - 4:39:19 PM] at org.javacs.kt.SourcePath.save(SourcePath.kt:277) [Error - 4:39:19 PM] at org.javacs.kt.SourcePath.saveAllFiles(SourcePath.kt:289) [Error - 4:39:19 PM] at org.javacs.kt.KotlinTextDocumentService$lintAll$1.invoke(KotlinTextDocumentService.kt:270) [Error - 4:39:19 PM] at org.javacs.kt.KotlinTextDocumentService$lintAll$1.invoke(KotlinTextDocumentService.kt:268) [Error - 4:39:19 PM] at org.javacs.kt.util.Debouncer.submitImmediately$lambda$1(Debouncer.kt:27) [Error - 4:39:19 PM] at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539) [Error - 4:39:19 PM] at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) [Error - 4:39:19 PM] at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:304) [Error - 4:39:19 PM] at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) [Error - 4:39:19 PM] at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) [Error - 4:39:19 PM] at java.base/java.lang.Thread.run(Thread.java:840) [Error - 4:39:19 PM] Caused by: java.lang.IllegalStateException: Error type encountered: [Error type: Unresolved type for MethodChannel] (ErrorType). [Error - 4:39:19 PM] at org.jetbrains.kotlin.codegen.state.KotlinTypeMapper$typeMappingConfiguration$1.processErrorType(KotlinTypeMapper.kt:124) [Error - 4:39:19 PM] at org.jetbrains.kotlin.load.kotlin.DescriptorBasedTypeSignatureMappingKt.mapType(descriptorBasedTypeSignatureMapping.kt:83) [Error - 4:39:19 PM] at org.jetbrains.kotlin.codegen.state.KotlinTypeMapper.mapType(KotlinTypeMapper.kt:276) [Error - 4:39:19 PM] at org.jetbrains.kotlin.codegen.state.KotlinTypeMapper.mapType$default(KotlinTypeMapper.kt:267) [Error - 4:39:19 PM] at org.jetbrains.kotlin.codegen.state.KotlinTypeMapper.mapType(KotlinTypeMapper.kt) [Error - 4:39:19 PM] at org.jetbrains.kotlin.codegen.PropertyCodegen.generateBackingField(PropertyCodegen.java:409) [Error - 4:39:19 PM] at org.jetbrains.kotlin.codegen.PropertyCodegen.generateBackingField(PropertyCodegen.java:360) [Error - 4:39:19 PM] at org.jetbrains.kotlin.codegen.PropertyCodegen.genBackingFieldAndAnnotations(PropertyCodegen.java:170) [Error - 4:39:19 PM] at org.jetbrains.kotlin.codegen.PropertyCodegen.gen(PropertyCodegen.java:138) [Error - 4:39:19 PM] at org.jetbrains.kotlin.codegen.PropertyCodegen.gen(PropertyCodegen.java:101) [Error - 4:39:19 PM] at org.jetbrains.kotlin.codegen.MemberCodegen.genSimpleMember(MemberCodegen.java:211) [Error - 4:39:19 PM] ... 25 more

This is a gradle project that is part of a flutter plugin, and it seems that the error occurs during code generation for the MethodChannel, which is a class provided by flutter. Apologies if this is not actually related. I'll open a separate issue in that case.

derpda avatar Jan 05 '24 07:01 derpda

I have gated code generation behind the kotlin.codegen.enabled option for now, to avoid spamming users with exceptions. This unfortunately also means that Java interop will require setting this option, but given that compilation fails pretty frequently, I am not sure how reliable it worked on recent Kotlin versions anyway.

Once we figure out how to make this more stable, I would be more than happy to enable codegen by default again.

fwcd avatar Jul 29 '24 00:07 fwcd