fwcd / kotlin-language-server

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

Dependency module <dependencies of main> was not initialized by the time contents of dependent module <dependencies of main> were queried #542

Open fwcd opened 6 months ago

fwcd commented 6 months ago

Every now and then the tests spuriously fail with this error:

org.javacs.kt.EditFunctionTest > edit a function in a script FAILED
    java.lang.AssertionError: Dependency module <dependencies of main> was not initialized by the time contents of dependent module <dependencies of main> were queried
Full stack trace (click to expand) ``` org.javacs.kt.EditFunctionTest > edit a function in a script FAILED java.lang.AssertionError: Dependency module was not initialized by the time contents of dependent module were queried at org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl$packageFragmentProviderForWholeModuleWithDependencies$2.invoke(ModuleDescriptorImpl.kt:96) at org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl$packageFragmentProviderForWholeModuleWithDependencies$2.invoke(ModuleDescriptorImpl.kt:90) at kotlin.SynchronizedLazyImpl.getValue(LazyJVM.kt:74) at org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl.getPackageFragmentProviderForWholeModuleWithDependencies(ModuleDescriptorImpl.kt:90) at org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl.getPackageFragmentProvider(ModuleDescriptorImpl.kt:151) at org.jetbrains.kotlin.descriptors.impl.LazyPackageViewDescriptorImpl$empty$2.invoke(LazyPackageViewDescriptorImpl.kt:39) at org.jetbrains.kotlin.descriptors.impl.LazyPackageViewDescriptorImpl$empty$2.invoke(LazyPackageViewDescriptorImpl.kt:38) at org.jetbrains.kotlin.storage.LockBasedStorageManager$LockBasedLazyValue.invoke(LockBasedStorageManager.java:408) at org.jetbrains.kotlin.storage.LockBasedStorageManager$LockBasedNotNullLazyValue.invoke(LockBasedStorageManager.java:527) at org.jetbrains.kotlin.storage.StorageKt.getValue(storage.kt:42) at org.jetbrains.kotlin.descriptors.impl.LazyPackageViewDescriptorImpl.getEmpty(LazyPackageViewDescriptorImpl.kt:38) at org.jetbrains.kotlin.descriptors.impl.LazyPackageViewDescriptorImpl.isEmpty(LazyPackageViewDescriptorImpl.kt:42) at org.jetbrains.kotlin.cli.jvm.compiler.CliKotlinAsJavaSupport.packageExists(CliKotlinAsJavaSupport.kt:86) at org.jetbrains.kotlin.asJava.finder.KtLightPackage.isValid(KtLightPackage.java:35) at com.intellij.psi.util.PsiUtilCore.ensureValid(PsiUtilCore.java:470) at com.intellij.psi.impl.source.resolve.ResolveCache.ensureValidPsi(ResolveCache.java:273) at com.intellij.psi.impl.source.resolve.ResolveCache.ensureValidResults(ResolveCache.java:266) at com.intellij.psi.impl.source.resolve.ResolveCache.resolve(ResolveCache.java:243) at com.intellij.psi.impl.source.resolve.ResolveCache.resolveWithCaching(ResolveCache.java:184) at com.intellij.psi.impl.source.tree.java.PsiReferenceExpressionImpl$OurGenericsResolver$1.elementFinished(PsiReferenceExpressionImpl.java:222) at com.intellij.psi.JavaRecursiveElementWalkingVisitor$1.elementFinished(JavaRecursiveElementWalkingVisitor.java:35) at com.intellij.psi.JavaRecursiveElementWalkingVisitor$1.elementFinished(JavaRecursiveElementWalkingVisitor.java:32) at com.intellij.util.WalkingState.next(WalkingState.java:94) at com.intellij.util.WalkingState.walkChildren(WalkingState.java:58) at com.intellij.util.WalkingState.elementStarted(WalkingState.java:49) at com.intellij.psi.PsiWalkingState.elementStarted(PsiWalkingState.java:76) at com.intellij.psi.JavaRecursiveElementWalkingVisitor.visitElement(JavaRecursiveElementWalkingVisitor.java:41) at com.intellij.psi.impl.source.tree.java.PsiReferenceExpressionImpl$OurGenericsResolver$1.visitReferenceExpression(PsiReferenceExpressionImpl.java:215) at com.intellij.psi.impl.source.tree.java.PsiReferenceExpressionImpl.accept(PsiReferenceExpressionImpl.java:777) at com.intellij.psi.impl.source.tree.java.PsiReferenceExpressionImpl$OurGenericsResolver.resolveAllQualifiers(PsiReferenceExpressionImpl.java:205) at com.intellij.psi.impl.source.tree.java.PsiReferenceExpressionImpl$OurGenericsResolver.resolve(PsiReferenceExpressionImpl.java:182) at com.intellij.psi.impl.source.tree.java.PsiReferenceExpressionImpl$OurGenericsResolver.resolve(PsiReferenceExpressionImpl.java:173) at com.intellij.psi.impl.source.resolve.ResolveCache.lambda$resolveWithCaching$2(ResolveCache.java:184) at com.intellij.openapi.util.Computable.get(Computable.java:18) at com.intellij.psi.impl.source.resolve.ResolveCache.lambda$loggingResolver$4(ResolveCache.java:260) at com.intellij.openapi.util.RecursionManager$1.computePreventingRecursion(RecursionManager.java:114) at com.intellij.openapi.util.RecursionGuard.doPreventingRecursion(RecursionGuard.java:44) at com.intellij.openapi.util.RecursionManager.doPreventingRecursion(RecursionManager.java:68) at com.intellij.psi.impl.source.resolve.ResolveCache.resolve(ResolveCache.java:237) at org.javacs.kt.completion.CompletionsKt.explodeConstructors(Completions.kt:503) at org.javacs.kt.completion.CompletionsKt.access$explodeConstructors(Completions.kt:1) at org.javacs.kt.completion.CompletionsKt$identifiers$2.invoke(Completions.kt:491) at org.javacs.kt.completion.CompletionsKt$identifiers$2.invoke(Completions.kt:491) at kotlin.sequences.FlatteningSequence$iterator$1.ensureItemIterator(Sequences.kt:315) at kotlin.sequences.FlatteningSequence$iterator$1.hasNext(Sequences.kt:303) at kotlin.sequences.FilteringSequence$iterator$1.calcNext(Sequences.kt:169) at kotlin.sequences.FilteringSequence$iterator$1.hasNext(Sequences.kt:194) at kotlin.sequences.SequencesKt___SequencesKt.toCollection(_Sequences.kt:787) at kotlin.sequences.SequencesKt___SequencesKt.toMutableList(_Sequences.kt:826) at kotlin.sequences.SequencesKt___SequencesKt$sortedWith$1.iterator(_Sequences.kt:638) at kotlin.sequences.FilteringSequence$iterator$1.(Sequences.kt:164) at kotlin.sequences.FilteringSequence.iterator(Sequences.kt:163) at kotlin.sequences.TransformingSequence$iterator$1.(Sequences.kt:208) at kotlin.sequences.TransformingSequence.iterator(Sequences.kt:207) at kotlin.sequences.SequencesKt___SequencesKt.toList(_Sequences.kt:808) at org.javacs.kt.completion.CompletionsKt.completions(Completions.kt:65) at org.javacs.kt.KotlinTextDocumentService$completion$1.invoke(KotlinTextDocumentService.kt:156) at org.javacs.kt.KotlinTextDocumentService$completion$1.invoke(KotlinTextDocumentService.kt:151) at org.javacs.kt.util.AsyncExecutor.compute$lambda$2(AsyncExecutor.kt:19) at java.base/java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1768) 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:840) ```

Since it looks like a race condition, we should investigate whether this is an issue with the language server or the Kotlin compiler.

fwcd commented 6 months ago

This test repeatedly triggered the issue:

https://github.com/fwcd/kotlin-language-server/blob/a18cd788a23738812a09ff1a42ddfc4f2eaf284f/server/src/test/kotlin/org/javacs/kt/HoverTest.kt#L56-L57

Therefore it might be a good starting point to investigate this.