From 7d62e3ce567bb39fd8f85d8f835221a041b719d6 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Tue, 10 Dec 2019 12:11:33 +0300 Subject: [PATCH] FIR: fix hasTopLevelClassOf optimization in deserialized provider Before this commit, we answered 'no top level class' if Java class finder could not calculate known class names. However, it's incorrect, because this situation means 'don't actually know'. To precise semantics, function name was also inverted --- .../KotlinDeserializedJvmSymbolsProvider.kt | 10 ++++++---- .../fir/multiModule/withStdlib/jvm_dep(stdlib)/Some.kt | 1 + .../multiModule/withStdlib/jvm_dep(stdlib)/Some.txt | 3 +++ .../idea/fir/FirMultiModuleResolveTestGenerated.java | 5 +++++ 4 files changed, 15 insertions(+), 4 deletions(-) create mode 100644 idea/testData/fir/multiModule/withStdlib/jvm_dep(stdlib)/Some.kt create mode 100644 idea/testData/fir/multiModule/withStdlib/jvm_dep(stdlib)/Some.txt diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/deserialization/KotlinDeserializedJvmSymbolsProvider.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/deserialization/KotlinDeserializedJvmSymbolsProvider.kt index ea0005265b3..d7126e474b1 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/deserialization/KotlinDeserializedJvmSymbolsProvider.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/deserialization/KotlinDeserializedJvmSymbolsProvider.kt @@ -88,18 +88,20 @@ class KotlinDeserializedJvmSymbolsProvider( private val knownClassNamesInPackage = mutableMapOf?>() - private fun hasTopLevelClassOf(classId: ClassId): Boolean { + // This function returns true if we are sure that no top-level class with this id is available + // If it returns false, it means we can say nothing about this id + private fun hasNoTopLevelClassOf(classId: ClassId): Boolean { val knownNames = knownClassNamesInPackage.getOrPut(classId.packageFqName) { javaClassFinder.knownClassNamesInPackage(classId.packageFqName) } ?: return false - return classId.relativeClassName.topLevelName() in knownNames + return classId.relativeClassName.topLevelName() !in knownNames } private fun computePackagePartsInfos(packageFqName: FqName): List { return packagePartProvider.findPackageParts(packageFqName.asString()).mapNotNull { partName -> val classId = ClassId.topLevel(JvmClassName.byInternalName(partName).fqNameForTopLevelClassMaybeWithDollars) - if (!hasTopLevelClassOf(classId)) return@mapNotNull null + if (hasNoTopLevelClassOf(classId)) return@mapNotNull null val kotlinJvmBinaryClass = kotlinClassFinder.findKotlinClass(classId) ?: return@mapNotNull null val header = kotlinJvmBinaryClass.classHeader @@ -308,7 +310,7 @@ class KotlinDeserializedJvmSymbolsProvider( classId: ClassId, parentContext: FirDeserializationContext? = null ): FirRegularClassSymbol? { - if (!hasTopLevelClassOf(classId)) return null + if (hasNoTopLevelClassOf(classId)) return null if (classesCache.containsKey(classId)) return classesCache[classId] if (classId in handledByJava) return null diff --git a/idea/testData/fir/multiModule/withStdlib/jvm_dep(stdlib)/Some.kt b/idea/testData/fir/multiModule/withStdlib/jvm_dep(stdlib)/Some.kt new file mode 100644 index 00000000000..919b8e65426 --- /dev/null +++ b/idea/testData/fir/multiModule/withStdlib/jvm_dep(stdlib)/Some.kt @@ -0,0 +1 @@ +val someList = listOf(1, 2, 3) \ No newline at end of file diff --git a/idea/testData/fir/multiModule/withStdlib/jvm_dep(stdlib)/Some.txt b/idea/testData/fir/multiModule/withStdlib/jvm_dep(stdlib)/Some.txt new file mode 100644 index 00000000000..58772865a94 --- /dev/null +++ b/idea/testData/fir/multiModule/withStdlib/jvm_dep(stdlib)/Some.txt @@ -0,0 +1,3 @@ +FILE: Some.kt + public final val someList: R|kotlin/collections/List| = R|kotlin/collections/listOf|(Int(1), Int(2), Int(3)) + public get(): R|kotlin/collections/List| diff --git a/idea/tests/org/jetbrains/kotlin/idea/fir/FirMultiModuleResolveTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/fir/FirMultiModuleResolveTestGenerated.java index 8e36db910a1..b7855837183 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/fir/FirMultiModuleResolveTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/fir/FirMultiModuleResolveTestGenerated.java @@ -122,4 +122,9 @@ public class FirMultiModuleResolveTestGenerated extends AbstractFirMultiModuleRe public void testOverrideWithJava() throws Exception { runTest("idea/testData/fir/multiModule/overrideWithJava/"); } + + @TestMetadata("withStdlib") + public void testWithStdlib() throws Exception { + runTest("idea/testData/fir/multiModule/withStdlib/"); + } }