[FIR] Support of ACTUAL_TYPE_ALIAS_WITH_COMPLEX_SUBSTITUTION diagnostic

This commit is contained in:
Ivan Kochurkin
2023-02-16 22:42:38 +01:00
committed by Space Team
parent 3e33258f36
commit 9d0e02658f
4 changed files with 47 additions and 32 deletions
@@ -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)
}
}
}
@@ -1,30 +0,0 @@
// !DIAGNOSTICS: -ACTUAL_WITHOUT_EXPECT
// MODULE: m1-common
// FILE: common.kt
expect class C1
expect interface C2<A>
expect interface C3<B>
expect interface C4<D, E>
expect interface C5<F, G>
expect interface C6<H>
expect interface C7<I>
expect interface C8<J>
expect interface C9<K>
expect interface C10<L>
// MODULE: m2-jvm()()(m1-common)
// FILE: jvm.kt
actual typealias C1 = String
<!ACTUAL_TYPE_ALIAS_TO_CLASS_WITH_DECLARATION_SITE_VARIANCE!>actual typealias C2<A> = List<String><!>
<!ACTUAL_TYPE_ALIAS_TO_CLASS_WITH_DECLARATION_SITE_VARIANCE!>actual typealias C3<B> = List<B><!>
actual typealias C4<D, E> = MutableMap<D, E>
actual typealias C5<F, G> = MutableMap<G, F>
actual typealias C6<H> = MutableList<H>
<!ACTUAL_TYPE_ALIAS_WITH_USE_SITE_VARIANCE!>actual typealias C7<I> = MutableList<out I><!>
<!ACTUAL_TYPE_ALIAS_WITH_USE_SITE_VARIANCE!>actual typealias C8<J> = MutableList<*><!>
<!ACTUAL_TYPE_ALIAS_WITH_USE_SITE_VARIANCE!>actual typealias C9<K> = MutableList<in K><!>
typealias Tmp<K> = MutableList<K>
<!ACTUAL_TYPE_ALIAS_NOT_TO_CLASS!>actual typealias C10<L> = Tmp<L><!>
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
// !DIAGNOSTICS: -ACTUAL_WITHOUT_EXPECT
// MODULE: m1-common
// FILE: common.kt
@@ -16,11 +17,18 @@ expect interface C10<L>
// MODULE: m2-jvm()()(m1-common)
// FILE: jvm.kt
class A<T : A<T>>
class B<T>
actual typealias C1 = String
<!ACTUAL_TYPE_ALIAS_TO_CLASS_WITH_DECLARATION_SITE_VARIANCE!>actual typealias C2<A> = List<String><!>
<!ACTUAL_TYPE_ALIAS_TO_CLASS_WITH_DECLARATION_SITE_VARIANCE!>actual typealias C3<B> = List<B><!>
actual typealias C4<D, E> = MutableMap<D, E>
<!ACTUAL_TYPE_ALIAS_WITH_COMPLEX_SUBSTITUTION!>actual typealias C5<F, G> = MutableMap<G, F><!>
<!ACTUAL_TYPE_ALIAS_WITH_COMPLEX_SUBSTITUTION!>actual typealias C51 = MutableMap<String, String><!>
<!ACTUAL_TYPE_ALIAS_WITH_COMPLEX_SUBSTITUTION!>actual typealias C52<F> = MutableMap<F, String><!>
<!ACTUAL_TYPE_ALIAS_WITH_COMPLEX_SUBSTITUTION!>actual typealias C53<T> = A<A<T>><!>
<!ACTUAL_TYPE_ALIAS_WITH_COMPLEX_SUBSTITUTION!>actual typealias C54<T> = B<List<String>><!>
actual typealias C6<H> = MutableList<H>
<!ACTUAL_TYPE_ALIAS_WITH_USE_SITE_VARIANCE!>actual typealias C7<I> = MutableList<out I><!>
<!ACTUAL_TYPE_ALIAS_WITH_USE_SITE_VARIANCE!>actual typealias C8<J> = MutableList<*><!>
@@ -64,12 +64,29 @@ public expect interface C9</*0*/ K> {
// -- Module: <m2-jvm> --
package
public final class A</*0*/ T : A<T>> {
public constructor A</*0*/ T : A<T>>()
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</*0*/ T> {
public constructor B</*0*/ T>()
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</*0*/ L> = Tmp<L>
public actual typealias C2</*0*/ A> = kotlin.collections.List<kotlin.String>
public actual typealias C3</*0*/ B> = kotlin.collections.List<B>
public actual typealias C4</*0*/ D, /*1*/ E> = kotlin.collections.MutableMap<D, E>
public actual typealias C5</*0*/ F, /*1*/ G> = kotlin.collections.MutableMap<G, F>
public actual typealias C51 = kotlin.collections.MutableMap<kotlin.String, kotlin.String>
public actual typealias C52</*0*/ F> = kotlin.collections.MutableMap<F, kotlin.String>
public actual typealias C53</*0*/ T> = A<A<T>>
public actual typealias C54</*0*/ T> = B<kotlin.collections.List<kotlin.String>>
public actual typealias C6</*0*/ H> = kotlin.collections.MutableList<H>
public actual typealias C7</*0*/ I> = kotlin.collections.MutableList<out I>
public actual typealias C8</*0*/ J> = kotlin.collections.MutableList<*>