From 3ce980fd88a5ce93022f838ae71d209a0c3d08b4 Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Tue, 30 Jun 2020 18:17:17 +0300 Subject: [PATCH] Fix incremental compilation for calls to inner classes from supertypes The problem became actual after 8c2baf0704aaeca3fba9828f87b9ffbf344b848c --- .../IncrementalJsCompilerRunnerTestGenerated.java | 5 +++++ ...JsCompilerRunnerWithMetadataOnlyTestGenerated.java | 5 +++++ .../IncrementalJsKlibCompilerRunnerTestGenerated.java | 5 +++++ ...CompilerWithScopeExpansionRunnerTestGenerated.java | 5 +++++ .../IncrementalJvmCompilerRunnerTestGenerated.java | 5 +++++ .../IrIncrementalJvmCompilerRunnerTestGenerated.java | 5 +++++ .../MetadataPackageFragmentProvider.kt | 1 + .../descriptors/DeserializedClassDescriptor.kt | 7 +++++++ .../descriptors/DeserializedMemberScope.kt | 9 ++++++++- .../descriptors/DeserializedPackageMemberScope.kt | 1 + .../jps/build/IncrementalJvmJpsTestGenerated.java | 5 +++++ .../pureKotlin/innerClassesFromSupertypes/a.kt | 7 +++++++ .../pureKotlin/innerClassesFromSupertypes/b.kt | 6 ++++++ .../pureKotlin/innerClassesFromSupertypes/b.kt.touch | 0 .../pureKotlin/innerClassesFromSupertypes/build.log | 11 +++++++++++ .../pureKotlin/innerClassesFromSupertypes/usage.kt | 5 +++++ 16 files changed, 81 insertions(+), 1 deletion(-) create mode 100644 jps-plugin/testData/incremental/pureKotlin/innerClassesFromSupertypes/a.kt create mode 100644 jps-plugin/testData/incremental/pureKotlin/innerClassesFromSupertypes/b.kt create mode 100644 jps-plugin/testData/incremental/pureKotlin/innerClassesFromSupertypes/b.kt.touch create mode 100644 jps-plugin/testData/incremental/pureKotlin/innerClassesFromSupertypes/build.log create mode 100644 jps-plugin/testData/incremental/pureKotlin/innerClassesFromSupertypes/usage.kt diff --git a/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/IncrementalJsCompilerRunnerTestGenerated.java b/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/IncrementalJsCompilerRunnerTestGenerated.java index 4a2701830c5..77389396c57 100644 --- a/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/IncrementalJsCompilerRunnerTestGenerated.java +++ b/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/IncrementalJsCompilerRunnerTestGenerated.java @@ -310,6 +310,11 @@ public class IncrementalJsCompilerRunnerTestGenerated extends AbstractIncrementa runTest("jps-plugin/testData/incremental/pureKotlin/inlineUsedWhereDeclared/"); } + @TestMetadata("innerClassesFromSupertypes") + public void testInnerClassesFromSupertypes() throws Exception { + runTest("jps-plugin/testData/incremental/pureKotlin/innerClassesFromSupertypes/"); + } + @TestMetadata("internalClassChanged") public void testInternalClassChanged() throws Exception { runTest("jps-plugin/testData/incremental/pureKotlin/internalClassChanged/"); diff --git a/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/IncrementalJsCompilerRunnerWithMetadataOnlyTestGenerated.java b/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/IncrementalJsCompilerRunnerWithMetadataOnlyTestGenerated.java index a28726ef75e..8ffd5078d1b 100644 --- a/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/IncrementalJsCompilerRunnerWithMetadataOnlyTestGenerated.java +++ b/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/IncrementalJsCompilerRunnerWithMetadataOnlyTestGenerated.java @@ -310,6 +310,11 @@ public class IncrementalJsCompilerRunnerWithMetadataOnlyTestGenerated extends Ab runTest("jps-plugin/testData/incremental/pureKotlin/inlineUsedWhereDeclared/"); } + @TestMetadata("innerClassesFromSupertypes") + public void testInnerClassesFromSupertypes() throws Exception { + runTest("jps-plugin/testData/incremental/pureKotlin/innerClassesFromSupertypes/"); + } + @TestMetadata("internalClassChanged") public void testInternalClassChanged() throws Exception { runTest("jps-plugin/testData/incremental/pureKotlin/internalClassChanged/"); diff --git a/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/IncrementalJsKlibCompilerRunnerTestGenerated.java b/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/IncrementalJsKlibCompilerRunnerTestGenerated.java index e81580fc31f..a209b922641 100644 --- a/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/IncrementalJsKlibCompilerRunnerTestGenerated.java +++ b/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/IncrementalJsKlibCompilerRunnerTestGenerated.java @@ -312,6 +312,11 @@ public class IncrementalJsKlibCompilerRunnerTestGenerated extends AbstractIncrem runTest("jps-plugin/testData/incremental/pureKotlin/inlineUsedWhereDeclared/"); } + @TestMetadata("innerClassesFromSupertypes") + public void testInnerClassesFromSupertypes() throws Exception { + runTest("jps-plugin/testData/incremental/pureKotlin/innerClassesFromSupertypes/"); + } + @TestMetadata("internalClassChanged") public void testInternalClassChanged() throws Exception { runTest("jps-plugin/testData/incremental/pureKotlin/internalClassChanged/"); diff --git a/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/IncrementalJsKlibCompilerWithScopeExpansionRunnerTestGenerated.java b/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/IncrementalJsKlibCompilerWithScopeExpansionRunnerTestGenerated.java index cfb04706264..ea168c53f62 100644 --- a/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/IncrementalJsKlibCompilerWithScopeExpansionRunnerTestGenerated.java +++ b/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/IncrementalJsKlibCompilerWithScopeExpansionRunnerTestGenerated.java @@ -310,6 +310,11 @@ public class IncrementalJsKlibCompilerWithScopeExpansionRunnerTestGenerated exte runTest("jps-plugin/testData/incremental/pureKotlin/inlineUsedWhereDeclared/"); } + @TestMetadata("innerClassesFromSupertypes") + public void testInnerClassesFromSupertypes() throws Exception { + runTest("jps-plugin/testData/incremental/pureKotlin/innerClassesFromSupertypes/"); + } + @TestMetadata("internalClassChanged") public void testInternalClassChanged() throws Exception { runTest("jps-plugin/testData/incremental/pureKotlin/internalClassChanged/"); diff --git a/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/IncrementalJvmCompilerRunnerTestGenerated.java b/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/IncrementalJvmCompilerRunnerTestGenerated.java index 0bd864c086b..155bdf7694c 100644 --- a/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/IncrementalJvmCompilerRunnerTestGenerated.java +++ b/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/IncrementalJvmCompilerRunnerTestGenerated.java @@ -311,6 +311,11 @@ public class IncrementalJvmCompilerRunnerTestGenerated extends AbstractIncrement runTest("jps-plugin/testData/incremental/pureKotlin/inlineUsedWhereDeclared/"); } + @TestMetadata("innerClassesFromSupertypes") + public void testInnerClassesFromSupertypes() throws Exception { + runTest("jps-plugin/testData/incremental/pureKotlin/innerClassesFromSupertypes/"); + } + @TestMetadata("internalClassChanged") public void testInternalClassChanged() throws Exception { runTest("jps-plugin/testData/incremental/pureKotlin/internalClassChanged/"); diff --git a/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/IrIncrementalJvmCompilerRunnerTestGenerated.java b/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/IrIncrementalJvmCompilerRunnerTestGenerated.java index 73b139fc3bf..45c6023e888 100644 --- a/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/IrIncrementalJvmCompilerRunnerTestGenerated.java +++ b/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/IrIncrementalJvmCompilerRunnerTestGenerated.java @@ -311,6 +311,11 @@ public class IrIncrementalJvmCompilerRunnerTestGenerated extends AbstractIrIncre runTest("jps-plugin/testData/incremental/pureKotlin/inlineUsedWhereDeclared/"); } + @TestMetadata("innerClassesFromSupertypes") + public void testInnerClassesFromSupertypes() throws Exception { + runTest("jps-plugin/testData/incremental/pureKotlin/innerClassesFromSupertypes/"); + } + @TestMetadata("internalClassChanged") public void testInternalClassChanged() throws Exception { runTest("jps-plugin/testData/incremental/pureKotlin/internalClassChanged/"); diff --git a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/MetadataPackageFragmentProvider.kt b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/MetadataPackageFragmentProvider.kt index 61b63f2ab97..06f1c5cec37 100644 --- a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/MetadataPackageFragmentProvider.kt +++ b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/MetadataPackageFragmentProvider.kt @@ -126,6 +126,7 @@ class MetadataPackageFragment( override fun hasClass(name: Name): Boolean = hasTopLevelClass(name) override fun definitelyDoesNotContainName(name: Name) = false override fun getClassifierNames(): Set? = null + override fun getNonDeclaredClassifierNames(): Set? = null }) return ChainedMemberScope.create("Metadata scope", scopes) diff --git a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedClassDescriptor.kt b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedClassDescriptor.kt index 2ffdbee5e11..367c64998ef 100644 --- a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedClassDescriptor.kt +++ b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedClassDescriptor.kt @@ -30,6 +30,7 @@ import org.jetbrains.kotlin.types.SimpleType import org.jetbrains.kotlin.types.TypeConstructor import org.jetbrains.kotlin.types.checker.KotlinTypeRefiner import org.jetbrains.kotlin.types.refinement.TypeRefinement +import org.jetbrains.kotlin.utils.addToStdlib.flatMapToNullable import java.util.* class DeserializedClassDescriptor( @@ -307,6 +308,12 @@ class DeserializedClassDescriptor( } } + override fun getNonDeclaredClassifierNames(): Set? { + return classDescriptor.typeConstructor.supertypes.flatMapToNullable(LinkedHashSet()) { + it.memberScope.getClassifierNames() + } + } + override fun getContributedClassifier(name: Name, location: LookupLocation): ClassifierDescriptor? { recordLookup(name, location) classDescriptor.enumEntries?.findEnumEntry(name)?.let { return it } diff --git a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedMemberScope.kt b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedMemberScope.kt index b72a69dbbb4..10da71163ef 100644 --- a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedMemberScope.kt +++ b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedMemberScope.kt @@ -81,9 +81,15 @@ abstract class DeserializedMemberScope protected constructor( internal val classNames by c.storageManager.createLazyValue { classNames().toSet() } + + private val classifierNamesLazy = c.storageManager.createNullableLazyValue { + val nonDeclaredNames = getNonDeclaredClassifierNames() ?: return@createNullableLazyValue null + this.classNames + typeAliasNames + nonDeclaredNames + } + override fun getFunctionNames() = functionNamesLazy override fun getVariableNames() = variableNamesLazy - override fun getClassifierNames(): Set? = classNames + typeAliasNames + override fun getClassifierNames(): Set? = classifierNamesLazy() override fun definitelyDoesNotContainName(name: Name): Boolean { return name !in functionNamesLazy && name !in variableNamesLazy && name !in classNames && name !in typeAliasNames @@ -256,6 +262,7 @@ abstract class DeserializedMemberScope protected constructor( protected abstract fun getNonDeclaredFunctionNames(): Set protected abstract fun getNonDeclaredVariableNames(): Set + protected abstract fun getNonDeclaredClassifierNames(): Set? protected abstract fun addEnumEntryDescriptors(result: MutableCollection, nameFilter: (Name) -> Boolean) diff --git a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedPackageMemberScope.kt b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedPackageMemberScope.kt index 5fa0bfb02cc..7d29bec637a 100644 --- a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedPackageMemberScope.kt +++ b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedPackageMemberScope.kt @@ -69,6 +69,7 @@ open class DeserializedPackageMemberScope( override fun getNonDeclaredFunctionNames(): Set = emptySet() override fun getNonDeclaredVariableNames(): Set = emptySet() + override fun getNonDeclaredClassifierNames(): Set? = emptySet() override fun addEnumEntryDescriptors(result: MutableCollection, nameFilter: (Name) -> Boolean) { // Do nothing diff --git a/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jps/build/IncrementalJvmJpsTestGenerated.java b/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jps/build/IncrementalJvmJpsTestGenerated.java index 1970a40fd73..ce4a23d642c 100644 --- a/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jps/build/IncrementalJvmJpsTestGenerated.java +++ b/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jps/build/IncrementalJvmJpsTestGenerated.java @@ -979,6 +979,11 @@ public class IncrementalJvmJpsTestGenerated extends AbstractIncrementalJvmJpsTes runTest("jps-plugin/testData/incremental/pureKotlin/inlineUsedWhereDeclared/"); } + @TestMetadata("innerClassesFromSupertypes") + public void testInnerClassesFromSupertypes() throws Exception { + runTest("jps-plugin/testData/incremental/pureKotlin/innerClassesFromSupertypes/"); + } + @TestMetadata("internalClassChanged") public void testInternalClassChanged() throws Exception { runTest("jps-plugin/testData/incremental/pureKotlin/internalClassChanged/"); diff --git a/jps-plugin/testData/incremental/pureKotlin/innerClassesFromSupertypes/a.kt b/jps-plugin/testData/incremental/pureKotlin/innerClassesFromSupertypes/a.kt new file mode 100644 index 00000000000..32726120030 --- /dev/null +++ b/jps-plugin/testData/incremental/pureKotlin/innerClassesFromSupertypes/a.kt @@ -0,0 +1,7 @@ +package test + +abstract class A { + inner class Inner(val x: String) +} +abstract class B : A() + diff --git a/jps-plugin/testData/incremental/pureKotlin/innerClassesFromSupertypes/b.kt b/jps-plugin/testData/incremental/pureKotlin/innerClassesFromSupertypes/b.kt new file mode 100644 index 00000000000..77288668a6a --- /dev/null +++ b/jps-plugin/testData/incremental/pureKotlin/innerClassesFromSupertypes/b.kt @@ -0,0 +1,6 @@ +// TODO add var +package test + +class C : B() { + val i = Inner("") +} diff --git a/jps-plugin/testData/incremental/pureKotlin/innerClassesFromSupertypes/b.kt.touch b/jps-plugin/testData/incremental/pureKotlin/innerClassesFromSupertypes/b.kt.touch new file mode 100644 index 00000000000..e69de29bb2d diff --git a/jps-plugin/testData/incremental/pureKotlin/innerClassesFromSupertypes/build.log b/jps-plugin/testData/incremental/pureKotlin/innerClassesFromSupertypes/build.log new file mode 100644 index 00000000000..0af690511c3 --- /dev/null +++ b/jps-plugin/testData/incremental/pureKotlin/innerClassesFromSupertypes/build.log @@ -0,0 +1,11 @@ +================ Step #1 ================= + +Cleaning output files: + out/production/module/META-INF/module.kotlin_module + out/production/module/test/C.class +End of files +Compiling files: + src/b.kt +End of files +Exit code: OK +------------------------------------------ diff --git a/jps-plugin/testData/incremental/pureKotlin/innerClassesFromSupertypes/usage.kt b/jps-plugin/testData/incremental/pureKotlin/innerClassesFromSupertypes/usage.kt new file mode 100644 index 00000000000..7549d739908 --- /dev/null +++ b/jps-plugin/testData/incremental/pureKotlin/innerClassesFromSupertypes/usage.kt @@ -0,0 +1,5 @@ +package test + +fun main() { + C().i.x +}