From 32cc28c6cf3c29907d8e552b4f2cb202ede0e4cc Mon Sep 17 00:00:00 2001 From: Kirill Rakhman Date: Tue, 28 Mar 2023 14:47:38 +0200 Subject: [PATCH] [FIR] Skip expect-actual rules check when overriding non-expect member Overriding equals, hashCode, toString and any other member that is not expect does not require satisfying the rules of expect-actual matching. #KT-57381 Fixed --- ...LightTreeBlackBoxCodegenTestGenerated.java | 6 +++++ .../FirPsiBlackBoxCodegenTestGenerated.java | 6 +++++ .../mpp/FirExpectActualResolver.kt | 3 +++ .../k2/basic/nonExternalEquals.kt | 27 +++++++++++++++++++ .../codegen/BlackBoxCodegenTestGenerated.java | 6 +++++ .../IrBlackBoxCodegenTestGenerated.java | 6 +++++ ...kBoxCodegenWithIrInlinerTestGenerated.java | 6 +++++ .../LightAnalysisModeTestGenerated.java | 5 ++++ .../js/test/JsCodegenBoxTestGenerated.java | 6 +++++ .../fir/FirJsCodegenBoxTestGenerated.java | 6 +++++ .../test/ir/IrJsCodegenBoxTestGenerated.java | 6 +++++ .../ir/IrJsES6CodegenBoxTestGenerated.java | 6 +++++ .../FirNativeCodegenBoxTestGenerated.java | 6 +++++ .../K1NativeCodegenBoxTestGenerated.java | 6 +++++ .../test/IrCodegenBoxWasmTestGenerated.java | 5 ++++ 15 files changed, 106 insertions(+) create mode 100644 compiler/testData/codegen/box/multiplatform/k2/basic/nonExternalEquals.kt 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 c3a78d05973..4b3b31a6331 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 @@ -33399,6 +33399,12 @@ public class FirLightTreeBlackBoxCodegenTestGenerated extends AbstractFirLightTr runTest("compiler/testData/codegen/box/multiplatform/k2/basic/noArgActualConstructor.kt"); } + @Test + @TestMetadata("nonExternalEquals.kt") + public void testNonExternalEquals() throws Exception { + runTest("compiler/testData/codegen/box/multiplatform/k2/basic/nonExternalEquals.kt"); + } + @Test @TestMetadata("removeExpectDeclarationsFromMetadata.kt") public void testRemoveExpectDeclarationsFromMetadata() 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 261a4bb5f75..3ef74577dbc 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 @@ -33399,6 +33399,12 @@ public class FirPsiBlackBoxCodegenTestGenerated extends AbstractFirPsiBlackBoxCo runTest("compiler/testData/codegen/box/multiplatform/k2/basic/noArgActualConstructor.kt"); } + @Test + @TestMetadata("nonExternalEquals.kt") + public void testNonExternalEquals() throws Exception { + runTest("compiler/testData/codegen/box/multiplatform/k2/basic/nonExternalEquals.kt"); + } + @Test @TestMetadata("removeExpectDeclarationsFromMetadata.kt") public void testRemoveExpectDeclarationsFromMetadata() throws Exception { diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/mpp/FirExpectActualResolver.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/mpp/FirExpectActualResolver.kt index 34baecd3485..46d8b231a3c 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/mpp/FirExpectActualResolver.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/mpp/FirExpectActualResolver.kt @@ -186,6 +186,9 @@ object FirExpectActualResolver { outer@ for (expectMember in expectClassSymbol.getMembers(scopeSession)) { // if (expectMember is CallableMemberDescriptor && !expectMember.kind.isReal) continue + // Skip non-expect declarations like equals, hashCode, toString and any inherited declarations from non-expect super types. + if (expectMember is FirCallableSymbol && !expectMember.isExpect) continue + val actualMembers = when (expectMember) { is FirConstructorSymbol -> actualConstructors else -> actualMembersByName[expectMember.name]?.filter { actualMember -> diff --git a/compiler/testData/codegen/box/multiplatform/k2/basic/nonExternalEquals.kt b/compiler/testData/codegen/box/multiplatform/k2/basic/nonExternalEquals.kt new file mode 100644 index 00000000000..46d02f24458 --- /dev/null +++ b/compiler/testData/codegen/box/multiplatform/k2/basic/nonExternalEquals.kt @@ -0,0 +1,27 @@ +// !LANGUAGE: +MultiPlatformProjects +// IGNORE_BACKEND_K1: ANY +// IGNORE_BACKEND: WASM +// MODULE: common +// FILE: common.kt + +open class Base { + open operator fun plus(b: Base) = Base() +} + +expect open class Derived constructor() : Base() { +} + +// MODULE: main()()(common) +// FILE: main.kt + +actual open class Derived : Base() { + // Any.equals is is external on Native but because it's not expect, it's ok to override without external + override fun equals(other: Any?): Boolean = other === this + override fun hashCode() = 1 + override fun toString() = "Derived" + + // no operator modifier is legal because Base.plus is not expect + override fun plus(b: Base) = Derived() +} + +fun box() = "OK" 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 19ec0fc66c2..e39c61fe1c2 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 @@ -32013,6 +32013,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/multiplatform/k2/basic/noArgActualConstructor.kt"); } + @Test + @TestMetadata("nonExternalEquals.kt") + public void testNonExternalEquals() throws Exception { + runTest("compiler/testData/codegen/box/multiplatform/k2/basic/nonExternalEquals.kt"); + } + @Test @TestMetadata("removeExpectDeclarationsFromMetadata.kt") public void testRemoveExpectDeclarationsFromMetadata() 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 9d63dc787b4..23ace5fa0cb 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 @@ -33399,6 +33399,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/multiplatform/k2/basic/noArgActualConstructor.kt"); } + @Test + @TestMetadata("nonExternalEquals.kt") + public void testNonExternalEquals() throws Exception { + runTest("compiler/testData/codegen/box/multiplatform/k2/basic/nonExternalEquals.kt"); + } + @Test @TestMetadata("removeExpectDeclarationsFromMetadata.kt") public void testRemoveExpectDeclarationsFromMetadata() 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 76bf8a703f2..42fba17435d 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 @@ -33399,6 +33399,12 @@ public class IrBlackBoxCodegenWithIrInlinerTestGenerated extends AbstractIrBlack runTest("compiler/testData/codegen/box/multiplatform/k2/basic/noArgActualConstructor.kt"); } + @Test + @TestMetadata("nonExternalEquals.kt") + public void testNonExternalEquals() throws Exception { + runTest("compiler/testData/codegen/box/multiplatform/k2/basic/nonExternalEquals.kt"); + } + @Test @TestMetadata("removeExpectDeclarationsFromMetadata.kt") public void testRemoveExpectDeclarationsFromMetadata() 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 28c008dbe82..7996376e859 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -27266,6 +27266,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes public void testKt_56329() throws Exception { runTest("compiler/testData/codegen/box/multiplatform/k2/basic/kt-56329.kt"); } + + @TestMetadata("nonExternalEquals.kt") + public void testNonExternalEquals() throws Exception { + runTest("compiler/testData/codegen/box/multiplatform/k2/basic/nonExternalEquals.kt"); + } } @TestMetadata("compiler/testData/codegen/box/multiplatform/k2/defaultArguments") diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/JsCodegenBoxTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/JsCodegenBoxTestGenerated.java index 222fceeb5b8..f462f406fe2 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/JsCodegenBoxTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/JsCodegenBoxTestGenerated.java @@ -23207,6 +23207,12 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest { runTest("compiler/testData/codegen/box/multiplatform/k2/basic/kt-56329.kt"); } + @Test + @TestMetadata("nonExternalEquals.kt") + public void testNonExternalEquals() throws Exception { + runTest("compiler/testData/codegen/box/multiplatform/k2/basic/nonExternalEquals.kt"); + } + @Test @TestMetadata("removeExpectDeclarationsFromMetadata.kt") public void testRemoveExpectDeclarationsFromMetadata() throws Exception { diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirJsCodegenBoxTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirJsCodegenBoxTestGenerated.java index 3b4be08bbb3..7523c434fa7 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirJsCodegenBoxTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirJsCodegenBoxTestGenerated.java @@ -23321,6 +23321,12 @@ public class FirJsCodegenBoxTestGenerated extends AbstractFirJsCodegenBoxTest { runTest("compiler/testData/codegen/box/multiplatform/k2/basic/kt-56329.kt"); } + @Test + @TestMetadata("nonExternalEquals.kt") + public void testNonExternalEquals() throws Exception { + runTest("compiler/testData/codegen/box/multiplatform/k2/basic/nonExternalEquals.kt"); + } + @Test @TestMetadata("removeExpectDeclarationsFromMetadata.kt") public void testRemoveExpectDeclarationsFromMetadata() throws Exception { diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrJsCodegenBoxTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrJsCodegenBoxTestGenerated.java index b7efaa61f9d..7900ea46ea1 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrJsCodegenBoxTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrJsCodegenBoxTestGenerated.java @@ -23321,6 +23321,12 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest { runTest("compiler/testData/codegen/box/multiplatform/k2/basic/kt-56329.kt"); } + @Test + @TestMetadata("nonExternalEquals.kt") + public void testNonExternalEquals() throws Exception { + runTest("compiler/testData/codegen/box/multiplatform/k2/basic/nonExternalEquals.kt"); + } + @Test @TestMetadata("removeExpectDeclarationsFromMetadata.kt") public void testRemoveExpectDeclarationsFromMetadata() throws Exception { diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrJsES6CodegenBoxTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrJsES6CodegenBoxTestGenerated.java index 85087e765a4..7762c2a8dbc 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrJsES6CodegenBoxTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrJsES6CodegenBoxTestGenerated.java @@ -23321,6 +23321,12 @@ public class IrJsES6CodegenBoxTestGenerated extends AbstractIrJsES6CodegenBoxTes runTest("compiler/testData/codegen/box/multiplatform/k2/basic/kt-56329.kt"); } + @Test + @TestMetadata("nonExternalEquals.kt") + public void testNonExternalEquals() throws Exception { + runTest("compiler/testData/codegen/box/multiplatform/k2/basic/nonExternalEquals.kt"); + } + @Test @TestMetadata("removeExpectDeclarationsFromMetadata.kt") public void testRemoveExpectDeclarationsFromMetadata() throws Exception { diff --git a/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/FirNativeCodegenBoxTestGenerated.java b/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/FirNativeCodegenBoxTestGenerated.java index 9fe3e038f2b..b3e9f5b0666 100644 --- a/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/FirNativeCodegenBoxTestGenerated.java +++ b/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/FirNativeCodegenBoxTestGenerated.java @@ -26747,6 +26747,12 @@ public class FirNativeCodegenBoxTestGenerated extends AbstractNativeCodegenBoxTe runTest("compiler/testData/codegen/box/multiplatform/k2/basic/kt-56329.kt"); } + @Test + @TestMetadata("nonExternalEquals.kt") + public void testNonExternalEquals() throws Exception { + runTest("compiler/testData/codegen/box/multiplatform/k2/basic/nonExternalEquals.kt"); + } + @Test @TestMetadata("removeExpectDeclarationsFromMetadata.kt") public void testRemoveExpectDeclarationsFromMetadata() throws Exception { diff --git a/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/K1NativeCodegenBoxTestGenerated.java b/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/K1NativeCodegenBoxTestGenerated.java index ff8cf528925..9ad7d46f78f 100644 --- a/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/K1NativeCodegenBoxTestGenerated.java +++ b/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/K1NativeCodegenBoxTestGenerated.java @@ -26444,6 +26444,12 @@ public class K1NativeCodegenBoxTestGenerated extends AbstractNativeCodegenBoxTes runTest("compiler/testData/codegen/box/multiplatform/k2/basic/kt-56329.kt"); } + @Test + @TestMetadata("nonExternalEquals.kt") + public void testNonExternalEquals() throws Exception { + runTest("compiler/testData/codegen/box/multiplatform/k2/basic/nonExternalEquals.kt"); + } + @Test @TestMetadata("removeExpectDeclarationsFromMetadata.kt") public void testRemoveExpectDeclarationsFromMetadata() throws Exception { diff --git a/wasm/wasm.tests/tests-gen/org/jetbrains/kotlin/wasm/test/IrCodegenBoxWasmTestGenerated.java b/wasm/wasm.tests/tests-gen/org/jetbrains/kotlin/wasm/test/IrCodegenBoxWasmTestGenerated.java index 58947524255..daac4576478 100644 --- a/wasm/wasm.tests/tests-gen/org/jetbrains/kotlin/wasm/test/IrCodegenBoxWasmTestGenerated.java +++ b/wasm/wasm.tests/tests-gen/org/jetbrains/kotlin/wasm/test/IrCodegenBoxWasmTestGenerated.java @@ -20785,6 +20785,11 @@ public class IrCodegenBoxWasmTestGenerated extends AbstractIrCodegenBoxWasmTest runTest("compiler/testData/codegen/box/multiplatform/k2/basic/kt-56329.kt"); } + @TestMetadata("nonExternalEquals.kt") + public void testNonExternalEquals() throws Exception { + runTest("compiler/testData/codegen/box/multiplatform/k2/basic/nonExternalEquals.kt"); + } + @TestMetadata("removeExpectDeclarationsFromMetadata.kt") public void testRemoveExpectDeclarationsFromMetadata() throws Exception { runTest("compiler/testData/codegen/box/multiplatform/k2/basic/removeExpectDeclarationsFromMetadata.kt");