From 6082f0b7121726c3e1399d219b5014eccd2ccdfa Mon Sep 17 00:00:00 2001 From: "Denis.Zharkov" Date: Thu, 25 Nov 2021 20:10:28 +0300 Subject: [PATCH] FIR2IR: Postpone binding overrides for lazy classes until sources processed --- .../kotlin/fir/backend/Fir2IrConverter.kt | 17 +++++++++++++++++ .../kotlin/fir/lazy/Fir2IrLazyClass.kt | 2 +- ...mentalFirJvmCompilerRunnerTestGenerated.java | 5 +++++ ...ncrementalJsCompilerRunnerTestGenerated.java | 5 +++++ ...ilerRunnerWithMetadataOnlyTestGenerated.java | 5 +++++ ...mentalJsKlibCompilerRunnerTestGenerated.java | 5 +++++ ...erWithScopeExpansionRunnerTestGenerated.java | 5 +++++ ...crementalJvmCompilerRunnerTestGenerated.java | 5 +++++ ...vmOldBackendCompilerRunnerTestGenerated.java | 5 +++++ .../serializedSubClassAndChangedInterfaces/a.kt | 3 +++ .../serializedSubClassAndChangedInterfaces/b.kt | 3 +++ .../b.kt.touch | 0 .../build.log | 13 +++++++++++++ .../interfaces.kt | 4 ++++ .../interfaces.kt.touch | 0 15 files changed, 76 insertions(+), 1 deletion(-) create mode 100644 jps-plugin/testData/incremental/pureKotlin/serializedSubClassAndChangedInterfaces/a.kt create mode 100644 jps-plugin/testData/incremental/pureKotlin/serializedSubClassAndChangedInterfaces/b.kt create mode 100644 jps-plugin/testData/incremental/pureKotlin/serializedSubClassAndChangedInterfaces/b.kt.touch create mode 100644 jps-plugin/testData/incremental/pureKotlin/serializedSubClassAndChangedInterfaces/build.log create mode 100644 jps-plugin/testData/incremental/pureKotlin/serializedSubClassAndChangedInterfaces/interfaces.kt create mode 100644 jps-plugin/testData/incremental/pureKotlin/serializedSubClassAndChangedInterfaces/interfaces.kt.touch diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrConverter.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrConverter.kt index 4e1bc0778c2..761d770ec58 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrConverter.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrConverter.kt @@ -52,6 +52,9 @@ class Fir2IrConverter( private val generatorExtensions = session.extensionService.declarationGenerators + private var wereSourcesFakeOverridesBound = false + private val postponedDeclarationsForFakeOverridesBinding = mutableListOf() + fun runSourcesConversion( allFirFiles: List, irModuleFragment: IrModuleFragmentImpl, @@ -90,6 +93,11 @@ class Fir2IrConverter( for (firFile in allFirFiles) { bindFakeOverridesInFile(firFile) } + + wereSourcesFakeOverridesBound = true + fakeOverrideGenerator.bindOverriddenSymbols(postponedDeclarationsForFakeOverridesBinding) + postponedDeclarationsForFakeOverridesBinding.clear() + // Do (3) and (4) for local classes encountered during (3) classifierStorage.processMembersOfClassesCreatedOnTheFly() @@ -120,6 +128,15 @@ class Fir2IrConverter( } + fun bindFakeOverridesOrPostpone(declarations: List) { + // Do not run binding for lazy classes until all sources declarations are processed + if (wereSourcesFakeOverridesBound) { + fakeOverrideGenerator.bindOverriddenSymbols(declarations) + } else { + postponedDeclarationsForFakeOverridesBinding += declarations + } + } + fun processLocalClassAndNestedClassesOnTheFly(regularClass: FirRegularClass, parent: IrDeclarationParent): IrClass { val irClass = registerClassAndNestedClasses(regularClass, parent) processClassAndNestedClassHeaders(regularClass) diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazyClass.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazyClass.kt index d321440388f..80888c0c5ea 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazyClass.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazyClass.kt @@ -141,7 +141,7 @@ class Fir2IrLazyClass( fun getFakeOverridesByName(name: Name): Collection = fakeOverridesByName.getOrPut(name) { fakeOverrideGenerator.generateFakeOverridesForName(this@Fir2IrLazyClass, name, fir) - .also(fakeOverrideGenerator::bindOverriddenSymbols) + .also(converter::bindFakeOverridesOrPostpone) } override val declarations: MutableList by lazyVar(lock) { diff --git a/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/IncrementalFirJvmCompilerRunnerTestGenerated.java b/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/IncrementalFirJvmCompilerRunnerTestGenerated.java index 7a15b798e89..07e6748526b 100644 --- a/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/IncrementalFirJvmCompilerRunnerTestGenerated.java +++ b/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/IncrementalFirJvmCompilerRunnerTestGenerated.java @@ -617,6 +617,11 @@ public class IncrementalFirJvmCompilerRunnerTestGenerated extends AbstractIncrem runTest("jps-plugin/testData/incremental/pureKotlin/secondaryConstructorInlined/"); } + @TestMetadata("serializedSubClassAndChangedInterfaces") + public void testSerializedSubClassAndChangedInterfaces() throws Exception { + runTest("jps-plugin/testData/incremental/pureKotlin/serializedSubClassAndChangedInterfaces/"); + } + @TestMetadata("simpleClassDependency") public void testSimpleClassDependency() throws Exception { runTest("jps-plugin/testData/incremental/pureKotlin/simpleClassDependency/"); 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 cbfd422eb59..85e23497b68 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 @@ -616,6 +616,11 @@ public class IncrementalJsCompilerRunnerTestGenerated extends AbstractIncrementa runTest("jps-plugin/testData/incremental/pureKotlin/secondaryConstructorInlined/"); } + @TestMetadata("serializedSubClassAndChangedInterfaces") + public void testSerializedSubClassAndChangedInterfaces() throws Exception { + runTest("jps-plugin/testData/incremental/pureKotlin/serializedSubClassAndChangedInterfaces/"); + } + @TestMetadata("simpleClassDependency") public void testSimpleClassDependency() throws Exception { runTest("jps-plugin/testData/incremental/pureKotlin/simpleClassDependency/"); 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 11f14919542..76ee1211568 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 @@ -616,6 +616,11 @@ public class IncrementalJsCompilerRunnerWithMetadataOnlyTestGenerated extends Ab runTest("jps-plugin/testData/incremental/pureKotlin/secondaryConstructorInlined/"); } + @TestMetadata("serializedSubClassAndChangedInterfaces") + public void testSerializedSubClassAndChangedInterfaces() throws Exception { + runTest("jps-plugin/testData/incremental/pureKotlin/serializedSubClassAndChangedInterfaces/"); + } + @TestMetadata("simpleClassDependency") public void testSimpleClassDependency() throws Exception { runTest("jps-plugin/testData/incremental/pureKotlin/simpleClassDependency/"); 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 ccdd61182cd..499dfaf39a1 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 @@ -591,6 +591,11 @@ public class IncrementalJsKlibCompilerRunnerTestGenerated extends AbstractIncrem runTest("jps-plugin/testData/incremental/pureKotlin/secondaryConstructorInlined/"); } + @TestMetadata("serializedSubClassAndChangedInterfaces") + public void testSerializedSubClassAndChangedInterfaces() throws Exception { + runTest("jps-plugin/testData/incremental/pureKotlin/serializedSubClassAndChangedInterfaces/"); + } + @TestMetadata("simpleClassDependency") public void testSimpleClassDependency() throws Exception { runTest("jps-plugin/testData/incremental/pureKotlin/simpleClassDependency/"); 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 cc2d3e76e7c..fc88547e8db 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 @@ -591,6 +591,11 @@ public class IncrementalJsKlibCompilerWithScopeExpansionRunnerTestGenerated exte runTest("jps-plugin/testData/incremental/pureKotlin/secondaryConstructorInlined/"); } + @TestMetadata("serializedSubClassAndChangedInterfaces") + public void testSerializedSubClassAndChangedInterfaces() throws Exception { + runTest("jps-plugin/testData/incremental/pureKotlin/serializedSubClassAndChangedInterfaces/"); + } + @TestMetadata("simpleClassDependency") public void testSimpleClassDependency() throws Exception { runTest("jps-plugin/testData/incremental/pureKotlin/simpleClassDependency/"); 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 f38c9b9d859..a571dc2bd50 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 @@ -617,6 +617,11 @@ public class IncrementalJvmCompilerRunnerTestGenerated extends AbstractIncrement runTest("jps-plugin/testData/incremental/pureKotlin/secondaryConstructorInlined/"); } + @TestMetadata("serializedSubClassAndChangedInterfaces") + public void testSerializedSubClassAndChangedInterfaces() throws Exception { + runTest("jps-plugin/testData/incremental/pureKotlin/serializedSubClassAndChangedInterfaces/"); + } + @TestMetadata("simpleClassDependency") public void testSimpleClassDependency() throws Exception { runTest("jps-plugin/testData/incremental/pureKotlin/simpleClassDependency/"); diff --git a/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/IncrementalJvmOldBackendCompilerRunnerTestGenerated.java b/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/IncrementalJvmOldBackendCompilerRunnerTestGenerated.java index 293e2e7b5aa..fca419fe037 100644 --- a/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/IncrementalJvmOldBackendCompilerRunnerTestGenerated.java +++ b/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/IncrementalJvmOldBackendCompilerRunnerTestGenerated.java @@ -617,6 +617,11 @@ public class IncrementalJvmOldBackendCompilerRunnerTestGenerated extends Abstrac runTest("jps-plugin/testData/incremental/pureKotlin/secondaryConstructorInlined/"); } + @TestMetadata("serializedSubClassAndChangedInterfaces") + public void testSerializedSubClassAndChangedInterfaces() throws Exception { + runTest("jps-plugin/testData/incremental/pureKotlin/serializedSubClassAndChangedInterfaces/"); + } + @TestMetadata("simpleClassDependency") public void testSimpleClassDependency() throws Exception { runTest("jps-plugin/testData/incremental/pureKotlin/simpleClassDependency/"); diff --git a/jps-plugin/testData/incremental/pureKotlin/serializedSubClassAndChangedInterfaces/a.kt b/jps-plugin/testData/incremental/pureKotlin/serializedSubClassAndChangedInterfaces/a.kt new file mode 100644 index 00000000000..715042e803f --- /dev/null +++ b/jps-plugin/testData/incremental/pureKotlin/serializedSubClassAndChangedInterfaces/a.kt @@ -0,0 +1,3 @@ +package test + +class A : I1, I2 diff --git a/jps-plugin/testData/incremental/pureKotlin/serializedSubClassAndChangedInterfaces/b.kt b/jps-plugin/testData/incremental/pureKotlin/serializedSubClassAndChangedInterfaces/b.kt new file mode 100644 index 00000000000..9cdd4378cbb --- /dev/null +++ b/jps-plugin/testData/incremental/pureKotlin/serializedSubClassAndChangedInterfaces/b.kt @@ -0,0 +1,3 @@ +package test + +data class B(val a: A) // generates a call to A::hashCode that is a fake override in A diff --git a/jps-plugin/testData/incremental/pureKotlin/serializedSubClassAndChangedInterfaces/b.kt.touch b/jps-plugin/testData/incremental/pureKotlin/serializedSubClassAndChangedInterfaces/b.kt.touch new file mode 100644 index 00000000000..e69de29bb2d diff --git a/jps-plugin/testData/incremental/pureKotlin/serializedSubClassAndChangedInterfaces/build.log b/jps-plugin/testData/incremental/pureKotlin/serializedSubClassAndChangedInterfaces/build.log new file mode 100644 index 00000000000..c59c5d8c561 --- /dev/null +++ b/jps-plugin/testData/incremental/pureKotlin/serializedSubClassAndChangedInterfaces/build.log @@ -0,0 +1,13 @@ +================ Step #1 ================= + +Cleaning output files: + out/production/module/META-INF/module.kotlin_module + out/production/module/test/BKt.class + out/production/module/test/UsageKt.class +End of files +Compiling files: + src/b.kt + src/interfaces.kt +End of files +Exit code: OK +------------------------------------------ diff --git a/jps-plugin/testData/incremental/pureKotlin/serializedSubClassAndChangedInterfaces/interfaces.kt b/jps-plugin/testData/incremental/pureKotlin/serializedSubClassAndChangedInterfaces/interfaces.kt new file mode 100644 index 00000000000..9b9cb123155 --- /dev/null +++ b/jps-plugin/testData/incremental/pureKotlin/serializedSubClassAndChangedInterfaces/interfaces.kt @@ -0,0 +1,4 @@ +package test + +interface I1 +interface I2 diff --git a/jps-plugin/testData/incremental/pureKotlin/serializedSubClassAndChangedInterfaces/interfaces.kt.touch b/jps-plugin/testData/incremental/pureKotlin/serializedSubClassAndChangedInterfaces/interfaces.kt.touch new file mode 100644 index 00000000000..e69de29bb2d