From cf1bd9837a59754eba34696dc087f60575d39b56 Mon Sep 17 00:00:00 2001 From: Ivan Kochurkin Date: Thu, 16 Feb 2023 22:39:13 +0100 Subject: [PATCH] [FIR] Support of ACTUAL_TYPE_ALIAS_TO_CLASS_WITH_DECLARATION_SITE_VARIANCE diagnostic --- .../declaration/FirActualTypeAliasChecker.kt | 18 ++++++++++-------- .../genericClassImplTypeAlias.fir.kt | 4 ++-- 2 files changed, 12 insertions(+), 10 deletions(-) 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 6045d5fcc8b..725267a4ea0 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,21 +13,23 @@ 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.types.Variance object FirActualTypeAliasChecker : FirTypeAliasChecker() { override fun check(declaration: FirTypeAlias, context: CheckerContext, reporter: DiagnosticReporter) { if (!declaration.isActual) return - checkActualTypeAliasNotToClass(declaration, context, reporter) - } + val expandedTypeSymbol = declaration.expandedTypeRef.toClassLikeSymbol(context.session) ?: return - private fun checkActualTypeAliasNotToClass( - declaration: FirTypeAlias, - context: CheckerContext, - reporter: DiagnosticReporter - ) { - if (declaration.expandedTypeRef.toClassLikeSymbol(context.session) is FirTypeAliasSymbol) { + if (expandedTypeSymbol is FirTypeAliasSymbol) { reporter.reportOn(declaration.source, FirErrors.ACTUAL_TYPE_ALIAS_NOT_TO_CLASS, context) } + + for (typeParameterSymbol in expandedTypeSymbol.typeParameterSymbols) { + if (typeParameterSymbol.variance != Variance.INVARIANT) { + reporter.reportOn(declaration.source, FirErrors.ACTUAL_TYPE_ALIAS_TO_CLASS_WITH_DECLARATION_SITE_VARIANCE, context) + break + } + } } } \ 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 index 3ac0caca28a..2aca589ffb6 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/headerClass/genericClassImplTypeAlias.fir.kt +++ b/compiler/testData/diagnostics/tests/multiplatform/headerClass/genericClassImplTypeAlias.fir.kt @@ -17,8 +17,8 @@ expect interface C10 // FILE: jvm.kt actual typealias C1 = String -actual typealias C2 = List -actual typealias C3 = List +actual typealias C2 = List +actual typealias C3 = List actual typealias C4 = MutableMap actual typealias C5 = MutableMap actual typealias C6 = MutableList