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 {