Skip to content

Commit 01917f4

Browse files
KvanTTTSpace Team
authored andcommitted
[FIR] Forbid typealiasing for current compiler-required annotations
^KT-79369 Fixed
1 parent 12fb6c2 commit 01917f4

27 files changed

+178
-20
lines changed

analysis/analysis-api-fir/gen/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KaFirDataClassConverters.kt

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5656,6 +5656,20 @@ internal val KT_DIAGNOSTIC_CONVERTER = KaDiagnosticConverterBuilder.buildConvert
56565656
token,
56575657
)
56585658
}
5659+
add(FirErrors.TYPEALIAS_EXPANDS_TO_COMPILER_REQUIRED_ANNOTATION.errorFactory) { firDiagnostic ->
5660+
TypealiasExpandsToCompilerRequiredAnnotationErrorImpl(
5661+
firSymbolBuilder.classifierBuilder.buildClassLikeSymbol(firDiagnostic.a),
5662+
firDiagnostic as KtPsiDiagnostic,
5663+
token,
5664+
)
5665+
}
5666+
add(FirErrors.TYPEALIAS_EXPANDS_TO_COMPILER_REQUIRED_ANNOTATION.warningFactory) { firDiagnostic ->
5667+
TypealiasExpandsToCompilerRequiredAnnotationWarningImpl(
5668+
firSymbolBuilder.classifierBuilder.buildClassLikeSymbol(firDiagnostic.a),
5669+
firDiagnostic as KtPsiDiagnostic,
5670+
token,
5671+
)
5672+
}
56595673
add(FirErrors.REDUNDANT_VISIBILITY_MODIFIER) { firDiagnostic ->
56605674
RedundantVisibilityModifierImpl(
56615675
firDiagnostic as KtPsiDiagnostic,

analysis/analysis-api-fir/gen/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KaFirDiagnostics.kt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3964,6 +3964,16 @@ sealed interface KaFirDiagnostic<PSI : PsiElement> : KaDiagnosticWithPsi<PSI> {
39643964
val outerTypeParameters: List<KaTypeParameterSymbol>
39653965
}
39663966

3967+
interface TypealiasExpandsToCompilerRequiredAnnotationError : KaFirDiagnostic<KtElement> {
3968+
override val diagnosticClass get() = TypealiasExpandsToCompilerRequiredAnnotationError::class
3969+
val annotation: KaClassLikeSymbol
3970+
}
3971+
3972+
interface TypealiasExpandsToCompilerRequiredAnnotationWarning : KaFirDiagnostic<KtElement> {
3973+
override val diagnosticClass get() = TypealiasExpandsToCompilerRequiredAnnotationWarning::class
3974+
val annotation: KaClassLikeSymbol
3975+
}
3976+
39673977
interface RedundantVisibilityModifier : KaFirDiagnostic<KtModifierListOwner> {
39683978
override val diagnosticClass get() = RedundantVisibilityModifier::class
39693979
}

analysis/analysis-api-fir/gen/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KaFirDiagnosticsImpl.kt

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4753,6 +4753,18 @@ internal class TypealiasExpansionCapturesOuterTypeParametersImpl(
47534753
token: KaLifetimeToken,
47544754
) : KaAbstractFirDiagnostic<KtElement>(firDiagnostic, token), KaFirDiagnostic.TypealiasExpansionCapturesOuterTypeParameters
47554755

4756+
internal class TypealiasExpandsToCompilerRequiredAnnotationErrorImpl(
4757+
override val annotation: KaClassLikeSymbol,
4758+
firDiagnostic: KtPsiDiagnostic,
4759+
token: KaLifetimeToken,
4760+
) : KaAbstractFirDiagnostic<KtElement>(firDiagnostic, token), KaFirDiagnostic.TypealiasExpandsToCompilerRequiredAnnotationError
4761+
4762+
internal class TypealiasExpandsToCompilerRequiredAnnotationWarningImpl(
4763+
override val annotation: KaClassLikeSymbol,
4764+
firDiagnostic: KtPsiDiagnostic,
4765+
token: KaLifetimeToken,
4766+
) : KaAbstractFirDiagnostic<KtElement>(firDiagnostic, token), KaFirDiagnostic.TypealiasExpandsToCompilerRequiredAnnotationWarning
4767+
47564768
internal class RedundantVisibilityModifierImpl(
47574769
firDiagnostic: KtPsiDiagnostic,
47584770
token: KaLifetimeToken,

compiler/fir/analysis-tests/testData/resolveWithStdlib/ClassIdDiagnosticRendering.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
// RUN_PIPELINE_TILL: FRONTEND
2+
// LANGUAGE: -ForbidTypeAliasToCompilerRequiredAnnotation
23
// WITH_EXTRA_CHECKERS
34

45
package a.b.c
@@ -31,7 +32,7 @@ fun testOverrides() {
3132
}
3233
}
3334

34-
<!NOT_A_MULTIPLATFORM_COMPILATION!>actual<!> typealias TypealiasToKotlinPkg = <!ACTUAL_TYPEALIAS_TO_SPECIAL_ANNOTATION("kotlin.Deprecated")!>kotlin.Deprecated<!>
35+
<!NOT_A_MULTIPLATFORM_COMPILATION!>actual<!> typealias TypealiasToKotlinPkg = <!ACTUAL_TYPEALIAS_TO_SPECIAL_ANNOTATION("kotlin.Deprecated"), TYPEALIAS_EXPANDS_TO_COMPILER_REQUIRED_ANNOTATION_WARNING!>kotlin.Deprecated<!>
3536

3637
/* GENERATED_FIR_TAGS: actual, annotationDeclaration, anonymousObjectExpression, classDeclaration, classReference,
3738
funInterface, functionDeclaration, interfaceDeclaration, override, typeAliasDeclaration */

compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1974,6 +1974,9 @@ object DIAGNOSTICS_LIST : DiagnosticList("FirErrors") {
19741974
val TYPEALIAS_EXPANSION_CAPTURES_OUTER_TYPE_PARAMETERS by error<KtElement> {
19751975
parameter<Set<FirTypeParameterSymbol>>("outerTypeParameters")
19761976
}
1977+
val TYPEALIAS_EXPANDS_TO_COMPILER_REQUIRED_ANNOTATION by deprecationError<KtElement>(LanguageFeature.ForbidTypeAliasToCompilerRequiredAnnotation) {
1978+
parameter<FirRegularClassSymbol>("annotation")
1979+
}
19771980
}
19781981

19791982
val EXTRA_CHECKERS by object : DiagnosticGroup("Extra checkers") {

compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import org.jetbrains.kotlin.config.LanguageFeature.ForbidObjectDelegationToItsel
2323
import org.jetbrains.kotlin.config.LanguageFeature.ForbidParenthesizedLhsInAssignments
2424
import org.jetbrains.kotlin.config.LanguageFeature.ForbidProjectionsInAnnotationProperties
2525
import org.jetbrains.kotlin.config.LanguageFeature.ForbidReifiedTypeParametersOnTypeAliases
26+
import org.jetbrains.kotlin.config.LanguageFeature.ForbidTypeAliasToCompilerRequiredAnnotation
2627
import org.jetbrains.kotlin.config.LanguageFeature.ForbidUpperBoundsViolationOnTypeOperatorAndParameterBounds
2728
import org.jetbrains.kotlin.config.LanguageFeature.ModifierNonBuiltinSuspendFunError
2829
import org.jetbrains.kotlin.config.LanguageFeature.ProhibitAllMultipleDefaultsInheritedFromSupertypes
@@ -949,6 +950,7 @@ object FirErrors : KtDiagnosticsContainer() {
949950
val TYPEALIAS_SHOULD_EXPAND_TO_CLASS: KtDiagnosticFactory1<ConeKotlinType> = KtDiagnosticFactory1("TYPEALIAS_SHOULD_EXPAND_TO_CLASS", ERROR, SourceElementPositioningStrategies.DEFAULT, KtElement::class, getRendererFactory())
950951
val CONSTRUCTOR_OR_SUPERTYPE_ON_TYPEALIAS_WITH_TYPE_PROJECTION: KtDiagnosticFactoryForDeprecation0 = KtDiagnosticFactoryForDeprecation0("CONSTRUCTOR_OR_SUPERTYPE_ON_TYPEALIAS_WITH_TYPE_PROJECTION", ProhibitConstructorAndSupertypeOnTypealiasWithTypeProjection, SourceElementPositioningStrategies.DEFAULT, KtElement::class, getRendererFactory())
951952
val TYPEALIAS_EXPANSION_CAPTURES_OUTER_TYPE_PARAMETERS: KtDiagnosticFactory1<Set<FirTypeParameterSymbol>> = KtDiagnosticFactory1("TYPEALIAS_EXPANSION_CAPTURES_OUTER_TYPE_PARAMETERS", ERROR, SourceElementPositioningStrategies.DEFAULT, KtElement::class, getRendererFactory())
953+
val TYPEALIAS_EXPANDS_TO_COMPILER_REQUIRED_ANNOTATION: KtDiagnosticFactoryForDeprecation1<FirRegularClassSymbol> = KtDiagnosticFactoryForDeprecation1("TYPEALIAS_EXPANDS_TO_COMPILER_REQUIRED_ANNOTATION", ForbidTypeAliasToCompilerRequiredAnnotation, SourceElementPositioningStrategies.DEFAULT, KtElement::class, getRendererFactory())
952954

953955
// Extra checkers
954956
val REDUNDANT_VISIBILITY_MODIFIER: KtDiagnosticFactory0 = KtDiagnosticFactory0("REDUNDANT_VISIBILITY_MODIFIER", WARNING, SourceElementPositioningStrategies.VISIBILITY_MODIFIER, KtModifierListOwner::class, getRendererFactory())

compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirNonSuppressibleErrorNames.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -646,6 +646,7 @@ val FIR_NON_SUPPRESSIBLE_ERROR_NAMES: Set<String> = setOf(
646646
"TYPEALIAS_SHOULD_EXPAND_TO_CLASS",
647647
"CONSTRUCTOR_OR_SUPERTYPE_ON_TYPEALIAS_WITH_TYPE_PROJECTION_ERROR",
648648
"TYPEALIAS_EXPANSION_CAPTURES_OUTER_TYPE_PARAMETERS",
649+
"TYPEALIAS_EXPANDS_TO_COMPILER_REQUIRED_ANNOTATION_ERROR",
649650
"RETURN_NOT_ALLOWED",
650651
"NOT_A_FUNCTION_LABEL",
651652
"RETURN_IN_FUNCTION_WITH_EXPRESSION_BODY",

compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirAnyTypeAliasChecker.kt

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
package org.jetbrains.kotlin.fir.analysis.checkers.declaration
77

88
import org.jetbrains.kotlin.config.LanguageFeature
9+
import org.jetbrains.kotlin.descriptors.ClassKind
910
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
1011
import org.jetbrains.kotlin.diagnostics.DiagnosticReporter
1112
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors
@@ -16,6 +17,7 @@ import org.jetbrains.kotlin.fir.analysis.checkers.isMalformedExpandedType
1617
import org.jetbrains.kotlin.fir.analysis.checkers.isTopLevel
1718
import org.jetbrains.kotlin.fir.analysis.checkers.requireFeatureSupport
1819
import org.jetbrains.kotlin.fir.declarations.FirTypeAlias
20+
import org.jetbrains.kotlin.fir.declarations.annotationPlatformSupport
1921
import org.jetbrains.kotlin.fir.declarations.utils.isInner
2022
import org.jetbrains.kotlin.fir.isEnabled
2123
import org.jetbrains.kotlin.fir.resolve.fullyExpandedType
@@ -39,7 +41,15 @@ object FirAnyTypeAliasChecker : FirTypeAliasChecker(MppCheckerKind.Common) {
3941
declaration.checkTypeAliasExpansionCapturesOuterTypeParameters(fullyExpandedType, expandedTypeRef)
4042

4143
if (!fullyExpandedType.hasError()) {
42-
if (fullyExpandedType.toRegularClassSymbol() == null || fullyExpandedType is ConeDynamicType) {
44+
val expandedClassSymbol = fullyExpandedType.toRegularClassSymbol()
45+
46+
if (expandedClassSymbol?.classKind == ClassKind.ANNOTATION_CLASS &&
47+
context.session.annotationPlatformSupport.requiredAnnotations.contains(expandedClassSymbol.classId)
48+
) {
49+
reporter.reportOn(expandedTypeRef.source, FirErrors.TYPEALIAS_EXPANDS_TO_COMPILER_REQUIRED_ANNOTATION, expandedClassSymbol)
50+
}
51+
52+
if (expandedClassSymbol == null || fullyExpandedType is ConeDynamicType) {
4353
// Skip reporting if RHS is a type alias to keep the amount of error minimal
4454
if (expandedTypeRef.coneType.toTypeAliasSymbol() == null) {
4555
reporter.reportOn(expandedTypeRef.source, FirErrors.TYPEALIAS_SHOULD_EXPAND_TO_CLASS, fullyExpandedType)

compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrorsDefaultMessages.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -804,6 +804,7 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.UNSUPPORTED
804804
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.UNSUPPORTED_CLASS_LITERALS_WITH_EMPTY_LHS
805805
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.UNSUPPORTED_CONTEXTUAL_DECLARATION_CALL
806806
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.RETURN_IN_FUNCTION_WITH_EXPRESSION_BODY_WARNING
807+
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.TYPEALIAS_EXPANDS_TO_COMPILER_REQUIRED_ANNOTATION
807808
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.UNSUPPORTED_FEATURE
808809
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.UNSUPPORTED_INHERITANCE_FROM_JAVA_MEMBER_REFERENCING_KOTLIN_FUNCTION
809810
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.UNSUPPORTED_SEALED_FUN_INTERFACE
@@ -3332,6 +3333,11 @@ object FirErrorsDefaultMessages : BaseDiagnosticRendererFactory() {
33323333
"Type alias expansion captures outer type parameters: {0}.",
33333334
commaSeparated(SYMBOL_WITH_CONTAINING_DECLARATION),
33343335
)
3336+
map.put(
3337+
TYPEALIAS_EXPANDS_TO_COMPILER_REQUIRED_ANNOTATION,
3338+
"Typealias to a compiler-required annotation ''{0}'' is not allowed. Remove the typealias and use the annotation directly.",
3339+
DECLARATION_FQ_NAME
3340+
)
33353341

33363342
// Returns
33373343
map.put(RETURN_NOT_ALLOWED, "'return' is prohibited here.")

compiler/testData/diagnostics/tests/multiplatform/actualAnnotationsNotMatchExpect/sourceRetentionAnnotationsWhenTypealias.fir.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
// IGNORE_FIR_DIAGNOSTICS
22
// RUN_PIPELINE_TILL: BACKEND
33
// WITH_STDLIB
4+
// LANGUAGE: -ForbidTypeAliasToCompilerRequiredAnnotation
45
// DIAGNOSTICS: -ACTUAL_TYPEALIAS_TO_SPECIAL_ANNOTATION
56
// MODULE: m1-common
67
// FILE: common.kt
@@ -24,7 +25,7 @@ class SourceAvailableImpl {
2425

2526
<!ACTUAL_ANNOTATIONS_NOT_MATCH_EXPECT, ACTUAL_ANNOTATIONS_NOT_MATCH_EXPECT!>actual<!> typealias SourceAvailable = SourceAvailableImpl
2627

27-
actual typealias FromLib = kotlin.SinceKotlin
28+
actual typealias FromLib = <!TYPEALIAS_EXPANDS_TO_COMPILER_REQUIRED_ANNOTATION_WARNING!>kotlin.SinceKotlin<!>
2829

2930
/* GENERATED_FIR_TAGS: actual, annotationDeclaration, classDeclaration, expect, functionDeclaration,
3031
typeAliasDeclaration */

0 commit comments

Comments
 (0)