From c214c5445adf5c73e04b5ff1404b84aaad9b5e10 Mon Sep 17 00:00:00 2001 From: Nikita Bobko Date: Wed, 17 Jan 2024 19:36:28 +0100 Subject: [PATCH] [FIR] Implement EXPECT_AND_ACTUAL_IN_THE_SAME_MODULE ^KT-60367 Fixed KT review: https://jetbrains.team/p/kt/reviews/14064/timeline IJ review: https://jetbrains.team/p/ij/reviews/124657/timeline --- .../diagnostics/KtFirDataClassConverters.kt | 7 ++++ .../api/fir/diagnostics/KtFirDiagnostics.kt | 5 +++ .../fir/diagnostics/KtFirDiagnosticsImpl.kt | 6 ++++ ...CompilerTestFE10TestdataTestGenerated.java | 18 ++++++++++ ...sticCompilerFE10TestDataTestGenerated.java | 18 ++++++++++ ...DiagnosticsWithLightTreeTestGenerated.java | 18 ++++++++++ ...endMPPDiagnosticsWithPsiTestGenerated.java | 18 ++++++++++ .../diagnostics/FirDiagnosticsList.kt | 3 ++ .../fir/analysis/diagnostics/FirErrors.kt | 1 + .../FirNonSuppressibleErrorNames.kt | 1 + .../analysis/checkers/FirConflictsHelpers.kt | 4 +-- .../FirConflictsDeclarationChecker.kt | 27 +++++++------- .../diagnostics/FirErrorsDefaultMessages.kt | 3 ++ .../metadata/inheritorOfExpectSealedClass.out | 6 ++++ .../expectActualInTheSameModule.fir.kt | 11 ++++++ .../expectActualInTheSameModule.kt | 11 ++++++ ...ActualInTheSameModuleDifferentFiles.fir.kt | 15 ++++++++ ...pectActualInTheSameModuleDifferentFiles.kt | 15 ++++++++ ...tActualInTheSameModuleDifferentFiles.ll.kt | 15 ++++++++ ...alMainInTheSameModuleDifferentFiles.fir.kt | 13 +++++++ ...ActualMainInTheSameModuleDifferentFiles.kt | 13 +++++++ .../expectAndActualInTheSameModule.fir.kt | 36 +++++++++---------- ...ualInTheSameModuleIncompatibilities.fir.kt | 4 +-- .../noMultiplatformProjects.fir.kt | 4 +-- .../test/runners/DiagnosticTestGenerated.java | 18 ++++++++++ 25 files changed, 254 insertions(+), 36 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/multiplatform/expectActualInTheSameModule.fir.kt create mode 100644 compiler/testData/diagnostics/tests/multiplatform/expectActualInTheSameModule.kt create mode 100644 compiler/testData/diagnostics/tests/multiplatform/expectActualInTheSameModuleDifferentFiles.fir.kt create mode 100644 compiler/testData/diagnostics/tests/multiplatform/expectActualInTheSameModuleDifferentFiles.kt create mode 100644 compiler/testData/diagnostics/tests/multiplatform/expectActualInTheSameModuleDifferentFiles.ll.kt create mode 100644 compiler/testData/diagnostics/tests/multiplatform/expectActualMainInTheSameModuleDifferentFiles.fir.kt create mode 100644 compiler/testData/diagnostics/tests/multiplatform/expectActualMainInTheSameModuleDifferentFiles.kt diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDataClassConverters.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDataClassConverters.kt index 96de632134f..209c78010ba 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDataClassConverters.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDataClassConverters.kt @@ -3042,6 +3042,13 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert token, ) } + add(FirErrors.EXPECT_AND_ACTUAL_IN_THE_SAME_MODULE) { firDiagnostic -> + ExpectAndActualInTheSameModuleImpl( + firSymbolBuilder.buildSymbol(firDiagnostic.a), + firDiagnostic as KtPsiDiagnostic, + token, + ) + } add(FirErrors.METHOD_OF_ANY_IMPLEMENTED_IN_INTERFACE) { firDiagnostic -> MethodOfAnyImplementedInInterfaceImpl( firDiagnostic as KtPsiDiagnostic, diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnostics.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnostics.kt index 51d83666a02..26e78ae18eb 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnostics.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnostics.kt @@ -2151,6 +2151,11 @@ sealed interface KtFirDiagnostic : KtDiagnosticWithPsi { val conflictingDeclarations: List } + interface ExpectAndActualInTheSameModule : KtFirDiagnostic { + override val diagnosticClass get() = ExpectAndActualInTheSameModule::class + val declaration: KtSymbol + } + interface MethodOfAnyImplementedInInterface : KtFirDiagnostic { override val diagnosticClass get() = MethodOfAnyImplementedInInterface::class } diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnosticsImpl.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnosticsImpl.kt index 9a147a045b7..3384d150950 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnosticsImpl.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnosticsImpl.kt @@ -2577,6 +2577,12 @@ internal class PackageOrClassifierRedeclarationImpl( token: KtLifetimeToken, ) : KtAbstractFirDiagnostic(firDiagnostic, token), KtFirDiagnostic.PackageOrClassifierRedeclaration +internal class ExpectAndActualInTheSameModuleImpl( + override val declaration: KtSymbol, + firDiagnostic: KtPsiDiagnostic, + token: KtLifetimeToken, +) : KtAbstractFirDiagnostic(firDiagnostic, token), KtFirDiagnostic.ExpectAndActualInTheSameModule + internal class MethodOfAnyImplementedInInterfaceImpl( firDiagnostic: KtPsiDiagnostic, token: KtLifetimeToken, diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java index 18672bba892..01e35f42ece 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java @@ -24854,6 +24854,24 @@ public class DiagnosticCompilerTestFE10TestdataTestGenerated extends AbstractDia runTest("compiler/testData/diagnostics/tests/multiplatform/expectActualClassesAreInBeta_suppressWarningWithLv.kt"); } + @Test + @TestMetadata("expectActualInTheSameModule.kt") + public void testExpectActualInTheSameModule() throws Exception { + runTest("compiler/testData/diagnostics/tests/multiplatform/expectActualInTheSameModule.kt"); + } + + @Test + @TestMetadata("expectActualInTheSameModuleDifferentFiles.kt") + public void testExpectActualInTheSameModuleDifferentFiles() throws Exception { + runTest("compiler/testData/diagnostics/tests/multiplatform/expectActualInTheSameModuleDifferentFiles.kt"); + } + + @Test + @TestMetadata("expectActualMainInTheSameModuleDifferentFiles.kt") + public void testExpectActualMainInTheSameModuleDifferentFiles() throws Exception { + runTest("compiler/testData/diagnostics/tests/multiplatform/expectActualMainInTheSameModuleDifferentFiles.kt"); + } + @Test @TestMetadata("expectDataObject.kt") public void testExpectDataObject() throws Exception { diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java index 68990d48834..f060224dbf6 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java @@ -24854,6 +24854,24 @@ public class LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated runTest("compiler/testData/diagnostics/tests/multiplatform/expectActualClassesAreInBeta_suppressWarningWithLv.kt"); } + @Test + @TestMetadata("expectActualInTheSameModule.kt") + public void testExpectActualInTheSameModule() throws Exception { + runTest("compiler/testData/diagnostics/tests/multiplatform/expectActualInTheSameModule.kt"); + } + + @Test + @TestMetadata("expectActualInTheSameModuleDifferentFiles.kt") + public void testExpectActualInTheSameModuleDifferentFiles() throws Exception { + runTest("compiler/testData/diagnostics/tests/multiplatform/expectActualInTheSameModuleDifferentFiles.kt"); + } + + @Test + @TestMetadata("expectActualMainInTheSameModuleDifferentFiles.kt") + public void testExpectActualMainInTheSameModuleDifferentFiles() throws Exception { + runTest("compiler/testData/diagnostics/tests/multiplatform/expectActualMainInTheSameModuleDifferentFiles.kt"); + } + @Test @TestMetadata("expectDataObject.kt") public void testExpectDataObject() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendMPPDiagnosticsWithLightTreeTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendMPPDiagnosticsWithLightTreeTestGenerated.java index 846b2f432d0..1074010b406 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendMPPDiagnosticsWithLightTreeTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendMPPDiagnosticsWithLightTreeTestGenerated.java @@ -139,6 +139,24 @@ public class FirOldFrontendMPPDiagnosticsWithLightTreeTestGenerated extends Abst runTest("compiler/testData/diagnostics/tests/multiplatform/expectActualClassesAreInBeta_suppressWarningWithLv.kt"); } + @Test + @TestMetadata("expectActualInTheSameModule.kt") + public void testExpectActualInTheSameModule() throws Exception { + runTest("compiler/testData/diagnostics/tests/multiplatform/expectActualInTheSameModule.kt"); + } + + @Test + @TestMetadata("expectActualInTheSameModuleDifferentFiles.kt") + public void testExpectActualInTheSameModuleDifferentFiles() throws Exception { + runTest("compiler/testData/diagnostics/tests/multiplatform/expectActualInTheSameModuleDifferentFiles.kt"); + } + + @Test + @TestMetadata("expectActualMainInTheSameModuleDifferentFiles.kt") + public void testExpectActualMainInTheSameModuleDifferentFiles() throws Exception { + runTest("compiler/testData/diagnostics/tests/multiplatform/expectActualMainInTheSameModuleDifferentFiles.kt"); + } + @Test @TestMetadata("expectDataObject.kt") public void testExpectDataObject() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendMPPDiagnosticsWithPsiTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendMPPDiagnosticsWithPsiTestGenerated.java index 9d7e930d8d5..de3e49ab78e 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendMPPDiagnosticsWithPsiTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendMPPDiagnosticsWithPsiTestGenerated.java @@ -139,6 +139,24 @@ public class FirOldFrontendMPPDiagnosticsWithPsiTestGenerated extends AbstractFi runTest("compiler/testData/diagnostics/tests/multiplatform/expectActualClassesAreInBeta_suppressWarningWithLv.kt"); } + @Test + @TestMetadata("expectActualInTheSameModule.kt") + public void testExpectActualInTheSameModule() throws Exception { + runTest("compiler/testData/diagnostics/tests/multiplatform/expectActualInTheSameModule.kt"); + } + + @Test + @TestMetadata("expectActualInTheSameModuleDifferentFiles.kt") + public void testExpectActualInTheSameModuleDifferentFiles() throws Exception { + runTest("compiler/testData/diagnostics/tests/multiplatform/expectActualInTheSameModuleDifferentFiles.kt"); + } + + @Test + @TestMetadata("expectActualMainInTheSameModuleDifferentFiles.kt") + public void testExpectActualMainInTheSameModuleDifferentFiles() throws Exception { + runTest("compiler/testData/diagnostics/tests/multiplatform/expectActualMainInTheSameModuleDifferentFiles.kt"); + } + @Test @TestMetadata("expectDataObject.kt") public void testExpectDataObject() throws Exception { diff --git a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt index c0457ea7a93..94e59b4c689 100644 --- a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt +++ b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt @@ -1079,6 +1079,9 @@ object DIAGNOSTICS_LIST : DiagnosticList("FirErrors") { val PACKAGE_OR_CLASSIFIER_REDECLARATION by error(PositioningStrategy.ACTUAL_DECLARATION_NAME) { parameter>("conflictingDeclarations") } + val EXPECT_AND_ACTUAL_IN_THE_SAME_MODULE by error(PositioningStrategy.ACTUAL_DECLARATION_NAME) { + parameter("declaration") + } val METHOD_OF_ANY_IMPLEMENTED_IN_INTERFACE by error() } diff --git a/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt b/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt index 4b8ce604215..55ce585ebda 100644 --- a/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt +++ b/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt @@ -552,6 +552,7 @@ object FirErrors { val CONFLICTING_OVERLOADS: KtDiagnosticFactory1>> by error1>>(SourceElementPositioningStrategies.DECLARATION_SIGNATURE_OR_DEFAULT) val REDECLARATION: KtDiagnosticFactory1>> by error1>>(SourceElementPositioningStrategies.NAME_IDENTIFIER) val PACKAGE_OR_CLASSIFIER_REDECLARATION: KtDiagnosticFactory1>> by error1>>(SourceElementPositioningStrategies.ACTUAL_DECLARATION_NAME) + val EXPECT_AND_ACTUAL_IN_THE_SAME_MODULE: KtDiagnosticFactory1> by error1>(SourceElementPositioningStrategies.ACTUAL_DECLARATION_NAME) val METHOD_OF_ANY_IMPLEMENTED_IN_INTERFACE: KtDiagnosticFactory0 by error0() // Invalid local declarations diff --git a/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirNonSuppressibleErrorNames.kt b/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirNonSuppressibleErrorNames.kt index 94dc9a9a3c9..88f4bd89a9e 100644 --- a/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirNonSuppressibleErrorNames.kt +++ b/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirNonSuppressibleErrorNames.kt @@ -361,6 +361,7 @@ val FIR_NON_SUPPRESSIBLE_ERROR_NAMES: Set = setOf( "CONFLICTING_OVERLOADS", "REDECLARATION", "PACKAGE_OR_CLASSIFIER_REDECLARATION", + "EXPECT_AND_ACTUAL_IN_THE_SAME_MODULE", "METHOD_OF_ANY_IMPLEMENTED_IN_INTERFACE", "LOCAL_OBJECT_NOT_ALLOWED", "LOCAL_INTERFACE_NOT_ALLOWED", diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirConflictsHelpers.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirConflictsHelpers.kt index ed85f906281..1f8db2a5f9c 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirConflictsHelpers.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirConflictsHelpers.kt @@ -93,7 +93,7 @@ private val FirBasedSymbol<*>.resolvedStatus else -> null } -private fun isExpectAndActual(declaration1: FirBasedSymbol<*>, declaration2: FirBasedSymbol<*>): Boolean { +internal fun isExpectAndActual(declaration1: FirBasedSymbol<*>, declaration2: FirBasedSymbol<*>): Boolean { val status1 = declaration1.resolvedStatus ?: return false val status2 = declaration2.resolvedStatus ?: return false return (status1.isExpect && status2.isActual) || (status1.isActual && status2.isExpect) @@ -496,7 +496,7 @@ private fun FirDeclarationCollector<*>.areNonConflictingCallables( declaration: FirBasedSymbol<*>, conflicting: FirBasedSymbol<*>, ): Boolean { - if (isExpectAndActual(declaration, conflicting)) return true + if (isExpectAndActual(declaration, conflicting) && declaration.moduleData != conflicting.moduleData) return true val declarationIsLowPriority = hasLowPriorityAnnotation(declaration.annotations) val conflictingIsLowPriority = hasLowPriorityAnnotation(conflicting.annotations) diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirConflictsDeclarationChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirConflictsDeclarationChecker.kt index 588f744b7dd..7329e2b3d2a 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirConflictsDeclarationChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirConflictsDeclarationChecker.kt @@ -90,19 +90,22 @@ object FirConflictsDeclarationChecker : FirBasicDeclarationChecker(MppCheckerKin conflictingDeclaration.isPrimaryConstructor && symbols.all { it.isPrimaryConstructor } ) return@forEach - val factory = - if (conflictingDeclaration is FirNamedFunctionSymbol || conflictingDeclaration is FirConstructorSymbol) { - FirErrors.CONFLICTING_OVERLOADS - } else if (conflictingDeclaration is FirClassLikeSymbol<*> && - conflictingDeclaration.getContainingClassSymbol(context.session) == null && - symbols.any { it is FirClassLikeSymbol<*> } - ) { - FirErrors.PACKAGE_OR_CLASSIFIER_REDECLARATION - } else { - FirErrors.REDECLARATION + when { + symbols.singleOrNull()?.let { isExpectAndActual(conflictingDeclaration, it) } == true -> { + reporter.reportOn(source, FirErrors.EXPECT_AND_ACTUAL_IN_THE_SAME_MODULE, conflictingDeclaration, context) } - - reporter.reportOn(source, factory, symbols, context) + conflictingDeclaration is FirNamedFunctionSymbol || conflictingDeclaration is FirConstructorSymbol -> { + reporter.reportOn(source, FirErrors.CONFLICTING_OVERLOADS, symbols, context) + } + conflictingDeclaration is FirClassLikeSymbol<*> && + conflictingDeclaration.getContainingClassSymbol(context.session) == null && + symbols.any { it is FirClassLikeSymbol<*> } -> { + reporter.reportOn(source, FirErrors.PACKAGE_OR_CLASSIFIER_REDECLARATION, symbols, context) + } + else -> { + reporter.reportOn(source, FirErrors.REDECLARATION, symbols, context) + } + } } } diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrorsDefaultMessages.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrorsDefaultMessages.kt index 65983fdcd47..f8fed1c4800 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrorsDefaultMessages.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrorsDefaultMessages.kt @@ -501,6 +501,7 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.PACKAGE_CANNOT_BE import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.PACKAGE_OR_CLASSIFIER_REDECLARATION import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.PLATFORM_CLASS_MAPPED_TO_KOTLIN import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.COMPILER_REQUIRED_ANNOTATION_AMBIGUITY +import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.EXPECT_AND_ACTUAL_IN_THE_SAME_MODULE import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.POTENTIALLY_NON_REPORTED_ANNOTATION import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.PRE_RELEASE_CLASS import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.PRIMARY_CONSTRUCTOR_DELEGATION_CALL_EXPECTED @@ -1800,6 +1801,8 @@ object FirErrorsDefaultMessages : BaseDiagnosticRendererFactory() { map.put(CONFLICTING_OVERLOADS, "Conflicting overloads: {0}", SYMBOLS) map.put(REDECLARATION, "Conflicting declarations: {0}", SYMBOLS) map.put(PACKAGE_OR_CLASSIFIER_REDECLARATION, "Redeclaration: {0}", SYMBOLS) + map.put(EXPECT_AND_ACTUAL_IN_THE_SAME_MODULE, "{0}: expect and corresponding actual are declared in the same module", DECLARATION_NAME) + map.put(METHOD_OF_ANY_IMPLEMENTED_IN_INTERFACE, "Interfaces cannot implement a method of 'Any'.") // Invalid local declarations diff --git a/compiler/testData/cli/metadata/inheritorOfExpectSealedClass.out b/compiler/testData/cli/metadata/inheritorOfExpectSealedClass.out index 4321a1c10ef..90efc1d1501 100644 --- a/compiler/testData/cli/metadata/inheritorOfExpectSealedClass.out +++ b/compiler/testData/cli/metadata/inheritorOfExpectSealedClass.out @@ -1,4 +1,10 @@ +compiler/testData/cli/metadata/inheritorOfExpectSealedClass/common-1.kt:1:21: error: base: expect and corresponding actual are declared in the same module +expect sealed class Base + ^ compiler/testData/cli/metadata/inheritorOfExpectSealedClass/common-2.kt:1:21: error: 'actual class Base : Any' has no corresponding expected declaration +actual sealed class Base + ^ +compiler/testData/cli/metadata/inheritorOfExpectSealedClass/common-2.kt:1:21: error: base: expect and corresponding actual are declared in the same module actual sealed class Base ^ compiler/testData/cli/metadata/inheritorOfExpectSealedClass/common-3.kt:1:17: error: unresolved reference ''. diff --git a/compiler/testData/diagnostics/tests/multiplatform/expectActualInTheSameModule.fir.kt b/compiler/testData/diagnostics/tests/multiplatform/expectActualInTheSameModule.fir.kt new file mode 100644 index 00000000000..a9cb303da4c --- /dev/null +++ b/compiler/testData/diagnostics/tests/multiplatform/expectActualInTheSameModule.fir.kt @@ -0,0 +1,11 @@ +// MODULE: m1-common +// FILE: common.kt + +expect class A +actual class A + +// MODULE: m1-jvm()()(m1-common) +// FILE: jvm.kt + +expect class B +actual class B diff --git a/compiler/testData/diagnostics/tests/multiplatform/expectActualInTheSameModule.kt b/compiler/testData/diagnostics/tests/multiplatform/expectActualInTheSameModule.kt new file mode 100644 index 00000000000..cf702d927dd --- /dev/null +++ b/compiler/testData/diagnostics/tests/multiplatform/expectActualInTheSameModule.kt @@ -0,0 +1,11 @@ +// MODULE: m1-common +// FILE: common.kt + +expect class A +actual class A + +// MODULE: m1-jvm()()(m1-common) +// FILE: jvm.kt + +expect class B +actual class B diff --git a/compiler/testData/diagnostics/tests/multiplatform/expectActualInTheSameModuleDifferentFiles.fir.kt b/compiler/testData/diagnostics/tests/multiplatform/expectActualInTheSameModuleDifferentFiles.fir.kt new file mode 100644 index 00000000000..368aad02050 --- /dev/null +++ b/compiler/testData/diagnostics/tests/multiplatform/expectActualInTheSameModuleDifferentFiles.fir.kt @@ -0,0 +1,15 @@ +// MODULE: m1-common +// FILE: common.kt + +expect class A + +// FILE: common2.kt +actual class A + +// MODULE: m1-jvm()()(m1-common) +// FILE: jvm.kt + +expect class B + +// FILE: jvm2.kt +actual class B diff --git a/compiler/testData/diagnostics/tests/multiplatform/expectActualInTheSameModuleDifferentFiles.kt b/compiler/testData/diagnostics/tests/multiplatform/expectActualInTheSameModuleDifferentFiles.kt new file mode 100644 index 00000000000..67d386ff25a --- /dev/null +++ b/compiler/testData/diagnostics/tests/multiplatform/expectActualInTheSameModuleDifferentFiles.kt @@ -0,0 +1,15 @@ +// MODULE: m1-common +// FILE: common.kt + +expect class A + +// FILE: common2.kt +actual class A + +// MODULE: m1-jvm()()(m1-common) +// FILE: jvm.kt + +expect class B + +// FILE: jvm2.kt +actual class B diff --git a/compiler/testData/diagnostics/tests/multiplatform/expectActualInTheSameModuleDifferentFiles.ll.kt b/compiler/testData/diagnostics/tests/multiplatform/expectActualInTheSameModuleDifferentFiles.ll.kt new file mode 100644 index 00000000000..48c1f284fed --- /dev/null +++ b/compiler/testData/diagnostics/tests/multiplatform/expectActualInTheSameModuleDifferentFiles.ll.kt @@ -0,0 +1,15 @@ +// MODULE: m1-common +// FILE: common.kt + +expect class A + +// FILE: common2.kt +actual class A + +// MODULE: m1-jvm()()(m1-common) +// FILE: jvm.kt + +expect class B + +// FILE: jvm2.kt +actual class B diff --git a/compiler/testData/diagnostics/tests/multiplatform/expectActualMainInTheSameModuleDifferentFiles.fir.kt b/compiler/testData/diagnostics/tests/multiplatform/expectActualMainInTheSameModuleDifferentFiles.fir.kt new file mode 100644 index 00000000000..bcb8c0eb00f --- /dev/null +++ b/compiler/testData/diagnostics/tests/multiplatform/expectActualMainInTheSameModuleDifferentFiles.fir.kt @@ -0,0 +1,13 @@ +// MODULE: m1-common +// FILE: common.kt +expect fun main() + +// FILE: common2.kt +actual fun main() {} + +// MODULE: m1-jvm()()(m1-common) +// FILE: jvm.kt +expect fun main() + +// FILE: jvm2.kt +actual fun main() {} diff --git a/compiler/testData/diagnostics/tests/multiplatform/expectActualMainInTheSameModuleDifferentFiles.kt b/compiler/testData/diagnostics/tests/multiplatform/expectActualMainInTheSameModuleDifferentFiles.kt new file mode 100644 index 00000000000..a44182aa688 --- /dev/null +++ b/compiler/testData/diagnostics/tests/multiplatform/expectActualMainInTheSameModuleDifferentFiles.kt @@ -0,0 +1,13 @@ +// MODULE: m1-common +// FILE: common.kt +expect fun main() + +// FILE: common2.kt +actual fun main() {} + +// MODULE: m1-jvm()()(m1-common) +// FILE: jvm.kt +expect fun main() + +// FILE: jvm2.kt +actual fun main() {} diff --git a/compiler/testData/diagnostics/tests/multiplatform/hmpp/multiplatformCompositeAnalysis/expectAndActualInTheSameModule.fir.kt b/compiler/testData/diagnostics/tests/multiplatform/hmpp/multiplatformCompositeAnalysis/expectAndActualInTheSameModule.fir.kt index 73d27736950..4a024622368 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/hmpp/multiplatformCompositeAnalysis/expectAndActualInTheSameModule.fir.kt +++ b/compiler/testData/diagnostics/tests/multiplatform/hmpp/multiplatformCompositeAnalysis/expectAndActualInTheSameModule.fir.kt @@ -1,67 +1,67 @@ // MODULE: common // TARGET_PLATFORM: Common -expect class CommonClass { +expect class CommonClass { fun memberFun() val memberProp: Int class Nested inner class Inner } -actual class CommonClass { +actual class CommonClass { actual fun memberFun() {} actual val memberProp: Int = 42 actual class Nested actual inner class Inner } -expect fun commonFun() -actual fun commonFun() {} +expect fun commonFun() +actual fun commonFun() {} -expect val commonProperty: String -actual val commonProperty: String +expect val commonProperty: String +actual val commonProperty: String get() = "hello" // MODULE: intermediate()()(common) // TARGET_PLATFORM: Common -expect class IntermediateClass { +expect class IntermediateClass { fun memberFun() val memberProp: Int class Nested inner class Inner } -actual class IntermediateClass { +actual class IntermediateClass { actual fun memberFun() {} actual val memberProp: Int = 42 actual class Nested actual inner class Inner } -expect fun intermediateFun() -actual fun intermediateFun() {} +expect fun intermediateFun() +actual fun intermediateFun() {} -expect val intermediateProperty: String -actual val intermediateProperty: String +expect val intermediateProperty: String +actual val intermediateProperty: String get() = "hello" // MODULE: main()()(intermediate) -expect class PlatformClass { +expect class PlatformClass { fun memberFun() val memberProp: Int class Nested inner class Inner } -actual class PlatformClass { +actual class PlatformClass { actual fun memberFun() {} actual val memberProp: Int = 42 actual class Nested actual inner class Inner } -expect fun platformFun() -actual fun platformFun() {} +expect fun platformFun() +actual fun platformFun() {} -expect val platformProperty: String -actual val platformProperty: String +expect val platformProperty: String +actual val platformProperty: String get() = "hello" diff --git a/compiler/testData/diagnostics/tests/multiplatform/hmpp/multiplatformCompositeAnalysis/expectAndActualInTheSameModuleIncompatibilities.fir.kt b/compiler/testData/diagnostics/tests/multiplatform/hmpp/multiplatformCompositeAnalysis/expectAndActualInTheSameModuleIncompatibilities.fir.kt index 1800c77f35f..d788fc5faf5 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/hmpp/multiplatformCompositeAnalysis/expectAndActualInTheSameModuleIncompatibilities.fir.kt +++ b/compiler/testData/diagnostics/tests/multiplatform/hmpp/multiplatformCompositeAnalysis/expectAndActualInTheSameModuleIncompatibilities.fir.kt @@ -13,10 +13,10 @@ val callableKind: Int = 1 expect fun typeParameterCount() fun typeParameterCount() {} -expect enum class EnumEntries { +expect enum class EnumEntries { ONE, TWO; } -actual enum class EnumEntries { +actual enum class EnumEntries { ONE; } diff --git a/compiler/testData/diagnostics/tests/sourceCompatibility/noMultiplatformProjects.fir.kt b/compiler/testData/diagnostics/tests/sourceCompatibility/noMultiplatformProjects.fir.kt index 0224f2100f1..2d51e88cacd 100644 --- a/compiler/testData/diagnostics/tests/sourceCompatibility/noMultiplatformProjects.fir.kt +++ b/compiler/testData/diagnostics/tests/sourceCompatibility/noMultiplatformProjects.fir.kt @@ -1,6 +1,6 @@ expect fun foo1() expect val bar1 = 42 -expect class ImplicitExpect { +expect class ImplicitExpect { fun foo() val x: Int class Inner @@ -16,7 +16,7 @@ actual val bar2: Int actual interface Baz2 -actual class ImplicitExpect { +actual class ImplicitExpect { actual fun foo() { } actual val x: Int = 0 diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java index 1e055a12758..36da918d95c 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java @@ -24854,6 +24854,24 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest { runTest("compiler/testData/diagnostics/tests/multiplatform/expectActualClassesAreInBeta_suppressWarningWithLv.kt"); } + @Test + @TestMetadata("expectActualInTheSameModule.kt") + public void testExpectActualInTheSameModule() throws Exception { + runTest("compiler/testData/diagnostics/tests/multiplatform/expectActualInTheSameModule.kt"); + } + + @Test + @TestMetadata("expectActualInTheSameModuleDifferentFiles.kt") + public void testExpectActualInTheSameModuleDifferentFiles() throws Exception { + runTest("compiler/testData/diagnostics/tests/multiplatform/expectActualInTheSameModuleDifferentFiles.kt"); + } + + @Test + @TestMetadata("expectActualMainInTheSameModuleDifferentFiles.kt") + public void testExpectActualMainInTheSameModuleDifferentFiles() throws Exception { + runTest("compiler/testData/diagnostics/tests/multiplatform/expectActualMainInTheSameModuleDifferentFiles.kt"); + } + @Test @TestMetadata("expectDataObject.kt") public void testExpectDataObject() throws Exception {