[FIR] Implement ACTUAL_TYPE_ALIAS_TO_EXPECT
^KT-69632 Fixed
diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KaFirDataClassConverters.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KaFirDataClassConverters.kt
index 2e059ee..90e7a98 100644
--- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KaFirDataClassConverters.kt
+++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KaFirDataClassConverters.kt
@@ -3943,6 +3943,12 @@
token,
)
}
+ add(FirErrors.ACTUAL_TYPE_ALIAS_TO_EXPECT) { firDiagnostic ->
+ ActualTypeAliasToExpectImpl(
+ firDiagnostic as KtPsiDiagnostic,
+ token,
+ )
+ }
add(FirErrors.ACTUAL_FUNCTION_WITH_DEFAULT_ARGUMENTS) { firDiagnostic ->
ActualFunctionWithDefaultArgumentsImpl(
firDiagnostic as KtPsiDiagnostic,
diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KaFirDiagnostics.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KaFirDiagnostics.kt
index c02e893..72c41bc 100644
--- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KaFirDiagnostics.kt
+++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KaFirDiagnostics.kt
@@ -2767,6 +2767,10 @@
override val diagnosticClass get() = ActualTypeAliasToNothing::class
}
+ interface ActualTypeAliasToExpect : KaFirDiagnostic<KtTypeAlias> {
+ override val diagnosticClass get() = ActualTypeAliasToExpect::class
+ }
+
interface ActualFunctionWithDefaultArguments : KaFirDiagnostic<KtFunction> {
override val diagnosticClass get() = ActualFunctionWithDefaultArguments::class
}
diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KaFirDiagnosticsImpl.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KaFirDiagnosticsImpl.kt
index 476ae06..228f34f 100644
--- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KaFirDiagnosticsImpl.kt
+++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KaFirDiagnosticsImpl.kt
@@ -3333,6 +3333,11 @@
token: KaLifetimeToken,
) : KaAbstractFirDiagnostic<KtTypeAlias>(firDiagnostic, token), KaFirDiagnostic.ActualTypeAliasToNothing
+internal class ActualTypeAliasToExpectImpl(
+ firDiagnostic: KtPsiDiagnostic,
+ token: KaLifetimeToken,
+) : KaAbstractFirDiagnostic<KtTypeAlias>(firDiagnostic, token), KaFirDiagnostic.ActualTypeAliasToExpect
+
internal class ActualFunctionWithDefaultArgumentsImpl(
firDiagnostic: KtPsiDiagnostic,
token: KaLifetimeToken,
diff --git a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt
index ec6a440..bd6e6b7 100644
--- a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt
+++ b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt
@@ -1352,6 +1352,7 @@
val ACTUAL_TYPE_ALIAS_WITH_COMPLEX_SUBSTITUTION by error<KtTypeAlias>(PositioningStrategy.DECLARATION_SIGNATURE)
val ACTUAL_TYPE_ALIAS_TO_NULLABLE_TYPE by error<KtTypeAlias>(PositioningStrategy.DECLARATION_SIGNATURE)
val ACTUAL_TYPE_ALIAS_TO_NOTHING by error<KtTypeAlias>(PositioningStrategy.DECLARATION_SIGNATURE)
+ val ACTUAL_TYPE_ALIAS_TO_EXPECT by error<KtTypeAlias>(PositioningStrategy.DECLARATION_SIGNATURE)
val ACTUAL_FUNCTION_WITH_DEFAULT_ARGUMENTS by error<KtFunction>(PositioningStrategy.PARAMETERS_WITH_DEFAULT_VALUE)
val DEFAULT_ARGUMENTS_IN_EXPECT_WITH_ACTUAL_TYPEALIAS by error<KtTypeAlias> {
parameter<FirClassSymbol<*>>("expectClassSymbol")
diff --git a/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt b/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt
index c185f7b..6897be2 100644
--- a/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt
+++ b/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt
@@ -709,6 +709,7 @@
val ACTUAL_TYPE_ALIAS_WITH_COMPLEX_SUBSTITUTION: KtDiagnosticFactory0 = KtDiagnosticFactory0("ACTUAL_TYPE_ALIAS_WITH_COMPLEX_SUBSTITUTION", ERROR, SourceElementPositioningStrategies.DECLARATION_SIGNATURE, KtTypeAlias::class)
val ACTUAL_TYPE_ALIAS_TO_NULLABLE_TYPE: KtDiagnosticFactory0 = KtDiagnosticFactory0("ACTUAL_TYPE_ALIAS_TO_NULLABLE_TYPE", ERROR, SourceElementPositioningStrategies.DECLARATION_SIGNATURE, KtTypeAlias::class)
val ACTUAL_TYPE_ALIAS_TO_NOTHING: KtDiagnosticFactory0 = KtDiagnosticFactory0("ACTUAL_TYPE_ALIAS_TO_NOTHING", ERROR, SourceElementPositioningStrategies.DECLARATION_SIGNATURE, KtTypeAlias::class)
+ val ACTUAL_TYPE_ALIAS_TO_EXPECT: KtDiagnosticFactory0 = KtDiagnosticFactory0("ACTUAL_TYPE_ALIAS_TO_EXPECT", ERROR, SourceElementPositioningStrategies.DECLARATION_SIGNATURE, KtTypeAlias::class)
val ACTUAL_FUNCTION_WITH_DEFAULT_ARGUMENTS: KtDiagnosticFactory0 = KtDiagnosticFactory0("ACTUAL_FUNCTION_WITH_DEFAULT_ARGUMENTS", ERROR, SourceElementPositioningStrategies.PARAMETERS_WITH_DEFAULT_VALUE, KtFunction::class)
val DEFAULT_ARGUMENTS_IN_EXPECT_WITH_ACTUAL_TYPEALIAS: KtDiagnosticFactory2<FirClassSymbol<*>, Collection<FirCallableSymbol<*>>> = KtDiagnosticFactory2("DEFAULT_ARGUMENTS_IN_EXPECT_WITH_ACTUAL_TYPEALIAS", ERROR, SourceElementPositioningStrategies.DEFAULT, KtTypeAlias::class)
val DEFAULT_ARGUMENTS_IN_EXPECT_ACTUALIZED_BY_FAKE_OVERRIDE: KtDiagnosticFactory2<FirRegularClassSymbol, Collection<FirNamedFunctionSymbol>> = KtDiagnosticFactory2("DEFAULT_ARGUMENTS_IN_EXPECT_ACTUALIZED_BY_FAKE_OVERRIDE", ERROR, SourceElementPositioningStrategies.SUPERTYPES_LIST, KtClass::class)
diff --git a/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirNonSuppressibleErrorNames.kt b/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirNonSuppressibleErrorNames.kt
index 805cb9a..6773fdd 100644
--- a/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirNonSuppressibleErrorNames.kt
+++ b/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirNonSuppressibleErrorNames.kt
@@ -468,6 +468,7 @@
"ACTUAL_TYPE_ALIAS_WITH_COMPLEX_SUBSTITUTION",
"ACTUAL_TYPE_ALIAS_TO_NULLABLE_TYPE",
"ACTUAL_TYPE_ALIAS_TO_NOTHING",
+ "ACTUAL_TYPE_ALIAS_TO_EXPECT",
"ACTUAL_FUNCTION_WITH_DEFAULT_ARGUMENTS",
"DEFAULT_ARGUMENTS_IN_EXPECT_WITH_ACTUAL_TYPEALIAS",
"DEFAULT_ARGUMENTS_IN_EXPECT_ACTUALIZED_BY_FAKE_OVERRIDE",
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 589813a..a851ef2 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,6 +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.declarations.utils.isExpect
import org.jetbrains.kotlin.fir.resolve.toSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirTypeAliasSymbol
import org.jetbrains.kotlin.fir.types.*
@@ -73,6 +74,10 @@
if (expandedType.isMarkedNullable) {
reporter.reportOn(declaration.source, FirErrors.ACTUAL_TYPE_ALIAS_TO_NULLABLE_TYPE, context)
}
+
+ if (expandedTypeSymbol.isExpect) {
+ reporter.reportOn(declaration.source, FirErrors.ACTUAL_TYPE_ALIAS_TO_EXPECT, context)
+ }
}
}
}
diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrorsDefaultMessages.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrorsDefaultMessages.kt
index 6dca89b..447af45 100644
--- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrorsDefaultMessages.kt
+++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrorsDefaultMessages.kt
@@ -71,6 +71,7 @@
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.ACTUAL_TYPEALIAS_TO_SPECIAL_ANNOTATION
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.ACTUAL_TYPE_ALIAS_NOT_TO_CLASS
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.ACTUAL_TYPE_ALIAS_TO_CLASS_WITH_DECLARATION_SITE_VARIANCE
+import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.ACTUAL_TYPE_ALIAS_TO_EXPECT
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.ACTUAL_TYPE_ALIAS_TO_NOTHING
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.ACTUAL_TYPE_ALIAS_TO_NULLABLE_TYPE
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.ACTUAL_TYPE_ALIAS_WITH_COMPLEX_SUBSTITUTION
@@ -2225,6 +2226,10 @@
"Right-hand side of actual type alias cannot be of type kotlin.Nothing"
)
map.put(
+ ACTUAL_TYPE_ALIAS_TO_EXPECT,
+ "Right-hand side of actual type alias cannot be expect class"
+ )
+ map.put(
ACTUAL_FUNCTION_WITH_DEFAULT_ARGUMENTS,
"Actual function cannot have default argument values. They should be declared in the expected function."
)
diff --git a/compiler/testData/diagnostics/tests/multiplatform/hmpp/actualizationToExpectClass.fir.kt b/compiler/testData/diagnostics/tests/multiplatform/hmpp/actualizationToExpectClass.fir.kt
index 766ca69..25a277b 100644
--- a/compiler/testData/diagnostics/tests/multiplatform/hmpp/actualizationToExpectClass.fir.kt
+++ b/compiler/testData/diagnostics/tests/multiplatform/hmpp/actualizationToExpectClass.fir.kt
@@ -7,7 +7,7 @@
//MODULE: intermediate()()(common)
expect class Intermediate
-actual typealias Common = Intermediate
+<!ACTUAL_TYPE_ALIAS_TO_EXPECT!>actual typealias Common = Intermediate<!>
expect fun intermediateFun(a: Common, b: Intermediate)
expect var intermediateProp: Intermediate
diff --git a/compiler/testData/diagnostics/tests/multiplatform/hmpp/actualizationToExpectClass.ll.kt b/compiler/testData/diagnostics/tests/multiplatform/hmpp/actualizationToExpectClass.ll.kt
index da70d9e..b0bc4f4 100644
--- a/compiler/testData/diagnostics/tests/multiplatform/hmpp/actualizationToExpectClass.ll.kt
+++ b/compiler/testData/diagnostics/tests/multiplatform/hmpp/actualizationToExpectClass.ll.kt
@@ -7,7 +7,7 @@
//MODULE: intermediate()()(common)
expect class Intermediate
-actual typealias Common = Intermediate
+<!ACTUAL_TYPE_ALIAS_TO_EXPECT!>actual typealias Common = Intermediate<!>
expect fun intermediateFun(a: Common, b: Intermediate)
expect var intermediateProp: Intermediate
diff --git a/compiler/testData/diagnostics/tests/multiplatform/hmpp/recursiveActualTypealiasExpansion_1.fir.kt b/compiler/testData/diagnostics/tests/multiplatform/hmpp/recursiveActualTypealiasExpansion_1.fir.kt
index 90ce4bf..a212be7 100644
--- a/compiler/testData/diagnostics/tests/multiplatform/hmpp/recursiveActualTypealiasExpansion_1.fir.kt
+++ b/compiler/testData/diagnostics/tests/multiplatform/hmpp/recursiveActualTypealiasExpansion_1.fir.kt
@@ -6,7 +6,7 @@
expect fun commonFun(a: A)
// MODULE: intermediate1()()(common)
-actual typealias A = B
+<!ACTUAL_TYPE_ALIAS_TO_EXPECT!>actual typealias A = B<!>
// MODULE: intermediate2()()(intermediate1)
actual typealias B = <!RECURSIVE_TYPEALIAS_EXPANSION!>A<!>