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 35f3ec39f06..f71ce62170b 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 @@ -79,8 +79,13 @@ class FirExpectActualMatchingContext( get() = asSymbol().resolvedStatus.isInline override val RegularClassSymbolMarker.isValue: Boolean get() = asSymbol().resolvedStatus.isInline + + /* + * In this context java interfaces should be considered as not fun interface, so they will be later checked by [isNotSamInterface] function + */ override val RegularClassSymbolMarker.isFun: Boolean - get() = asSymbol().resolvedStatus.isFun + get() = asSymbol().takeUnless { it.origin is FirDeclarationOrigin.Java }?.resolvedStatus?.isFun ?: false + override val ClassLikeSymbolMarker.typeParameters: List get() = asSymbol().typeParameterSymbols 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 a3779cad8bc..ba210f8b170 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 @@ -367,7 +367,12 @@ internal abstract class IrExpectActualMatchingContext( } override fun RegularClassSymbolMarker.isNotSamInterface(): Boolean { - // TODO: is it correct for java classes? + /* + * This is incorrect for java classes (because all java interfaces are considered as fun interfaces), + * but it's fine to not to check if some java interfaces is really SAM or not, because if one + * tries to actualize `expect fun interface` with typealias to non-SAM java interface, frontend + * will report an error and IR matching won't be invoked + */ return !asIr().isFun } diff --git a/compiler/testData/diagnostics/tests/multiplatform/headerClass/expectFunInterface.fir.kt b/compiler/testData/diagnostics/tests/multiplatform/headerClass/expectFunInterface.fir.kt index c52d8a335f4..803ad895112 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/headerClass/expectFunInterface.fir.kt +++ b/compiler/testData/diagnostics/tests/multiplatform/headerClass/expectFunInterface.fir.kt @@ -25,8 +25,19 @@ expect fun interface F5 { fun run() } +expect fun interface F7 { + fun run() +} + // MODULE: m2-jvm()()(m1-common) +// FILE: NotSam.java +public interface NotSam { + void run(); + void somehtingElse(); +} + +// FILE: main.kt actual fun interface F1 { actual fun run() } @@ -52,3 +63,5 @@ interface F6Typealias { } actual typealias F6 = F6Typealias + +actual typealias F7 = NotSam diff --git a/compiler/testData/diagnostics/tests/multiplatform/headerClass/expectFunInterface.kt b/compiler/testData/diagnostics/tests/multiplatform/headerClass/expectFunInterface.kt index 8dc49612f35..91c020d5480 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/headerClass/expectFunInterface.kt +++ b/compiler/testData/diagnostics/tests/multiplatform/headerClass/expectFunInterface.kt @@ -25,8 +25,19 @@ expect fun interface F6 { fun run() } +expect fun interface F7 { + fun run() +} + // MODULE: m2-jvm()()(m1-common) +// FILE: NotSam.java +public interface NotSam { + void run(); + void somehtingElse(); +} + +// FILE: main.kt actual fun interface F1 { actual fun run() } @@ -51,4 +62,6 @@ interface F6Typealias { fun run() } -actual typealias F6 = F6Typealias \ No newline at end of file +actual typealias F6 = F6Typealias + +actual typealias F7 = NotSam