[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
This commit is contained in:
committed by
Space Team
parent
d343e40ac5
commit
205690b220
+18
@@ -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 {
|
||||
|
||||
+18
@@ -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 {
|
||||
|
||||
+18
@@ -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 {
|
||||
|
||||
+18
@@ -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 {
|
||||
|
||||
+55
-8
@@ -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<IrModuleFragment>): ClassActualizationInfo {
|
||||
val collector = ActualDeclarationsCollector()
|
||||
fun collect(fragments: List<IrModuleFragment>): Map<ClassId, IrClassSymbol> {
|
||||
val collector = ExpectTopLevelClassesCollector()
|
||||
collector.collect(fragments)
|
||||
return collector.expectTopLevelClasses
|
||||
}
|
||||
}
|
||||
|
||||
private val expectTopLevelClasses = mutableMapOf<ClassId, IrClassSymbol>()
|
||||
|
||||
fun collect(fragments: List<IrModuleFragment>) {
|
||||
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<ClassId, IrClassSymbol>,
|
||||
) {
|
||||
companion object {
|
||||
fun collectActualsFromFragments(fragments: List<IrModuleFragment>, expectTopLevelClasses: Map<ClassId, IrClassSymbol>): 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
|
||||
|
||||
@@ -259,6 +259,11 @@ val IrClassSymbol.constructors: Sequence<IrConstructorSymbol>
|
||||
val IrClass.fields: Sequence<IrField>
|
||||
get() = declarations.asSequence().filterIsInstance<IrField>()
|
||||
|
||||
// This declaration accesses IrDeclarationContainer.declarations, which is marked with this opt-in
|
||||
@UnsafeDuringIrConstructionAPI
|
||||
val IrClass.nestedClasses: Sequence<IrClass>
|
||||
get() = declarations.asSequence().filterIsInstance<IrClass>()
|
||||
|
||||
// This declaration accesses IrDeclarationContainer.declarations, which is marked with this opt-in
|
||||
@UnsafeDuringIrConstructionAPI
|
||||
val IrClassSymbol.fields: Sequence<IrFieldSymbol>
|
||||
|
||||
+2
-2
@@ -16,5 +16,5 @@ annotation class AnnImpl {
|
||||
|
||||
actual typealias Ann = AnnImpl
|
||||
|
||||
<!ACTUAL_ANNOTATIONS_NOT_MATCH_EXPECT!>@AnnImpl.Nested
|
||||
actual fun foo() {}<!>
|
||||
@AnnImpl.Nested
|
||||
actual fun foo() {}
|
||||
|
||||
-20
@@ -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() {}
|
||||
+9
@@ -0,0 +1,9 @@
|
||||
// FIR_IDENTICAL
|
||||
// MODULE: m1-common
|
||||
// FILE: common.kt
|
||||
|
||||
// MODULE: m2-jvm()()(m1-common)
|
||||
// FILE: jvm.kt
|
||||
class FooImpl
|
||||
|
||||
actual typealias <!ACTUAL_WITHOUT_EXPECT!>Foo<!> = FooImpl
|
||||
+1
-1
@@ -23,5 +23,5 @@ class FooImpl {
|
||||
actual typealias Foo = FooImpl
|
||||
|
||||
actual annotation class Ann(
|
||||
actual val p: KClass<*> = <!ACTUAL_ANNOTATION_CONFLICTING_DEFAULT_ARGUMENT_VALUE!>FooImpl.Nested::class<!>
|
||||
actual val p: KClass<*> = FooImpl.Nested::class
|
||||
)
|
||||
|
||||
-27
@@ -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
|
||||
)
|
||||
+4
-4
@@ -1,8 +1,8 @@
|
||||
// MODULE: m1-common
|
||||
// FILE: common.kt
|
||||
<!EXPECT_ACTUAL_INCOMPATIBILITY{JVM}!>expect class DefaultArgsInNestedClass {
|
||||
<!EXPECT_ACTUAL_INCOMPATIBILITY{JVM}!>annotation class Nested<!EXPECT_ACTUAL_INCOMPATIBILITY{JVM}!>(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
|
||||
|
||||
+1
-1
@@ -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 <!NO_ACTUAL_CLASS_MEMBER_FOR_EXPECTED_CLASS!>DefaultArgsInNestedClass<!> = DefaultArgsInNestedClassImpl
|
||||
|
||||
-14
@@ -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 <!NO_ACTUAL_CLASS_MEMBER_FOR_EXPECTED_CLASS!>DefaultArgsInNestedClass<!> = DefaultArgsInNestedClassImpl
|
||||
+4
-6
@@ -1,17 +1,15 @@
|
||||
// FIR_IDENTICAL
|
||||
// MODULE: m1-common
|
||||
// FILE: common.kt
|
||||
expect class Foo {
|
||||
class Inner {
|
||||
fun foo(p: List<Inner>)
|
||||
}
|
||||
class Inner
|
||||
}
|
||||
|
||||
// MODULE: m2-jvm()()(m1-common)
|
||||
// FILE: jvm.kt
|
||||
class FooImpl {
|
||||
class Inner {
|
||||
fun foo(p: List<Inner>) {}
|
||||
}
|
||||
class Inner
|
||||
class Extra
|
||||
}
|
||||
|
||||
actual typealias Foo = FooImpl
|
||||
+10
-10
@@ -1,16 +1,16 @@
|
||||
// MODULE: m1-common
|
||||
// FILE: common.kt
|
||||
<!EXPECT_ACTUAL_INCOMPATIBILITY{JVM}!>expect class Foo {
|
||||
<!EXPECT_ACTUAL_INCOMPATIBILITY{JVM}!>class Inner<!EXPECT_ACTUAL_INCOMPATIBILITY{JVM}!>()<!><!>
|
||||
}<!>
|
||||
expect class Foo {
|
||||
class Inner()
|
||||
}
|
||||
|
||||
<!EXPECT_ACTUAL_INCOMPATIBILITY{JVM}!>expect class SeveralInner {
|
||||
<!EXPECT_ACTUAL_INCOMPATIBILITY{JVM}!>class Inner1 {
|
||||
<!EXPECT_ACTUAL_INCOMPATIBILITY{JVM}!>class Inner2 {
|
||||
<!EXPECT_ACTUAL_INCOMPATIBILITY{JVM}!>class Inner3<!EXPECT_ACTUAL_INCOMPATIBILITY{JVM}!>()<!><!>
|
||||
}<!>
|
||||
}<!>
|
||||
}<!>
|
||||
expect class SeveralInner {
|
||||
class Inner1 {
|
||||
class Inner2 {
|
||||
class Inner3()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// MODULE: m2-jvm()()(m1-common)
|
||||
// FILE: jvm.kt
|
||||
|
||||
-31
@@ -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
|
||||
+5
-5
@@ -1,10 +1,10 @@
|
||||
// MODULE: m1-common
|
||||
// FILE: common.kt
|
||||
<!EXPECT_ACTUAL_INCOMPATIBILITY{JVM}!>expect class Foo {
|
||||
<!EXPECT_ACTUAL_INCOMPATIBILITY{JVM}!>class Inner {
|
||||
<!EXPECT_ACTUAL_MISMATCH{JVM}!>fun foo(p: List<Inner>)<!>
|
||||
}<!>
|
||||
}<!>
|
||||
expect class Foo {
|
||||
class Inner {
|
||||
fun foo(p: List<Inner>)
|
||||
}
|
||||
}
|
||||
|
||||
// MODULE: m2-jvm()()(m1-common)
|
||||
// FILE: jvm.kt
|
||||
|
||||
+14
@@ -0,0 +1,14 @@
|
||||
// MODULE: m1-common()()()
|
||||
// FILE: common.kt
|
||||
<!EXPECT_ACTUAL_INCOMPATIBILITY{JVM}!>expect class Foo {
|
||||
class Inner
|
||||
<!NO_ACTUAL_FOR_EXPECT{JVM}!>class AbsentOnactual<!>
|
||||
}<!>
|
||||
|
||||
// MODULE: m2-jvm()()(m1-common)
|
||||
// FILE: jvm.kt
|
||||
class FooImpl {
|
||||
class Inner
|
||||
}
|
||||
|
||||
actual typealias <!NO_ACTUAL_CLASS_MEMBER_FOR_EXPECTED_CLASS!>Foo<!> = FooImpl
|
||||
Vendored
+14
@@ -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 <!NO_ACTUAL_CLASS_MEMBER_FOR_EXPECTED_CLASS!>Foo<!> = FooImpl
|
||||
+14
@@ -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 <!NO_ACTUAL_CLASS_MEMBER_FOR_EXPECTED_CLASS!>Foo<!> = FooImpl
|
||||
Generated
+18
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user