From 2f86554d5af5866a20af05723ae5f97f1eaffa4b Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Fri, 11 Sep 2020 20:48:43 +0200 Subject: [PATCH] IR: don't produce fake overrides for static and private declarations Note that only irrelevantStaticProperty.kt failed before this change. Having private declarations caused no problems, but it seems incorrect, so it's fixed now and irrelevantPrivateDeclarations is added just in case. #KT-41848 Fixed --- .../ir/FirBlackBoxCodegenTestGenerated.java | 10 +++++++ .../kotlin/ir/overrides/IrOverridingUtil.kt | 23 +++++++++++---- .../irrelevantPrivateDeclarations.kt | 24 +++++++++++++++ .../box/sam/irrelevantStaticProperty.kt | 29 +++++++++++++++++++ .../codegen/BlackBoxCodegenTestGenerated.java | 10 +++++++ .../LightAnalysisModeTestGenerated.java | 10 +++++++ .../ir/IrBlackBoxCodegenTestGenerated.java | 10 +++++++ .../IrJsCodegenBoxES6TestGenerated.java | 5 ++++ .../IrJsCodegenBoxTestGenerated.java | 5 ++++ .../semantics/JsCodegenBoxTestGenerated.java | 5 ++++ 10 files changed, 126 insertions(+), 5 deletions(-) create mode 100644 compiler/testData/codegen/box/funInterface/irrelevantPrivateDeclarations.kt create mode 100644 compiler/testData/codegen/box/sam/irrelevantStaticProperty.kt diff --git a/compiler/fir/fir2ir/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java b/compiler/fir/fir2ir/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java index 7dba4fceac3..ecbf816c01d 100644 --- a/compiler/fir/fir2ir/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java +++ b/compiler/fir/fir2ir/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java @@ -11899,6 +11899,11 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT runTest("compiler/testData/codegen/box/funInterface/intersectionTypeToFunInterfaceConversion.kt"); } + @TestMetadata("irrelevantPrivateDeclarations.kt") + public void testIrrelevantPrivateDeclarations() throws Exception { + runTest("compiler/testData/codegen/box/funInterface/irrelevantPrivateDeclarations.kt"); + } + @TestMetadata("multimodule.kt") public void testMultimodule() throws Exception { runTest("compiler/testData/codegen/box/funInterface/multimodule.kt"); @@ -29075,6 +29080,11 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT runTest("compiler/testData/codegen/box/sam/inlinedSamWrapper.kt"); } + @TestMetadata("irrelevantStaticProperty.kt") + public void testIrrelevantStaticProperty() throws Exception { + runTest("compiler/testData/codegen/box/sam/irrelevantStaticProperty.kt"); + } + @TestMetadata("kt17091.kt") public void testKt17091() throws Exception { runTest("compiler/testData/codegen/box/sam/kt17091.kt"); diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/overrides/IrOverridingUtil.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/overrides/IrOverridingUtil.kt index d0c8e83958d..a01ac7eb86b 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/overrides/IrOverridingUtil.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/overrides/IrOverridingUtil.kt @@ -91,7 +91,8 @@ class IrOverridingUtil( is IrProperty -> { fakeOverrideBuilder.propertyOverriddenSymbols[this] = value.map { it as? IrPropertySymbol ?: error("Unexpected property overridden symbol: $it") } - this.getter!!.overriddenSymbols = value.map { (it.owner as IrProperty).getter!!.symbol } + val getter = this.getter ?: error("Property has no getter: ${render()}") + getter.overriddenSymbols = value.map { (it.owner as IrProperty).getter!!.symbol } this.setter?.let { setter -> setter.overriddenSymbols = value.mapNotNull { (it.owner as IrProperty).setter?.symbol } } @@ -162,10 +163,12 @@ class IrOverridingUtil( val superClass = superType.getClass() ?: error("Unexpected super type: $superType") superClass.declarations .filterIsInstance() - .filter { it !in overriddenMembers } - .map { overridenMember -> - val fakeOverride = fakeOverrideBuilder.fakeOverrideMember(superType, overridenMember, clazz) - originals[fakeOverride] = overridenMember + .filterNot { + it in overriddenMembers || it.isStaticMember || DescriptorVisibilities.isPrivate(it.visibility) + } + .map { overriddenMember -> + val fakeOverride = fakeOverrideBuilder.fakeOverrideMember(superType, overriddenMember, clazz) + originals[fakeOverride] = overriddenMember originalSuperTypes[fakeOverride] = superType fakeOverride } @@ -179,6 +182,16 @@ class IrOverridingUtil( return fakeOverrides } + private val IrOverridableMember.isStaticMember: Boolean + get() = when (this) { + is IrFunction -> + dispatchReceiverParameter == null + is IrProperty -> + backingField?.isStatic == true || + getter?.let { it.dispatchReceiverParameter == null } == true + else -> error("Unknown overridable member: ${render()}") + } + private fun generateOverridesInFunctionGroup( membersFromSupertypes: List, membersFromCurrent: List, diff --git a/compiler/testData/codegen/box/funInterface/irrelevantPrivateDeclarations.kt b/compiler/testData/codegen/box/funInterface/irrelevantPrivateDeclarations.kt new file mode 100644 index 00000000000..6aba80b51f6 --- /dev/null +++ b/compiler/testData/codegen/box/funInterface/irrelevantPrivateDeclarations.kt @@ -0,0 +1,24 @@ +fun interface A { + fun invoke(s: String) + + private fun privateFun() {} + private var privateProperty: String + get() = "" + set(value) {} + + companion object { + fun s(a: A) { + a.invoke("OK") + } + } +} + +fun test(f: (String) -> Unit) { + A.s(f) +} + +fun box(): String { + var result = "Fail" + test { result = it } + return result +} diff --git a/compiler/testData/codegen/box/sam/irrelevantStaticProperty.kt b/compiler/testData/codegen/box/sam/irrelevantStaticProperty.kt new file mode 100644 index 00000000000..0354e323bb4 --- /dev/null +++ b/compiler/testData/codegen/box/sam/irrelevantStaticProperty.kt @@ -0,0 +1,29 @@ +// TARGET_BACKEND: JVM +// JVM_TARGET: 1.8 +// FILE: box.kt + +fun test(f: (String) -> Unit) { + A.s(f) +} + +fun box(): String { + var result = "Fail" + test { result = it } + return result +} + +// FILE: A.java + +public interface A { + void f(T t); + + A N = new A() { + @Override + public void f(final Object object) { + } + }; + + static void s(A a) { + a.f("OK"); + } +} diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java index 3c5f1162308..d034681ab38 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java @@ -13294,6 +13294,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/funInterface/intersectionTypeToFunInterfaceConversion.kt"); } + @TestMetadata("irrelevantPrivateDeclarations.kt") + public void testIrrelevantPrivateDeclarations() throws Exception { + runTest("compiler/testData/codegen/box/funInterface/irrelevantPrivateDeclarations.kt"); + } + @TestMetadata("multimodule.kt") public void testMultimodule() throws Exception { runTest("compiler/testData/codegen/box/funInterface/multimodule.kt"); @@ -30841,6 +30846,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/sam/inlinedSamWrapper.kt"); } + @TestMetadata("irrelevantStaticProperty.kt") + public void testIrrelevantStaticProperty() throws Exception { + runTest("compiler/testData/codegen/box/sam/irrelevantStaticProperty.kt"); + } + @TestMetadata("kt17091.kt") public void testKt17091() throws Exception { runTest("compiler/testData/codegen/box/sam/kt17091.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index 0faec63e919..71bd2b3ed5e 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -13294,6 +13294,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/funInterface/intersectionTypeToFunInterfaceConversion.kt"); } + @TestMetadata("irrelevantPrivateDeclarations.kt") + public void testIrrelevantPrivateDeclarations() throws Exception { + runTest("compiler/testData/codegen/box/funInterface/irrelevantPrivateDeclarations.kt"); + } + @TestMetadata("multimodule.kt") public void testMultimodule() throws Exception { runTest("compiler/testData/codegen/box/funInterface/multimodule.kt"); @@ -28475,6 +28480,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/sam/inlinedSamWrapper.kt"); } + @TestMetadata("irrelevantStaticProperty.kt") + public void testIrrelevantStaticProperty() throws Exception { + runTest("compiler/testData/codegen/box/sam/irrelevantStaticProperty.kt"); + } + @TestMetadata("kt17091.kt") public void testKt17091() throws Exception { runTest("compiler/testData/codegen/box/sam/kt17091.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java index e211723ed85..d430711b631 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java @@ -11899,6 +11899,11 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/funInterface/intersectionTypeToFunInterfaceConversion.kt"); } + @TestMetadata("irrelevantPrivateDeclarations.kt") + public void testIrrelevantPrivateDeclarations() throws Exception { + runTest("compiler/testData/codegen/box/funInterface/irrelevantPrivateDeclarations.kt"); + } + @TestMetadata("multimodule.kt") public void testMultimodule() throws Exception { runTest("compiler/testData/codegen/box/funInterface/multimodule.kt"); @@ -29075,6 +29080,11 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/sam/inlinedSamWrapper.kt"); } + @TestMetadata("irrelevantStaticProperty.kt") + public void testIrrelevantStaticProperty() throws Exception { + runTest("compiler/testData/codegen/box/sam/irrelevantStaticProperty.kt"); + } + @TestMetadata("kt17091.kt") public void testKt17091() throws Exception { runTest("compiler/testData/codegen/box/sam/kt17091.kt"); diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java index 3bcb9a6de01..94edfe2f408 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java @@ -10224,6 +10224,11 @@ public class IrJsCodegenBoxES6TestGenerated extends AbstractIrJsCodegenBoxES6Tes runTest("compiler/testData/codegen/box/funInterface/intersectionTypeToFunInterfaceConversion.kt"); } + @TestMetadata("irrelevantPrivateDeclarations.kt") + public void testIrrelevantPrivateDeclarations() throws Exception { + runTest("compiler/testData/codegen/box/funInterface/irrelevantPrivateDeclarations.kt"); + } + @TestMetadata("multimodule.kt") public void testMultimodule() throws Exception { runTest("compiler/testData/codegen/box/funInterface/multimodule.kt"); diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java index 00d03c436a7..293938cfe35 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java @@ -10224,6 +10224,11 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest { runTest("compiler/testData/codegen/box/funInterface/intersectionTypeToFunInterfaceConversion.kt"); } + @TestMetadata("irrelevantPrivateDeclarations.kt") + public void testIrrelevantPrivateDeclarations() throws Exception { + runTest("compiler/testData/codegen/box/funInterface/irrelevantPrivateDeclarations.kt"); + } + @TestMetadata("multimodule.kt") public void testMultimodule() throws Exception { runTest("compiler/testData/codegen/box/funInterface/multimodule.kt"); diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java index 7b7156966ae..1d9b1f8af2d 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java @@ -10224,6 +10224,11 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest { runTest("compiler/testData/codegen/box/funInterface/intersectionTypeToFunInterfaceConversion.kt"); } + @TestMetadata("irrelevantPrivateDeclarations.kt") + public void testIrrelevantPrivateDeclarations() throws Exception { + runTest("compiler/testData/codegen/box/funInterface/irrelevantPrivateDeclarations.kt"); + } + @TestMetadata("multimodule.kt") public void testMultimodule() throws Exception { runTest("compiler/testData/codegen/box/funInterface/multimodule.kt");