diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/mpp/FirExpectActualMatchingContext.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/mpp/FirExpectActualMatchingContext.kt index 73b4ffdafb1..35f3ec39f06 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/mpp/FirExpectActualMatchingContext.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/mpp/FirExpectActualMatchingContext.kt @@ -37,6 +37,9 @@ class FirExpectActualMatchingContext( override val shouldCheckReturnTypesOfCallables: Boolean get() = false + override val enumConstructorsAreAlwaysCompatible: Boolean + get() = true + private fun CallableSymbolMarker.asSymbol(): FirCallableSymbol<*> = this as FirCallableSymbol<*> private fun FunctionSymbolMarker.asSymbol(): FirFunctionSymbol<*> = this as FirFunctionSymbol<*> private fun PropertySymbolMarker.asSymbol(): FirPropertySymbol = this as FirPropertySymbol @@ -260,14 +263,7 @@ class FirExpectActualMatchingContext( override fun CallableSymbolMarker.shouldSkipMatching(containingExpectClass: RegularClassSymbolMarker): Boolean { val symbol = asSymbol() val classSymbol = containingExpectClass.asSymbol() - val isConstructor = symbol is FirConstructorSymbol - if (isConstructor && classSymbol.classKind.isEnumClass) { - /* - * Expect enums in FIR have (expect) constructors, but actually there is no need to map them - */ - return true - } - if (!isConstructor && symbol.dispatchReceiverType?.classId != classSymbol.classId) { + if (symbol !is FirConstructorSymbol && symbol.dispatchReceiverType?.classId != classSymbol.classId) { // Skip fake overrides return true } diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/actualizer/IrExpectActualMatchingContext.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/actualizer/IrExpectActualMatchingContext.kt index 442dcf1f77f..a3779cad8bc 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/actualizer/IrExpectActualMatchingContext.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/actualizer/IrExpectActualMatchingContext.kt @@ -77,6 +77,9 @@ internal abstract class IrExpectActualMatchingContext( override val innerClassesCapturesOuterTypeParameters: Boolean get() = false + override val enumConstructorsAreAlwaysCompatible: Boolean + get() = true + override val RegularClassSymbolMarker.classId: ClassId get() = asIr().classIdOrFail diff --git a/compiler/resolution.common/src/org/jetbrains/kotlin/resolve/calls/mpp/AbstractExpectActualCompatibilityChecker.kt b/compiler/resolution.common/src/org/jetbrains/kotlin/resolve/calls/mpp/AbstractExpectActualCompatibilityChecker.kt index de69bfb6da6..d5b8418312b 100644 --- a/compiler/resolution.common/src/org/jetbrains/kotlin/resolve/calls/mpp/AbstractExpectActualCompatibilityChecker.kt +++ b/compiler/resolution.common/src/org/jetbrains/kotlin/resolve/calls/mpp/AbstractExpectActualCompatibilityChecker.kt @@ -256,6 +256,16 @@ object AbstractExpectActualCompatibilityChecker { return Incompatible.CallableKind } + if ( + enumConstructorsAreAlwaysCompatible && + expectContainingClass?.classKind == ClassKind.ENUM_CLASS && + actualContainingClass?.classKind == ClassKind.ENUM_CLASS && + expectDeclaration is ConstructorSymbolMarker && + actualDeclaration is ConstructorSymbolMarker + ) { + return ExpectActualCompatibility.Compatible + } + val expectedReceiverType = expectDeclaration.extensionReceiverType val actualReceiverType = actualDeclaration.extensionReceiverType if ((expectedReceiverType != null) != (actualReceiverType != null)) { diff --git a/compiler/resolution.common/src/org/jetbrains/kotlin/resolve/calls/mpp/ExpectActualMatchingContext.kt b/compiler/resolution.common/src/org/jetbrains/kotlin/resolve/calls/mpp/ExpectActualMatchingContext.kt index e2bf664601a..192943cc8f5 100644 --- a/compiler/resolution.common/src/org/jetbrains/kotlin/resolve/calls/mpp/ExpectActualMatchingContext.kt +++ b/compiler/resolution.common/src/org/jetbrains/kotlin/resolve/calls/mpp/ExpectActualMatchingContext.kt @@ -36,6 +36,9 @@ interface ExpectActualMatchingContext : TypeSystemC val innerClassesCapturesOuterTypeParameters: Boolean get() = true + val enumConstructorsAreAlwaysCompatible: Boolean + get() = false + val RegularClassSymbolMarker.classId: ClassId val TypeAliasSymbolMarker.classId: ClassId val CallableSymbolMarker.callableId: CallableId diff --git a/compiler/testData/diagnostics/tests/multiplatform/enum/javaEnum.fir.kt b/compiler/testData/diagnostics/tests/multiplatform/enum/javaEnum.fir.kt deleted file mode 100644 index 3bb2c1601ea..00000000000 --- a/compiler/testData/diagnostics/tests/multiplatform/enum/javaEnum.fir.kt +++ /dev/null @@ -1,34 +0,0 @@ -// MODULE: m1-common -// FILE: common.kt - -expect enum class Foo { - ENTRY -} - -expect enum class _TimeUnit - -// MODULE: m2-jvm()()(m1-common) -// FILE: jvm.kt - -actual typealias Foo = FooImpl - -actual typealias _TimeUnit = java.util.concurrent.TimeUnit - -// FILE: FooImpl.java - -public enum FooImpl { - ENTRY("OK") { - @Override - public String getResult() { - return value; - } - }; - - protected final String value; - - public FooImpl(String value) { - this.value = value; - } - - public abstract String getResult(); -} diff --git a/compiler/testData/diagnostics/tests/multiplatform/enum/javaEnum.kt b/compiler/testData/diagnostics/tests/multiplatform/enum/javaEnum.kt index 727c918af54..ab192066c68 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/enum/javaEnum.kt +++ b/compiler/testData/diagnostics/tests/multiplatform/enum/javaEnum.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // MODULE: m1-common // FILE: common.kt diff --git a/compiler/testData/diagnostics/tests/multiplatform/enum/simpleEnum.fir.kt b/compiler/testData/diagnostics/tests/multiplatform/enum/simpleEnum.fir.kt deleted file mode 100644 index eb4776a61fa..00000000000 --- a/compiler/testData/diagnostics/tests/multiplatform/enum/simpleEnum.fir.kt +++ /dev/null @@ -1,17 +0,0 @@ -// MODULE: m1-common -// FILE: common.kt - -expect enum class Foo { - ENTRY1, - ENTRY2, - ENTRY3; -} - -// MODULE: m2-jvm()()(m1-common) -// FILE: jvm.kt - -actual enum class Foo(val x: String) { - ENTRY1("1"), - ENTRY2("2"), - ENTRY3("3"); -} diff --git a/compiler/testData/diagnostics/tests/multiplatform/enum/simpleEnum.kt b/compiler/testData/diagnostics/tests/multiplatform/enum/simpleEnum.kt index 5261c676cf1..e465c204f82 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/enum/simpleEnum.kt +++ b/compiler/testData/diagnostics/tests/multiplatform/enum/simpleEnum.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // MODULE: m1-common // FILE: common.kt