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");