diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirActualTypeAliasChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirActualTypeAliasChecker.kt index 713c68f33d5..843b45243c9 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirActualTypeAliasChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirActualTypeAliasChecker.kt @@ -13,8 +13,7 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors import org.jetbrains.kotlin.fir.declarations.FirTypeAlias import org.jetbrains.kotlin.fir.declarations.utils.isActual import org.jetbrains.kotlin.fir.symbols.impl.FirTypeAliasSymbol -import org.jetbrains.kotlin.fir.types.ProjectionKind -import org.jetbrains.kotlin.fir.types.coneType +import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.types.Variance object FirActualTypeAliasChecker : FirTypeAliasChecker() { @@ -41,5 +40,26 @@ object FirActualTypeAliasChecker : FirTypeAliasChecker() { break } } + + var reportActualTypeAliasWithComplexSubstitution = false + if (declaration.typeParameters.size != expandedTypeRef.coneType.typeArguments.size) { + reportActualTypeAliasWithComplexSubstitution = true + } else { + for (i in 0 until declaration.typeParameters.size) { + val typeArgument = expandedTypeRef.coneType.typeArguments[i] + if (typeArgument is ConeTypeParameterType) { + if (declaration.typeParameters[i].symbol != typeArgument.lookupTag.typeParameterSymbol) { + reportActualTypeAliasWithComplexSubstitution = true + break + } + } else if (typeArgument is ConeKotlinType && typeArgument.typeArguments.isNotEmpty()) { + reportActualTypeAliasWithComplexSubstitution = true + break + } + } + } + if (reportActualTypeAliasWithComplexSubstitution) { + reporter.reportOn(declaration.source, FirErrors.ACTUAL_TYPE_ALIAS_WITH_COMPLEX_SUBSTITUTION, context) + } } } \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/multiplatform/headerClass/genericClassImplTypeAlias.fir.kt b/compiler/testData/diagnostics/tests/multiplatform/headerClass/genericClassImplTypeAlias.fir.kt deleted file mode 100644 index 8d82b54c0ba..00000000000 --- a/compiler/testData/diagnostics/tests/multiplatform/headerClass/genericClassImplTypeAlias.fir.kt +++ /dev/null @@ -1,30 +0,0 @@ -// !DIAGNOSTICS: -ACTUAL_WITHOUT_EXPECT -// MODULE: m1-common -// FILE: common.kt - -expect class C1 -expect interface C2 -expect interface C3 -expect interface C4 -expect interface C5 -expect interface C6 -expect interface C7 -expect interface C8 -expect interface C9 -expect interface C10 - -// MODULE: m2-jvm()()(m1-common) -// FILE: jvm.kt - -actual typealias C1 = String -actual typealias C2 = List -actual typealias C3 = List -actual typealias C4 = MutableMap -actual typealias C5 = MutableMap -actual typealias C6 = MutableList -actual typealias C7 = MutableList -actual typealias C8 = MutableList<*> -actual typealias C9 = MutableList - -typealias Tmp = MutableList -actual typealias C10 = Tmp diff --git a/compiler/testData/diagnostics/tests/multiplatform/headerClass/genericClassImplTypeAlias.kt b/compiler/testData/diagnostics/tests/multiplatform/headerClass/genericClassImplTypeAlias.kt index 9cbf2238141..65153d15164 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/headerClass/genericClassImplTypeAlias.kt +++ b/compiler/testData/diagnostics/tests/multiplatform/headerClass/genericClassImplTypeAlias.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // !DIAGNOSTICS: -ACTUAL_WITHOUT_EXPECT // MODULE: m1-common // FILE: common.kt @@ -16,11 +17,18 @@ expect interface C10 // MODULE: m2-jvm()()(m1-common) // FILE: jvm.kt +class A> +class B + actual typealias C1 = String actual typealias C2 = List actual typealias C3 = List actual typealias C4 = MutableMap actual typealias C5 = MutableMap +actual typealias C51 = MutableMap +actual typealias C52 = MutableMap +actual typealias C53 = A> +actual typealias C54 = B> actual typealias C6 = MutableList actual typealias C7 = MutableList actual typealias C8 = MutableList<*> diff --git a/compiler/testData/diagnostics/tests/multiplatform/headerClass/genericClassImplTypeAlias.txt b/compiler/testData/diagnostics/tests/multiplatform/headerClass/genericClassImplTypeAlias.txt index ac6af2833be..c5ac332fa6b 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/headerClass/genericClassImplTypeAlias.txt +++ b/compiler/testData/diagnostics/tests/multiplatform/headerClass/genericClassImplTypeAlias.txt @@ -64,12 +64,29 @@ public expect interface C9 { // -- Module: -- package +public final class A> { + public constructor A>() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public final class B { + public constructor B() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} public actual typealias C1 = kotlin.String public actual typealias C10 = Tmp public actual typealias C2 = kotlin.collections.List public actual typealias C3 = kotlin.collections.List public actual typealias C4 = kotlin.collections.MutableMap public actual typealias C5 = kotlin.collections.MutableMap +public actual typealias C51 = kotlin.collections.MutableMap +public actual typealias C52 = kotlin.collections.MutableMap +public actual typealias C53 = A> +public actual typealias C54 = B> public actual typealias C6 = kotlin.collections.MutableList public actual typealias C7 = kotlin.collections.MutableList public actual typealias C8 = kotlin.collections.MutableList<*>