From 205690b220b1207d0bc6c98d22a45a4669eb2441 Mon Sep 17 00:00:00 2001 From: Roman Efremov Date: Mon, 20 Nov 2023 14:06:04 +0100 Subject: [PATCH] [IR] Fix incorrect matching of nested classes when actualized via typealias Also, add tests for the cases when expect and actual nested classes have no compatible matching to check new logic doesn't crash. ^KT-31636 --- ...CompilerTestFE10TestdataTestGenerated.java | 18 ++++++ ...sticCompilerFE10TestDataTestGenerated.java | 18 ++++++ ...DiagnosticsWithLightTreeTestGenerated.java | 18 ++++++ ...endMPPDiagnosticsWithPsiTestGenerated.java | 18 ++++++ .../actualizer/ExpectActualCollector.kt | 63 ++++++++++++++++--- .../org/jetbrains/kotlin/ir/util/IrUtils.kt | 5 ++ ...edAnnotationClassViaActualTypeAlias.fir.kt | 4 +- ...tedAnnotationClassViaActualTypeAlias.ll.kt | 20 ------ .../actualTypealiasWithoutExpect.kt | 9 +++ ...ssWithNestedClassViaActualTypeAlias.fir.kt | 2 +- ...assWithNestedClassViaActualTypeAlias.ll.kt | 27 -------- ...edAnnotationClassViaActualTypealias.fir.kt | 8 +-- ...nestedAnnotationClassViaActualTypealias.kt | 2 +- ...tedAnnotationClassViaActualTypealias.ll.kt | 14 ----- ...aNestedClassOnActualViaActualTypealias.kt} | 10 ++- .../nestedClassViaActualTypealias.fir.kt | 20 +++--- .../nestedClassViaActualTypealias.ll.kt | 31 --------- ...ViaActualTypealiasExpandInTypeParam.fir.kt | 10 +-- ...ViaActualTypealiasIncompatibilities.fir.kt | 14 +++++ ...lassViaActualTypealiasIncompatibilities.kt | 14 +++++ ...sViaActualTypealiasIncompatibilities.ll.kt | 14 +++++ .../test/runners/DiagnosticTestGenerated.java | 18 ++++++ 22 files changed, 228 insertions(+), 129 deletions(-) delete mode 100644 compiler/testData/diagnostics/tests/multiplatform/actualAnnotationsNotMatchExpect/nestedAnnotationClassViaActualTypeAlias.ll.kt create mode 100644 compiler/testData/diagnostics/tests/multiplatform/actualTypealiasWithoutExpect.kt delete mode 100644 compiler/testData/diagnostics/tests/multiplatform/defaultArguments/annotationDefaultArgKclassWithNestedClassViaActualTypeAlias.ll.kt delete mode 100644 compiler/testData/diagnostics/tests/multiplatform/defaultArguments/nestedAnnotationClassViaActualTypealias.ll.kt rename compiler/testData/diagnostics/tests/multiplatform/{nestedClassViaActualTypealiasExpandInTypeParam.ll.kt => extraNestedClassOnActualViaActualTypealias.kt} (58%) delete mode 100644 compiler/testData/diagnostics/tests/multiplatform/nestedClassViaActualTypealias.ll.kt create mode 100644 compiler/testData/diagnostics/tests/multiplatform/nestedClassViaActualTypealiasIncompatibilities.fir.kt create mode 100644 compiler/testData/diagnostics/tests/multiplatform/nestedClassViaActualTypealiasIncompatibilities.kt create mode 100644 compiler/testData/diagnostics/tests/multiplatform/nestedClassViaActualTypealiasIncompatibilities.ll.kt 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 bdfebc42273..614d70e68f4 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 @@ -23725,6 +23725,12 @@ public class DiagnosticCompilerTestFE10TestdataTestGenerated extends AbstractDia runTest("compiler/testData/diagnostics/tests/multiplatform/actualTypealiasToSpecialAnnotation_oldLanguageVersion.kt"); } + @Test + @TestMetadata("actualTypealiasWithoutExpect.kt") + public void testActualTypealiasWithoutExpect() throws Exception { + runTest("compiler/testData/diagnostics/tests/multiplatform/actualTypealiasWithoutExpect.kt"); + } + @Test @TestMetadata("actualTypealias_defaultParamsIncompatibility.kt") public void testActualTypealias_defaultParamsIncompatibility() throws Exception { @@ -23874,6 +23880,12 @@ public class DiagnosticCompilerTestFE10TestdataTestGenerated extends AbstractDia runTest("compiler/testData/diagnostics/tests/multiplatform/expectTailrec_oldLanguageVersion.kt"); } + @Test + @TestMetadata("extraNestedClassOnActualViaActualTypealias.kt") + public void testExtraNestedClassOnActualViaActualTypealias() throws Exception { + runTest("compiler/testData/diagnostics/tests/multiplatform/extraNestedClassOnActualViaActualTypealias.kt"); + } + @Test @TestMetadata("headerFunInNonHeaderClass.kt") public void testHeaderFunInNonHeaderClass() throws Exception { @@ -23982,6 +23994,12 @@ public class DiagnosticCompilerTestFE10TestdataTestGenerated extends AbstractDia runTest("compiler/testData/diagnostics/tests/multiplatform/nestedClassViaActualTypealiasExpandInTypeParam.kt"); } + @Test + @TestMetadata("nestedClassViaActualTypealiasIncompatibilities.kt") + public void testNestedClassViaActualTypealiasIncompatibilities() throws Exception { + runTest("compiler/testData/diagnostics/tests/multiplatform/nestedClassViaActualTypealiasIncompatibilities.kt"); + } + @Test @TestMetadata("nestedClassViaActualTypealiasWithTypeParam.kt") public void testNestedClassViaActualTypealiasWithTypeParam() 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 3b2cfa020eb..47c7560bcfa 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 @@ -23725,6 +23725,12 @@ public class LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated runTest("compiler/testData/diagnostics/tests/multiplatform/actualTypealiasToSpecialAnnotation_oldLanguageVersion.kt"); } + @Test + @TestMetadata("actualTypealiasWithoutExpect.kt") + public void testActualTypealiasWithoutExpect() throws Exception { + runTest("compiler/testData/diagnostics/tests/multiplatform/actualTypealiasWithoutExpect.kt"); + } + @Test @TestMetadata("actualTypealias_defaultParamsIncompatibility.kt") public void testActualTypealias_defaultParamsIncompatibility() throws Exception { @@ -23874,6 +23880,12 @@ public class LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated runTest("compiler/testData/diagnostics/tests/multiplatform/expectTailrec_oldLanguageVersion.kt"); } + @Test + @TestMetadata("extraNestedClassOnActualViaActualTypealias.kt") + public void testExtraNestedClassOnActualViaActualTypealias() throws Exception { + runTest("compiler/testData/diagnostics/tests/multiplatform/extraNestedClassOnActualViaActualTypealias.kt"); + } + @Test @TestMetadata("headerFunInNonHeaderClass.kt") public void testHeaderFunInNonHeaderClass() throws Exception { @@ -23982,6 +23994,12 @@ public class LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated runTest("compiler/testData/diagnostics/tests/multiplatform/nestedClassViaActualTypealiasExpandInTypeParam.kt"); } + @Test + @TestMetadata("nestedClassViaActualTypealiasIncompatibilities.kt") + public void testNestedClassViaActualTypealiasIncompatibilities() throws Exception { + runTest("compiler/testData/diagnostics/tests/multiplatform/nestedClassViaActualTypealiasIncompatibilities.kt"); + } + @Test @TestMetadata("nestedClassViaActualTypealiasWithTypeParam.kt") public void testNestedClassViaActualTypealiasWithTypeParam() 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 9d3f353151f..fb7bc5d6d73 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 @@ -86,6 +86,12 @@ public class FirOldFrontendMPPDiagnosticsWithLightTreeTestGenerated extends Abst runTest("compiler/testData/diagnostics/tests/multiplatform/actualTypealiasToSpecialAnnotation_oldLanguageVersion.kt"); } + @Test + @TestMetadata("actualTypealiasWithoutExpect.kt") + public void testActualTypealiasWithoutExpect() throws Exception { + runTest("compiler/testData/diagnostics/tests/multiplatform/actualTypealiasWithoutExpect.kt"); + } + @Test @TestMetadata("actualTypealias_defaultParamsIncompatibility.kt") public void testActualTypealias_defaultParamsIncompatibility() throws Exception { @@ -235,6 +241,12 @@ public class FirOldFrontendMPPDiagnosticsWithLightTreeTestGenerated extends Abst runTest("compiler/testData/diagnostics/tests/multiplatform/expectTailrec_oldLanguageVersion.kt"); } + @Test + @TestMetadata("extraNestedClassOnActualViaActualTypealias.kt") + public void testExtraNestedClassOnActualViaActualTypealias() throws Exception { + runTest("compiler/testData/diagnostics/tests/multiplatform/extraNestedClassOnActualViaActualTypealias.kt"); + } + @Test @TestMetadata("headerFunInNonHeaderClass.kt") public void testHeaderFunInNonHeaderClass() throws Exception { @@ -343,6 +355,12 @@ public class FirOldFrontendMPPDiagnosticsWithLightTreeTestGenerated extends Abst runTest("compiler/testData/diagnostics/tests/multiplatform/nestedClassViaActualTypealiasExpandInTypeParam.kt"); } + @Test + @TestMetadata("nestedClassViaActualTypealiasIncompatibilities.kt") + public void testNestedClassViaActualTypealiasIncompatibilities() throws Exception { + runTest("compiler/testData/diagnostics/tests/multiplatform/nestedClassViaActualTypealiasIncompatibilities.kt"); + } + @Test @TestMetadata("nestedClassViaActualTypealiasWithTypeParam.kt") public void testNestedClassViaActualTypealiasWithTypeParam() 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 8b49a2dc042..0b39feee2ca 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 @@ -86,6 +86,12 @@ public class FirOldFrontendMPPDiagnosticsWithPsiTestGenerated extends AbstractFi runTest("compiler/testData/diagnostics/tests/multiplatform/actualTypealiasToSpecialAnnotation_oldLanguageVersion.kt"); } + @Test + @TestMetadata("actualTypealiasWithoutExpect.kt") + public void testActualTypealiasWithoutExpect() throws Exception { + runTest("compiler/testData/diagnostics/tests/multiplatform/actualTypealiasWithoutExpect.kt"); + } + @Test @TestMetadata("actualTypealias_defaultParamsIncompatibility.kt") public void testActualTypealias_defaultParamsIncompatibility() throws Exception { @@ -235,6 +241,12 @@ public class FirOldFrontendMPPDiagnosticsWithPsiTestGenerated extends AbstractFi runTest("compiler/testData/diagnostics/tests/multiplatform/expectTailrec_oldLanguageVersion.kt"); } + @Test + @TestMetadata("extraNestedClassOnActualViaActualTypealias.kt") + public void testExtraNestedClassOnActualViaActualTypealias() throws Exception { + runTest("compiler/testData/diagnostics/tests/multiplatform/extraNestedClassOnActualViaActualTypealias.kt"); + } + @Test @TestMetadata("headerFunInNonHeaderClass.kt") public void testHeaderFunInNonHeaderClass() throws Exception { @@ -343,6 +355,12 @@ public class FirOldFrontendMPPDiagnosticsWithPsiTestGenerated extends AbstractFi runTest("compiler/testData/diagnostics/tests/multiplatform/nestedClassViaActualTypealiasExpandInTypeParam.kt"); } + @Test + @TestMetadata("nestedClassViaActualTypealiasIncompatibilities.kt") + public void testNestedClassViaActualTypealiasIncompatibilities() throws Exception { + runTest("compiler/testData/diagnostics/tests/multiplatform/nestedClassViaActualTypealiasIncompatibilities.kt"); + } + @Test @TestMetadata("nestedClassViaActualTypealiasWithTypeParam.kt") public void testNestedClassViaActualTypealiasWithTypeParam() throws Exception { diff --git a/compiler/ir/ir.actualization/src/main/kotlin/org/jetbrains/kotlin/backend/common/actualizer/ExpectActualCollector.kt b/compiler/ir/ir.actualization/src/main/kotlin/org/jetbrains/kotlin/backend/common/actualizer/ExpectActualCollector.kt index 0106b7db9bc..94cc581507a 100644 --- a/compiler/ir/ir.actualization/src/main/kotlin/org/jetbrains/kotlin/backend/common/actualizer/ExpectActualCollector.kt +++ b/compiler/ir/ir.actualization/src/main/kotlin/org/jetbrains/kotlin/backend/common/actualizer/ExpectActualCollector.kt @@ -16,8 +16,7 @@ import org.jetbrains.kotlin.ir.symbols.IrSymbol import org.jetbrains.kotlin.ir.symbols.IrTypeAliasSymbol import org.jetbrains.kotlin.ir.types.IrTypeSystemContext import org.jetbrains.kotlin.ir.types.classifierOrFail -import org.jetbrains.kotlin.ir.util.callableId -import org.jetbrains.kotlin.ir.util.classIdOrFail +import org.jetbrains.kotlin.ir.util.* import org.jetbrains.kotlin.ir.visitors.IrElementVisitor import org.jetbrains.kotlin.mpp.DeclarationSymbolMarker import org.jetbrains.kotlin.mpp.RegularClassSymbolMarker @@ -61,8 +60,9 @@ internal class ExpectActualCollector( } private fun collectActualDeclarations(): ClassActualizationInfo { + val expectTopLevelClasses = ExpectTopLevelClassesCollector.collect(dependentFragments) val fragmentsWithActuals = dependentFragments.drop(1) + mainFragment - return ActualDeclarationsCollector.collectActualsFromFragments(fragmentsWithActuals) + return ActualDeclarationsCollector.collectActualsFromFragments(fragmentsWithActuals, expectTopLevelClasses) } private fun matchAllExpectDeclarations( @@ -95,12 +95,36 @@ internal data class ClassActualizationInfo( } } - - -private class ActualDeclarationsCollector { +private class ExpectTopLevelClassesCollector { companion object { - fun collectActualsFromFragments(fragments: List): ClassActualizationInfo { - val collector = ActualDeclarationsCollector() + fun collect(fragments: List): Map { + val collector = ExpectTopLevelClassesCollector() + collector.collect(fragments) + return collector.expectTopLevelClasses + } + } + + private val expectTopLevelClasses = mutableMapOf() + + fun collect(fragments: List) { + for (fragment in fragments) { + for (file in fragment.files) { + for (declaration in file.declarations) { + if (declaration is IrClass && declaration.isExpect && declaration.isTopLevel) { + expectTopLevelClasses[declaration.classIdOrFail] = declaration.symbol + } + } + } + } + } +} + +private class ActualDeclarationsCollector( + private val expectTopLevelClasses: Map, +) { + companion object { + fun collectActualsFromFragments(fragments: List, expectTopLevelClasses: Map): ClassActualizationInfo { + val collector = ActualDeclarationsCollector(expectTopLevelClasses) for (fragment in fragments) { collector.collect(fragment) } @@ -146,6 +170,7 @@ private class ActualDeclarationsCollector { actualSymbolsToFile[element.symbol] = currentFile collect(expandedTypeSymbol.owner) + recordMappingsForNestedClassesActualizedViaTypealias(classId, expandedTypeSymbol) } is IrClass -> { if (element.isExpect || !visitedActualClasses.add(element)) return @@ -175,6 +200,28 @@ private class ActualDeclarationsCollector { } } + /** + * For given actual typealias goes through all nested classes in expect class to record their mappings in [actualClasses]. + * + * This is needed because in case of `expect` nested classes actualized via typealias we can't simply find actual symbol by + * `expect` `ClassId` (like we do for top-level classes), because `ClassId` is different. + * For example, `expect` class `com/example/ExpectClass.Nested` may have actual with id `real/package/ActualTypeliasTarget.Nested`. + */ + private fun recordMappingsForNestedClassesActualizedViaTypealias(typealiasClassId: ClassId, actualClassSymbol: IrClassSymbol) { + fun recordRecursively(expectClass: IrClass, actualClass: IrClass) { + val actualNestedClassesByName = actualClass.nestedClasses.associateBy { it.name } + + for (expectNestedClass in expectClass.nestedClasses) { + val actualNestedClass = actualNestedClassesByName[expectNestedClass.name] ?: continue + actualClasses[expectNestedClass.classIdOrFail] = actualNestedClass.symbol + recordRecursively(expectNestedClass, actualNestedClass) + } + } + + val expectClassSymbol = expectTopLevelClasses[typealiasClassId] ?: return + recordRecursively(expectClassSymbol.owner, actualClassSymbol.owner) + } + private fun recordActualCallable(callableDeclaration: IrDeclarationWithName, callableId: CallableId) { if (callableId.classId == null) { actualTopLevels diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrUtils.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrUtils.kt index d856ca6e2c7..04d3a96245c 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrUtils.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrUtils.kt @@ -259,6 +259,11 @@ val IrClassSymbol.constructors: Sequence val IrClass.fields: Sequence get() = declarations.asSequence().filterIsInstance() +// This declaration accesses IrDeclarationContainer.declarations, which is marked with this opt-in +@UnsafeDuringIrConstructionAPI +val IrClass.nestedClasses: Sequence + get() = declarations.asSequence().filterIsInstance() + // This declaration accesses IrDeclarationContainer.declarations, which is marked with this opt-in @UnsafeDuringIrConstructionAPI val IrClassSymbol.fields: Sequence diff --git a/compiler/testData/diagnostics/tests/multiplatform/actualAnnotationsNotMatchExpect/nestedAnnotationClassViaActualTypeAlias.fir.kt b/compiler/testData/diagnostics/tests/multiplatform/actualAnnotationsNotMatchExpect/nestedAnnotationClassViaActualTypeAlias.fir.kt index ff8141f8f02..b51ac1693cc 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/actualAnnotationsNotMatchExpect/nestedAnnotationClassViaActualTypeAlias.fir.kt +++ b/compiler/testData/diagnostics/tests/multiplatform/actualAnnotationsNotMatchExpect/nestedAnnotationClassViaActualTypeAlias.fir.kt @@ -16,5 +16,5 @@ annotation class AnnImpl { actual typealias Ann = AnnImpl -@AnnImpl.Nested -actual fun foo() {} +@AnnImpl.Nested +actual fun foo() {} diff --git a/compiler/testData/diagnostics/tests/multiplatform/actualAnnotationsNotMatchExpect/nestedAnnotationClassViaActualTypeAlias.ll.kt b/compiler/testData/diagnostics/tests/multiplatform/actualAnnotationsNotMatchExpect/nestedAnnotationClassViaActualTypeAlias.ll.kt deleted file mode 100644 index b51ac1693cc..00000000000 --- a/compiler/testData/diagnostics/tests/multiplatform/actualAnnotationsNotMatchExpect/nestedAnnotationClassViaActualTypeAlias.ll.kt +++ /dev/null @@ -1,20 +0,0 @@ -// MODULE: m1-common -// FILE: common.kt - -expect annotation class Ann() { - annotation class Nested() -} - -@Ann.Nested -expect fun foo() - -// MODULE: m1-jvm()()(m1-common) -// FILE: jvm.kt -annotation class AnnImpl { - annotation class Nested -} - -actual typealias Ann = AnnImpl - -@AnnImpl.Nested -actual fun foo() {} diff --git a/compiler/testData/diagnostics/tests/multiplatform/actualTypealiasWithoutExpect.kt b/compiler/testData/diagnostics/tests/multiplatform/actualTypealiasWithoutExpect.kt new file mode 100644 index 00000000000..325433e274d --- /dev/null +++ b/compiler/testData/diagnostics/tests/multiplatform/actualTypealiasWithoutExpect.kt @@ -0,0 +1,9 @@ +// FIR_IDENTICAL +// MODULE: m1-common +// FILE: common.kt + +// MODULE: m2-jvm()()(m1-common) +// FILE: jvm.kt +class FooImpl + +actual typealias Foo = FooImpl diff --git a/compiler/testData/diagnostics/tests/multiplatform/defaultArguments/annotationDefaultArgKclassWithNestedClassViaActualTypeAlias.fir.kt b/compiler/testData/diagnostics/tests/multiplatform/defaultArguments/annotationDefaultArgKclassWithNestedClassViaActualTypeAlias.fir.kt index 17159c91509..c5b334d304f 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/defaultArguments/annotationDefaultArgKclassWithNestedClassViaActualTypeAlias.fir.kt +++ b/compiler/testData/diagnostics/tests/multiplatform/defaultArguments/annotationDefaultArgKclassWithNestedClassViaActualTypeAlias.fir.kt @@ -23,5 +23,5 @@ class FooImpl { actual typealias Foo = FooImpl actual annotation class Ann( - actual val p: KClass<*> = FooImpl.Nested::class + actual val p: KClass<*> = FooImpl.Nested::class ) diff --git a/compiler/testData/diagnostics/tests/multiplatform/defaultArguments/annotationDefaultArgKclassWithNestedClassViaActualTypeAlias.ll.kt b/compiler/testData/diagnostics/tests/multiplatform/defaultArguments/annotationDefaultArgKclassWithNestedClassViaActualTypeAlias.ll.kt deleted file mode 100644 index c5b334d304f..00000000000 --- a/compiler/testData/diagnostics/tests/multiplatform/defaultArguments/annotationDefaultArgKclassWithNestedClassViaActualTypeAlias.ll.kt +++ /dev/null @@ -1,27 +0,0 @@ -// MODULE: m1-common -// FILE: common.kt - -import kotlin.reflect.KClass - -expect annotation class Ann( - val p: KClass<*> = Foo.Nested::class -) - -expect class Foo { - class Nested -} - -// MODULE: m2-jvm()()(m1-common) -// FILE: jvm.kt - -import kotlin.reflect.KClass - -class FooImpl { - class Nested -} - -actual typealias Foo = FooImpl - -actual annotation class Ann( - actual val p: KClass<*> = FooImpl.Nested::class -) diff --git a/compiler/testData/diagnostics/tests/multiplatform/defaultArguments/nestedAnnotationClassViaActualTypealias.fir.kt b/compiler/testData/diagnostics/tests/multiplatform/defaultArguments/nestedAnnotationClassViaActualTypealias.fir.kt index 7643467e5de..ccb28e47fc8 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/defaultArguments/nestedAnnotationClassViaActualTypealias.fir.kt +++ b/compiler/testData/diagnostics/tests/multiplatform/defaultArguments/nestedAnnotationClassViaActualTypealias.fir.kt @@ -1,8 +1,8 @@ // MODULE: m1-common // FILE: common.kt -expect class DefaultArgsInNestedClass { - annotation class Nested(val p: String = "") -} +expect class DefaultArgsInNestedClass { + annotation class Nested(val p: String = "") +} // MODULE: m2-jvm()()(m1-common) // FILE: jvm.kt @@ -10,5 +10,5 @@ class DefaultArgsInNestedClassImpl { annotation class Nested(val p: String = "") } -// Incompatible because of bug KT-31636 +// Incompatible in K1 because of bug KT-31636 actual typealias DefaultArgsInNestedClass = DefaultArgsInNestedClassImpl diff --git a/compiler/testData/diagnostics/tests/multiplatform/defaultArguments/nestedAnnotationClassViaActualTypealias.kt b/compiler/testData/diagnostics/tests/multiplatform/defaultArguments/nestedAnnotationClassViaActualTypealias.kt index f6788ba54e0..775d4c47379 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/defaultArguments/nestedAnnotationClassViaActualTypealias.kt +++ b/compiler/testData/diagnostics/tests/multiplatform/defaultArguments/nestedAnnotationClassViaActualTypealias.kt @@ -10,5 +10,5 @@ class DefaultArgsInNestedClassImpl { annotation class Nested(val p: String = "") } -// Incompatible because of bug KT-31636 +// Incompatible in K1 because of bug KT-31636 actual typealias DefaultArgsInNestedClass = DefaultArgsInNestedClassImpl diff --git a/compiler/testData/diagnostics/tests/multiplatform/defaultArguments/nestedAnnotationClassViaActualTypealias.ll.kt b/compiler/testData/diagnostics/tests/multiplatform/defaultArguments/nestedAnnotationClassViaActualTypealias.ll.kt deleted file mode 100644 index f6788ba54e0..00000000000 --- a/compiler/testData/diagnostics/tests/multiplatform/defaultArguments/nestedAnnotationClassViaActualTypealias.ll.kt +++ /dev/null @@ -1,14 +0,0 @@ -// MODULE: m1-common -// FILE: common.kt -expect class DefaultArgsInNestedClass { - annotation class Nested(val p: String = "") -} - -// MODULE: m2-jvm()()(m1-common) -// FILE: jvm.kt -class DefaultArgsInNestedClassImpl { - annotation class Nested(val p: String = "") -} - -// Incompatible because of bug KT-31636 -actual typealias DefaultArgsInNestedClass = DefaultArgsInNestedClassImpl diff --git a/compiler/testData/diagnostics/tests/multiplatform/nestedClassViaActualTypealiasExpandInTypeParam.ll.kt b/compiler/testData/diagnostics/tests/multiplatform/extraNestedClassOnActualViaActualTypealias.kt similarity index 58% rename from compiler/testData/diagnostics/tests/multiplatform/nestedClassViaActualTypealiasExpandInTypeParam.ll.kt rename to compiler/testData/diagnostics/tests/multiplatform/extraNestedClassOnActualViaActualTypealias.kt index e4e7d4239bd..74be549fddd 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/nestedClassViaActualTypealiasExpandInTypeParam.ll.kt +++ b/compiler/testData/diagnostics/tests/multiplatform/extraNestedClassOnActualViaActualTypealias.kt @@ -1,17 +1,15 @@ +// FIR_IDENTICAL // MODULE: m1-common // FILE: common.kt expect class Foo { - class Inner { - fun foo(p: List) - } + class Inner } // MODULE: m2-jvm()()(m1-common) // FILE: jvm.kt class FooImpl { - class Inner { - fun foo(p: List) {} - } + class Inner + class Extra } actual typealias Foo = FooImpl diff --git a/compiler/testData/diagnostics/tests/multiplatform/nestedClassViaActualTypealias.fir.kt b/compiler/testData/diagnostics/tests/multiplatform/nestedClassViaActualTypealias.fir.kt index 9734e9a47e0..663e2eb8e39 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/nestedClassViaActualTypealias.fir.kt +++ b/compiler/testData/diagnostics/tests/multiplatform/nestedClassViaActualTypealias.fir.kt @@ -1,16 +1,16 @@ // MODULE: m1-common // FILE: common.kt -expect class Foo { - class Inner() -} +expect class Foo { + class Inner() +} -expect class SeveralInner { - class Inner1 { - class Inner2 { - class Inner3() - } - } -} +expect class SeveralInner { + class Inner1 { + class Inner2 { + class Inner3() + } + } +} // MODULE: m2-jvm()()(m1-common) // FILE: jvm.kt diff --git a/compiler/testData/diagnostics/tests/multiplatform/nestedClassViaActualTypealias.ll.kt b/compiler/testData/diagnostics/tests/multiplatform/nestedClassViaActualTypealias.ll.kt deleted file mode 100644 index 663e2eb8e39..00000000000 --- a/compiler/testData/diagnostics/tests/multiplatform/nestedClassViaActualTypealias.ll.kt +++ /dev/null @@ -1,31 +0,0 @@ -// MODULE: m1-common -// FILE: common.kt -expect class Foo { - class Inner() -} - -expect class SeveralInner { - class Inner1 { - class Inner2 { - class Inner3() - } - } -} - -// MODULE: m2-jvm()()(m1-common) -// FILE: jvm.kt -class FooImpl { - class Inner -} - -actual typealias Foo = FooImpl - -class SeveralInnerImpl { - class Inner1 { - class Inner2 { - class Inner3 - } - } -} - -actual typealias SeveralInner = SeveralInnerImpl diff --git a/compiler/testData/diagnostics/tests/multiplatform/nestedClassViaActualTypealiasExpandInTypeParam.fir.kt b/compiler/testData/diagnostics/tests/multiplatform/nestedClassViaActualTypealiasExpandInTypeParam.fir.kt index 5f968715587..e4e7d4239bd 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/nestedClassViaActualTypealiasExpandInTypeParam.fir.kt +++ b/compiler/testData/diagnostics/tests/multiplatform/nestedClassViaActualTypealiasExpandInTypeParam.fir.kt @@ -1,10 +1,10 @@ // MODULE: m1-common // FILE: common.kt -expect class Foo { - class Inner { - fun foo(p: List) - } -} +expect class Foo { + class Inner { + fun foo(p: List) + } +} // MODULE: m2-jvm()()(m1-common) // FILE: jvm.kt diff --git a/compiler/testData/diagnostics/tests/multiplatform/nestedClassViaActualTypealiasIncompatibilities.fir.kt b/compiler/testData/diagnostics/tests/multiplatform/nestedClassViaActualTypealiasIncompatibilities.fir.kt new file mode 100644 index 00000000000..43c034ec17b --- /dev/null +++ b/compiler/testData/diagnostics/tests/multiplatform/nestedClassViaActualTypealiasIncompatibilities.fir.kt @@ -0,0 +1,14 @@ +// MODULE: m1-common()()() +// FILE: common.kt +expect class Foo { + class Inner + class AbsentOnactual +} + +// MODULE: m2-jvm()()(m1-common) +// FILE: jvm.kt +class FooImpl { + class Inner +} + +actual typealias Foo = FooImpl diff --git a/compiler/testData/diagnostics/tests/multiplatform/nestedClassViaActualTypealiasIncompatibilities.kt b/compiler/testData/diagnostics/tests/multiplatform/nestedClassViaActualTypealiasIncompatibilities.kt new file mode 100644 index 00000000000..da1738b336a --- /dev/null +++ b/compiler/testData/diagnostics/tests/multiplatform/nestedClassViaActualTypealiasIncompatibilities.kt @@ -0,0 +1,14 @@ +// MODULE: m1-common()()() +// FILE: common.kt +expect class Foo { + class Inner + class AbsentOnactual +} + +// MODULE: m2-jvm()()(m1-common) +// FILE: jvm.kt +class FooImpl { + class Inner +} + +actual typealias Foo = FooImpl diff --git a/compiler/testData/diagnostics/tests/multiplatform/nestedClassViaActualTypealiasIncompatibilities.ll.kt b/compiler/testData/diagnostics/tests/multiplatform/nestedClassViaActualTypealiasIncompatibilities.ll.kt new file mode 100644 index 00000000000..da1738b336a --- /dev/null +++ b/compiler/testData/diagnostics/tests/multiplatform/nestedClassViaActualTypealiasIncompatibilities.ll.kt @@ -0,0 +1,14 @@ +// MODULE: m1-common()()() +// FILE: common.kt +expect class Foo { + class Inner + class AbsentOnactual +} + +// MODULE: m2-jvm()()(m1-common) +// FILE: jvm.kt +class FooImpl { + class Inner +} + +actual typealias Foo = FooImpl 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 9975bae8a54..4d5c97878cd 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 @@ -23725,6 +23725,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest { runTest("compiler/testData/diagnostics/tests/multiplatform/actualTypealiasToSpecialAnnotation_oldLanguageVersion.kt"); } + @Test + @TestMetadata("actualTypealiasWithoutExpect.kt") + public void testActualTypealiasWithoutExpect() throws Exception { + runTest("compiler/testData/diagnostics/tests/multiplatform/actualTypealiasWithoutExpect.kt"); + } + @Test @TestMetadata("actualTypealias_defaultParamsIncompatibility.kt") public void testActualTypealias_defaultParamsIncompatibility() throws Exception { @@ -23874,6 +23880,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest { runTest("compiler/testData/diagnostics/tests/multiplatform/expectTailrec_oldLanguageVersion.kt"); } + @Test + @TestMetadata("extraNestedClassOnActualViaActualTypealias.kt") + public void testExtraNestedClassOnActualViaActualTypealias() throws Exception { + runTest("compiler/testData/diagnostics/tests/multiplatform/extraNestedClassOnActualViaActualTypealias.kt"); + } + @Test @TestMetadata("headerFunInNonHeaderClass.kt") public void testHeaderFunInNonHeaderClass() throws Exception { @@ -23982,6 +23994,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest { runTest("compiler/testData/diagnostics/tests/multiplatform/nestedClassViaActualTypealiasExpandInTypeParam.kt"); } + @Test + @TestMetadata("nestedClassViaActualTypealiasIncompatibilities.kt") + public void testNestedClassViaActualTypealiasIncompatibilities() throws Exception { + runTest("compiler/testData/diagnostics/tests/multiplatform/nestedClassViaActualTypealiasIncompatibilities.kt"); + } + @Test @TestMetadata("nestedClassViaActualTypealiasWithTypeParam.kt") public void testNestedClassViaActualTypealiasWithTypeParam() throws Exception {