[FE] Prohibit expect fun interface to have non-fun actual counterpart

In K1 .isFun is always false for Java classes, so extra check
is added for that. This is not needed for K2, because .isFun is
true for all Java classes. Here it is not necessary to check
that interface has only one method, because such check will be
done in the place where interface implementation is created.

^KT-39362 Fixed
This commit is contained in:
Roman Efremov
2023-04-04 16:02:39 +02:00
committed by Space Team
parent 59d126abc5
commit 456d3e0f42
12 changed files with 170 additions and 1 deletions
@@ -414,6 +414,12 @@ public class FirOldFrontendMPPDiagnosticsWithLightTreeTestGenerated extends Abst
runTest("compiler/testData/diagnostics/tests/multiplatform/headerClass/expectFinalActualOpen.kt");
}
@Test
@TestMetadata("expectFunInterface.kt")
public void testExpectFunInterface() throws Exception {
runTest("compiler/testData/diagnostics/tests/multiplatform/headerClass/expectFunInterface.kt");
}
@Test
@TestMetadata("explicitConstructorDelegation.kt")
public void testExplicitConstructorDelegation() throws Exception {
@@ -414,6 +414,12 @@ public class FirOldFrontendMPPDiagnosticsWithPsiTestGenerated extends AbstractFi
runTest("compiler/testData/diagnostics/tests/multiplatform/headerClass/expectFinalActualOpen.kt");
}
@Test
@TestMetadata("expectFunInterface.kt")
public void testExpectFunInterface() throws Exception {
runTest("compiler/testData/diagnostics/tests/multiplatform/headerClass/expectFunInterface.kt");
}
@Test
@TestMetadata("explicitConstructorDelegation.kt")
public void testExplicitConstructorDelegation() throws Exception {
@@ -123,6 +123,9 @@ object FirExpectActualResolver {
if (!equalBy(expectClassSymbol, actualClass) { listOf(it.isCompanion, it.isInner, it.isInline /*|| it.isValue*/) }) {
return ExpectActualCompatibility.Incompatible.ClassModifiers
}
if (expectClassSymbol.isFun && !actualClass.isFun) {
return ExpectActualCompatibility.Incompatible.FunInterfaceModifier
}
val expectTypeParameterSymbols = expectClassSymbol.typeParameterSymbols
val actualTypeParameterSymbols = actualClass.typeParameterSymbols