From b72effab98d738a978d779b441002baf56a7d41f Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Fri, 9 Feb 2024 13:25:49 +0100 Subject: [PATCH] IR: remove isFromJava check from isOverridableMemberOrAccessor This is needed because in case a static member is inherited via a Kotlin class (class C in the newly added test), its origin becomes FAKE_OVERRIDE which is technically not Java anymore. After this change, we'll build fake overrides for static members from superclasses regardless of whether they come from Java or Kotlin. Also, move the previous logic of isOverridableFunction/isOverridableProperty to the only call site at IdSignatureFactory. #KT-65589 Fixed --- ...LFirBlackBoxCodegenBasedTestGenerated.java | 6 +++++ ...rsedBlackBoxCodegenBasedTestGenerated.java | 6 +++++ ...LightTreeBlackBoxCodegenTestGenerated.java | 6 +++++ ...hIrFakeOverrideGeneratorTestGenerated.java | 6 +++++ .../FirPsiBlackBoxCodegenTestGenerated.java | 6 +++++ .../overrides/FakeOverrideBuilderStrategy.kt | 8 +++--- .../ir/overrides/IrFakeOverrideBuilder.kt | 19 ++++---------- .../kotlin/ir/overrides/IrOverrideChecker.kt | 3 --- .../signature/IdSignatureFactory.kt | 16 +++++++----- .../codegen/box/javaInterop/statics/jkkjk.kt | 26 +++++++++++++++++++ .../JvmAbiConsistencyTestBoxGenerated.java | 6 +++++ .../codegen/BlackBoxCodegenTestGenerated.java | 6 +++++ .../IrBlackBoxCodegenTestGenerated.java | 6 +++++ ...kBoxCodegenWithIrInlinerTestGenerated.java | 6 +++++ .../LightAnalysisModeTestGenerated.java | 5 ++++ 15 files changed, 105 insertions(+), 26 deletions(-) create mode 100644 compiler/testData/codegen/box/javaInterop/statics/jkkjk.kt diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirBlackBoxCodegenBasedTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirBlackBoxCodegenBasedTestGenerated.java index 2c44a342e3c..a7745f97582 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirBlackBoxCodegenBasedTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirBlackBoxCodegenBasedTestGenerated.java @@ -31931,6 +31931,12 @@ public class LLFirBlackBoxCodegenBasedTestGenerated extends AbstractLLFirBlackBo runTest("compiler/testData/codegen/box/javaInterop/statics/inheritTwoStaticMethods.kt"); } + @Test + @TestMetadata("jkkjk.kt") + public void testJkkjk() throws Exception { + runTest("compiler/testData/codegen/box/javaInterop/statics/jkkjk.kt"); + } + @Test @TestMetadata("overrideInstanceMethodWithIrrelevantStatic.kt") public void testOverrideInstanceMethodWithIrrelevantStatic() throws Exception { diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirReversedBlackBoxCodegenBasedTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirReversedBlackBoxCodegenBasedTestGenerated.java index f71989ade61..a6bbc97cc3c 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirReversedBlackBoxCodegenBasedTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirReversedBlackBoxCodegenBasedTestGenerated.java @@ -31931,6 +31931,12 @@ public class LLFirReversedBlackBoxCodegenBasedTestGenerated extends AbstractLLFi runTest("compiler/testData/codegen/box/javaInterop/statics/inheritTwoStaticMethods.kt"); } + @Test + @TestMetadata("jkkjk.kt") + public void testJkkjk() throws Exception { + runTest("compiler/testData/codegen/box/javaInterop/statics/jkkjk.kt"); + } + @Test @TestMetadata("overrideInstanceMethodWithIrrelevantStatic.kt") public void testOverrideInstanceMethodWithIrrelevantStatic() throws Exception { diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenTestGenerated.java index a51493a28d8..3b8bfc1cf5e 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenTestGenerated.java @@ -31594,6 +31594,12 @@ public class FirLightTreeBlackBoxCodegenTestGenerated extends AbstractFirLightTr runTest("compiler/testData/codegen/box/javaInterop/statics/inheritTwoStaticMethods.kt"); } + @Test + @TestMetadata("jkkjk.kt") + public void testJkkjk() throws Exception { + runTest("compiler/testData/codegen/box/javaInterop/statics/jkkjk.kt"); + } + @Test @TestMetadata("overrideInstanceMethodWithIrrelevantStatic.kt") public void testOverrideInstanceMethodWithIrrelevantStatic() throws Exception { diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenWithIrFakeOverrideGeneratorTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenWithIrFakeOverrideGeneratorTestGenerated.java index 9ad91ed613c..db0a2eac9a7 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenWithIrFakeOverrideGeneratorTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenWithIrFakeOverrideGeneratorTestGenerated.java @@ -31594,6 +31594,12 @@ public class FirLightTreeBlackBoxCodegenWithIrFakeOverrideGeneratorTestGenerated runTest("compiler/testData/codegen/box/javaInterop/statics/inheritTwoStaticMethods.kt"); } + @Test + @TestMetadata("jkkjk.kt") + public void testJkkjk() throws Exception { + runTest("compiler/testData/codegen/box/javaInterop/statics/jkkjk.kt"); + } + @Test @TestMetadata("overrideInstanceMethodWithIrrelevantStatic.kt") public void testOverrideInstanceMethodWithIrrelevantStatic() throws Exception { diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirPsiBlackBoxCodegenTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirPsiBlackBoxCodegenTestGenerated.java index 4832b9de382..e944e988742 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirPsiBlackBoxCodegenTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirPsiBlackBoxCodegenTestGenerated.java @@ -31594,6 +31594,12 @@ public class FirPsiBlackBoxCodegenTestGenerated extends AbstractFirPsiBlackBoxCo runTest("compiler/testData/codegen/box/javaInterop/statics/inheritTwoStaticMethods.kt"); } + @Test + @TestMetadata("jkkjk.kt") + public void testJkkjk() throws Exception { + runTest("compiler/testData/codegen/box/javaInterop/statics/jkkjk.kt"); + } + @Test @TestMetadata("overrideInstanceMethodWithIrrelevantStatic.kt") public void testOverrideInstanceMethodWithIrrelevantStatic() throws Exception { diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/overrides/FakeOverrideBuilderStrategy.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/overrides/FakeOverrideBuilderStrategy.kt index e4d52616c82..0d6289b22d7 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/overrides/FakeOverrideBuilderStrategy.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/overrides/FakeOverrideBuilderStrategy.kt @@ -5,13 +5,15 @@ package org.jetbrains.kotlin.ir.overrides -import org.jetbrains.kotlin.builtins.StandardNames import org.jetbrains.kotlin.descriptors.DescriptorVisibilities import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.symbols.IrClassSymbol import org.jetbrains.kotlin.ir.symbols.IrTypeParameterSymbol -import org.jetbrains.kotlin.ir.types.* +import org.jetbrains.kotlin.ir.types.IrSimpleType +import org.jetbrains.kotlin.ir.types.IrType +import org.jetbrains.kotlin.ir.types.IrTypeProjection +import org.jetbrains.kotlin.ir.types.extractTypeParameters import org.jetbrains.kotlin.ir.util.getPackageFragment import org.jetbrains.kotlin.ir.util.hasAnnotation import org.jetbrains.kotlin.ir.util.render @@ -39,7 +41,7 @@ abstract class FakeOverrideBuilderStrategy( * if no fake override should be created for this member */ fun fakeOverrideMember(superType: IrType, member: IrOverridableMember, clazz: IrClass): IrOverridableMember? { - return if (member.isOverridableMemberOrAccessor() && isVisibleForOverrideInClass(member, clazz)) + return if (isVisibleForOverrideInClass(member, clazz)) buildFakeOverrideMember(superType, member, clazz, unimplementedOverridesStrategy) else null diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/overrides/IrFakeOverrideBuilder.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/overrides/IrFakeOverrideBuilder.kt index 9a8d386a225..29a95f405df 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/overrides/IrFakeOverrideBuilder.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/overrides/IrFakeOverrideBuilder.kt @@ -13,7 +13,10 @@ import org.jetbrains.kotlin.ir.symbols.IrPropertySymbol import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol import org.jetbrains.kotlin.ir.symbols.IrSymbol import org.jetbrains.kotlin.ir.types.* -import org.jetbrains.kotlin.ir.util.* +import org.jetbrains.kotlin.ir.util.collectAndFilterRealOverrides +import org.jetbrains.kotlin.ir.util.fileOrNull +import org.jetbrains.kotlin.ir.util.isClass +import org.jetbrains.kotlin.ir.util.render import org.jetbrains.kotlin.resolve.OverridingUtil.OverrideCompatibilityInfo import org.jetbrains.kotlin.types.AbstractTypeChecker import org.jetbrains.kotlin.types.TypeCheckerState @@ -204,7 +207,7 @@ class IrFakeOverrideBuilder( // because of binary incompatible changes, it's possible to have private member colliding with fake override // In that case we shouldn't generate fake override, but also shouldn't mark them as overridden - if (fromCurrent.isOverridableMemberOrAccessor()) { + if (!DescriptorVisibilities.isPrivate(fromCurrent.visibility)) { fromCurrent.overriddenSymbols = overridden.memoryOptimizedMap { it.original.symbol } } @@ -527,15 +530,3 @@ private val IrOverridableMember.returnType: IrType is IrProperty -> getter!!.returnType else -> error("Unexpected type of declaration: ${this::class.java}, $this") } - -fun IrSimpleFunction.isOverridableFunction(): Boolean = - !DescriptorVisibilities.isPrivate(visibility) && (hasDispatchReceiver || isFromJava()) - -fun IrProperty.isOverridableProperty(): Boolean = - !DescriptorVisibilities.isPrivate(visibility) && (getter.hasDispatchReceiver || setter.hasDispatchReceiver || isFromJava()) - -fun IrDeclaration.isOverridableMemberOrAccessor(): Boolean = when (this) { - is IrSimpleFunction -> isOverridableFunction() - is IrProperty -> isOverridableProperty() - else -> false -} diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/overrides/IrOverrideChecker.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/overrides/IrOverrideChecker.kt index 78bcce8dbd2..c5bc598b740 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/overrides/IrOverrideChecker.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/overrides/IrOverrideChecker.kt @@ -191,9 +191,6 @@ class IrOverrideChecker( private val IrSimpleFunction?.hasExtensionReceiver: Boolean get() = this?.extensionReceiverParameter != null -internal val IrSimpleFunction?.hasDispatchReceiver: Boolean - get() = this?.dispatchReceiverParameter != null - private val IrSimpleFunction.compiledValueParameters: List get() = ArrayList(valueParameters.size + 1).apply { extensionReceiverParameter?.let(::add) diff --git a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/signature/IdSignatureFactory.kt b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/signature/IdSignatureFactory.kt index a5b2997ab77..b5341640810 100644 --- a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/signature/IdSignatureFactory.kt +++ b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/signature/IdSignatureFactory.kt @@ -11,13 +11,8 @@ import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.descriptors.DescriptorVisibilities import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.declarations.* -import org.jetbrains.kotlin.ir.overrides.isOverridableFunction -import org.jetbrains.kotlin.ir.overrides.isOverridableProperty import org.jetbrains.kotlin.ir.symbols.IrFileSymbol -import org.jetbrains.kotlin.ir.util.IdSignature -import org.jetbrains.kotlin.ir.util.KotlinMangler -import org.jetbrains.kotlin.ir.util.isFacadeClass -import org.jetbrains.kotlin.ir.util.render +import org.jetbrains.kotlin.ir.util.* import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid import org.jetbrains.kotlin.ir.visitors.acceptVoid @@ -277,4 +272,13 @@ class IdSignatureFactory( } } } + + private fun IrSimpleFunction.isOverridableFunction(): Boolean = + !DescriptorVisibilities.isPrivate(visibility) && (hasDispatchReceiver || isFromJava()) + + private fun IrProperty.isOverridableProperty(): Boolean = + !DescriptorVisibilities.isPrivate(visibility) && (getter.hasDispatchReceiver || setter.hasDispatchReceiver || isFromJava()) + + private val IrSimpleFunction?.hasDispatchReceiver: Boolean + get() = this?.dispatchReceiverParameter != null } diff --git a/compiler/testData/codegen/box/javaInterop/statics/jkkjk.kt b/compiler/testData/codegen/box/javaInterop/statics/jkkjk.kt new file mode 100644 index 00000000000..eaface8d986 --- /dev/null +++ b/compiler/testData/codegen/box/javaInterop/statics/jkkjk.kt @@ -0,0 +1,26 @@ +// TARGET_BACKEND: JVM +// FILE: A.java +public class A { + public static String o = "O"; + + public static String k() { + return "K"; + } +} + +// FILE: B.kt +open class B : A() + +// FILE: C.kt +open class C : B() + +// FILE: D.java +public class D extends C {} + +// FILE: E.kt +class E : D() { + fun g(): String = o + k() +} + +// FILE: box.kt +fun box(): String = E().g() diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/JvmAbiConsistencyTestBoxGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/JvmAbiConsistencyTestBoxGenerated.java index b95b6330750..9194ae2f7bb 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/JvmAbiConsistencyTestBoxGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/JvmAbiConsistencyTestBoxGenerated.java @@ -31594,6 +31594,12 @@ public class JvmAbiConsistencyTestBoxGenerated extends AbstractJvmAbiConsistency runTest("compiler/testData/codegen/box/javaInterop/statics/inheritTwoStaticMethods.kt"); } + @Test + @TestMetadata("jkkjk.kt") + public void testJkkjk() throws Exception { + runTest("compiler/testData/codegen/box/javaInterop/statics/jkkjk.kt"); + } + @Test @TestMetadata("overrideInstanceMethodWithIrrelevantStatic.kt") public void testOverrideInstanceMethodWithIrrelevantStatic() throws Exception { diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java index f39117b9200..1c6e17c07d5 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java @@ -29770,6 +29770,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/javaInterop/statics/inheritTwoStaticMethods.kt"); } + @Test + @TestMetadata("jkkjk.kt") + public void testJkkjk() throws Exception { + runTest("compiler/testData/codegen/box/javaInterop/statics/jkkjk.kt"); + } + @Test @TestMetadata("overrideInstanceMethodWithIrrelevantStatic.kt") public void testOverrideInstanceMethodWithIrrelevantStatic() throws Exception { diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java index da6cb27462f..1185e8fc0b8 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java @@ -31594,6 +31594,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/javaInterop/statics/inheritTwoStaticMethods.kt"); } + @Test + @TestMetadata("jkkjk.kt") + public void testJkkjk() throws Exception { + runTest("compiler/testData/codegen/box/javaInterop/statics/jkkjk.kt"); + } + @Test @TestMetadata("overrideInstanceMethodWithIrrelevantStatic.kt") public void testOverrideInstanceMethodWithIrrelevantStatic() throws Exception { diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenWithIrInlinerTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenWithIrInlinerTestGenerated.java index fac7ca60bc8..930c38bfabd 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenWithIrInlinerTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenWithIrInlinerTestGenerated.java @@ -31594,6 +31594,12 @@ public class IrBlackBoxCodegenWithIrInlinerTestGenerated extends AbstractIrBlack runTest("compiler/testData/codegen/box/javaInterop/statics/inheritTwoStaticMethods.kt"); } + @Test + @TestMetadata("jkkjk.kt") + public void testJkkjk() throws Exception { + runTest("compiler/testData/codegen/box/javaInterop/statics/jkkjk.kt"); + } + @Test @TestMetadata("overrideInstanceMethodWithIrrelevantStatic.kt") public void testOverrideInstanceMethodWithIrrelevantStatic() throws Exception { diff --git a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index 51a7b795180..34a56e8b1de 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -26806,6 +26806,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/javaInterop/statics/inheritTwoStaticMethods.kt"); } + @TestMetadata("jkkjk.kt") + public void testJkkjk() throws Exception { + runTest("compiler/testData/codegen/box/javaInterop/statics/jkkjk.kt"); + } + @TestMetadata("overrideInstanceMethodWithIrrelevantStatic.kt") public void testOverrideInstanceMethodWithIrrelevantStatic() throws Exception { runTest("compiler/testData/codegen/box/javaInterop/statics/overrideInstanceMethodWithIrrelevantStatic.kt");