Skip to content

Commit 8f08666

Browse files
mglukhikhSpace Team
authored and
Space Team
committed
K2: deprecate use-site targeted annotations on expressions
#KT-75242 Fixed
1 parent ccf0e1d commit 8f08666

File tree

15 files changed

+120
-13
lines changed

15 files changed

+120
-13
lines changed

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

+12
Original file line numberDiff line numberDiff line change
@@ -1238,6 +1238,18 @@ internal val KT_DIAGNOSTIC_CONVERTER = KaDiagnosticConverterBuilder.buildConvert
12381238
token,
12391239
)
12401240
}
1241+
add(FirErrors.ANNOTATION_WITH_USE_SITE_TARGET_ON_EXPRESSION.errorFactory) { firDiagnostic ->
1242+
AnnotationWithUseSiteTargetOnExpressionErrorImpl(
1243+
firDiagnostic as KtPsiDiagnostic,
1244+
token,
1245+
)
1246+
}
1247+
add(FirErrors.ANNOTATION_WITH_USE_SITE_TARGET_ON_EXPRESSION.warningFactory) { firDiagnostic ->
1248+
AnnotationWithUseSiteTargetOnExpressionWarningImpl(
1249+
firDiagnostic as KtPsiDiagnostic,
1250+
token,
1251+
)
1252+
}
12411253
add(FirErrors.INAPPLICABLE_TARGET_ON_PROPERTY) { firDiagnostic ->
12421254
InapplicableTargetOnPropertyImpl(
12431255
firDiagnostic.a,

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

+8
Original file line numberDiff line numberDiff line change
@@ -896,6 +896,14 @@ sealed interface KaFirDiagnostic<PSI : PsiElement> : KaDiagnosticWithPsi<PSI> {
896896
val allowedTargets: List<KotlinTarget>
897897
}
898898

899+
interface AnnotationWithUseSiteTargetOnExpressionError : KaFirDiagnostic<KtAnnotationEntry> {
900+
override val diagnosticClass get() = AnnotationWithUseSiteTargetOnExpressionError::class
901+
}
902+
903+
interface AnnotationWithUseSiteTargetOnExpressionWarning : KaFirDiagnostic<KtAnnotationEntry> {
904+
override val diagnosticClass get() = AnnotationWithUseSiteTargetOnExpressionWarning::class
905+
}
906+
899907
interface InapplicableTargetOnProperty : KaFirDiagnostic<KtAnnotationEntry> {
900908
override val diagnosticClass get() = InapplicableTargetOnProperty::class
901909
val useSiteDescription: String

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

+10
Original file line numberDiff line numberDiff line change
@@ -1071,6 +1071,16 @@ internal class WrongAnnotationTargetWithUseSiteTargetImpl(
10711071
token: KaLifetimeToken,
10721072
) : KaAbstractFirDiagnostic<KtAnnotationEntry>(firDiagnostic, token), KaFirDiagnostic.WrongAnnotationTargetWithUseSiteTarget
10731073

1074+
internal class AnnotationWithUseSiteTargetOnExpressionErrorImpl(
1075+
firDiagnostic: KtPsiDiagnostic,
1076+
token: KaLifetimeToken,
1077+
) : KaAbstractFirDiagnostic<KtAnnotationEntry>(firDiagnostic, token), KaFirDiagnostic.AnnotationWithUseSiteTargetOnExpressionError
1078+
1079+
internal class AnnotationWithUseSiteTargetOnExpressionWarningImpl(
1080+
firDiagnostic: KtPsiDiagnostic,
1081+
token: KaLifetimeToken,
1082+
) : KaAbstractFirDiagnostic<KtAnnotationEntry>(firDiagnostic, token), KaFirDiagnostic.AnnotationWithUseSiteTargetOnExpressionWarning
1083+
10741084
internal class InapplicableTargetOnPropertyImpl(
10751085
override val useSiteDescription: String,
10761086
firDiagnostic: KtPsiDiagnostic,

analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLDiagnosticsFirTestGenerated.java

+6
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLReversedDiagnosticsFirTestGenerated.java

+6
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,31 @@
11
// RUN_PIPELINE_TILL: BACKEND
2+
// LANGUAGE: -ForbidAnnotationsWithUseSiteTargetOnExpressions
23
// ISSUE: KT-75242
34

45
annotation class Decl
56

67
fun test(x: Int) {
78
if (x > 10)
8-
@all:Decl { }
9+
<!ANNOTATION_WITH_USE_SITE_TARGET_ON_EXPRESSION_WARNING!>@all:Decl<!> { }
910

10-
for (i in 1..10) @field:Decl { }
11+
for (i in 1..10) <!ANNOTATION_WITH_USE_SITE_TARGET_ON_EXPRESSION_WARNING!>@field:Decl<!> { }
1112

1213
when (x) {
13-
1 -> @setparam:Decl { "" }
14+
1 -> <!ANNOTATION_WITH_USE_SITE_TARGET_ON_EXPRESSION_WARNING!>@setparam:Decl<!> { "" }
1415
}
1516
}
1617

1718
@Retention(AnnotationRetention.SOURCE)
1819
@Target(AnnotationTarget.EXPRESSION)
1920
annotation class Source
2021

21-
fun test(){
22-
@all:Source
22+
fun test() {
23+
<!ANNOTATION_WITH_USE_SITE_TARGET_ON_EXPRESSION_WARNING!>@all:Source<!>
2324
when { else -> {} }
2425

25-
@get:Source
26+
<!ANNOTATION_WITH_USE_SITE_TARGET_ON_EXPRESSION_WARNING!>@get:Source<!>
2627
while (true) { break }
2728

28-
@receiver:Source
29+
<!ANNOTATION_WITH_USE_SITE_TARGET_ON_EXPRESSION_WARNING!>@receiver:Source<!>
2930
for (i in 1..10) {}
3031
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
// RUN_PIPELINE_TILL: FRONTEND
2+
// LANGUAGE: +ForbidAnnotationsWithUseSiteTargetOnExpressions
3+
// ISSUE: KT-75242
4+
5+
annotation class Decl
6+
7+
fun test(x: Int) {
8+
if (x > 10)
9+
<!ANNOTATION_WITH_USE_SITE_TARGET_ON_EXPRESSION_ERROR!>@all:Decl<!> { }
10+
11+
for (i in 1..10) <!ANNOTATION_WITH_USE_SITE_TARGET_ON_EXPRESSION_ERROR!>@field:Decl<!> { }
12+
13+
when (x) {
14+
1 -> <!ANNOTATION_WITH_USE_SITE_TARGET_ON_EXPRESSION_ERROR!>@setparam:Decl<!> { "" }
15+
}
16+
}
17+
18+
@Retention(AnnotationRetention.SOURCE)
19+
@Target(AnnotationTarget.EXPRESSION)
20+
annotation class Source
21+
22+
fun test() {
23+
<!ANNOTATION_WITH_USE_SITE_TARGET_ON_EXPRESSION_ERROR!>@all:Source<!>
24+
when { else -> {} }
25+
26+
<!ANNOTATION_WITH_USE_SITE_TARGET_ON_EXPRESSION_ERROR!>@get:Source<!>
27+
while (true) { break }
28+
29+
<!ANNOTATION_WITH_USE_SITE_TARGET_ON_EXPRESSION_ERROR!>@receiver:Source<!>
30+
for (i in 1..10) {}
31+
}

compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeDiagnosticsWithLatestLanguageVersionTestGenerated.java

+6
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/PhasedJvmDiagnosticLightTreeTestGenerated.java

+6
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/PhasedJvmDiagnosticPsiTestGenerated.java

+6
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

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

+3
Original file line numberDiff line numberDiff line change
@@ -417,6 +417,9 @@ object DIAGNOSTICS_LIST : DiagnosticList("FirErrors") {
417417
parameter<String>("useSiteTarget")
418418
parameter<Collection<KotlinTarget>>("allowedTargets")
419419
}
420+
val ANNOTATION_WITH_USE_SITE_TARGET_ON_EXPRESSION by deprecationError<KtAnnotationEntry>(
421+
LanguageFeature.ForbidAnnotationsWithUseSiteTargetOnExpressions
422+
)
420423
val INAPPLICABLE_TARGET_ON_PROPERTY by error<KtAnnotationEntry> {
421424
parameter<String>("useSiteDescription")
422425
}

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

+2
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import org.jetbrains.kotlin.builtins.functions.FunctionTypeKind
1212
import org.jetbrains.kotlin.config.ApiVersion
1313
import org.jetbrains.kotlin.config.LanguageFeature
1414
import org.jetbrains.kotlin.config.LanguageFeature.ErrorAboutDataClassCopyVisibilityChange
15+
import org.jetbrains.kotlin.config.LanguageFeature.ForbidAnnotationsWithUseSiteTargetOnExpressions
1516
import org.jetbrains.kotlin.config.LanguageFeature.ForbidCompanionInLocalInnerClass
1617
import org.jetbrains.kotlin.config.LanguageFeature.ForbidEnumEntryNamedEntries
1718
import org.jetbrains.kotlin.config.LanguageFeature.ForbidExposingTypesInPrimaryConstructorProperties
@@ -328,6 +329,7 @@ object FirErrors {
328329
val WRONG_ANNOTATION_TARGET: KtDiagnosticFactory2<String, Collection<KotlinTarget>> = KtDiagnosticFactory2("WRONG_ANNOTATION_TARGET", ERROR, SourceElementPositioningStrategies.DEFAULT, KtAnnotationEntry::class)
329330
val WRONG_ANNOTATION_TARGET_WARNING: KtDiagnosticFactory2<String, Collection<KotlinTarget>> = KtDiagnosticFactory2("WRONG_ANNOTATION_TARGET_WARNING", WARNING, SourceElementPositioningStrategies.DEFAULT, KtAnnotationEntry::class)
330331
val WRONG_ANNOTATION_TARGET_WITH_USE_SITE_TARGET: KtDiagnosticFactory3<String, String, Collection<KotlinTarget>> = KtDiagnosticFactory3("WRONG_ANNOTATION_TARGET_WITH_USE_SITE_TARGET", ERROR, SourceElementPositioningStrategies.DEFAULT, KtAnnotationEntry::class)
332+
val ANNOTATION_WITH_USE_SITE_TARGET_ON_EXPRESSION: KtDiagnosticFactoryForDeprecation0 = KtDiagnosticFactoryForDeprecation0("ANNOTATION_WITH_USE_SITE_TARGET_ON_EXPRESSION", ForbidAnnotationsWithUseSiteTargetOnExpressions, SourceElementPositioningStrategies.DEFAULT, KtAnnotationEntry::class)
331333
val INAPPLICABLE_TARGET_ON_PROPERTY: KtDiagnosticFactory1<String> = KtDiagnosticFactory1("INAPPLICABLE_TARGET_ON_PROPERTY", ERROR, SourceElementPositioningStrategies.DEFAULT, KtAnnotationEntry::class)
332334
val INAPPLICABLE_TARGET_ON_PROPERTY_WARNING: KtDiagnosticFactory1<String> = KtDiagnosticFactory1("INAPPLICABLE_TARGET_ON_PROPERTY_WARNING", WARNING, SourceElementPositioningStrategies.DEFAULT, KtAnnotationEntry::class)
333335
val INAPPLICABLE_TARGET_PROPERTY_IMMUTABLE: KtDiagnosticFactory1<String> = KtDiagnosticFactory1("INAPPLICABLE_TARGET_PROPERTY_IMMUTABLE", ERROR, SourceElementPositioningStrategies.DEFAULT, KtAnnotationEntry::class)

compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirExpressionAnnotationChecker.kt

+8-6
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55

66
package org.jetbrains.kotlin.fir.analysis.checkers.expression
77

8-
import org.jetbrains.kotlin.KtFakeSourceElementKind
98
import org.jetbrains.kotlin.KtRealSourceElementKind
109
import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget
1110
import org.jetbrains.kotlin.descriptors.annotations.KotlinTarget
@@ -30,10 +29,9 @@ object FirExpressionAnnotationChecker : FirBasicExpressionChecker(MppCheckerKind
3029
override fun check(expression: FirStatement, context: CheckerContext, reporter: DiagnosticReporter) {
3130
// Declarations are checked separately
3231
// See KT-58723 about annotations on non-expression statements
33-
if (expression is FirDeclaration ||
34-
expression is FirErrorExpression ||
35-
expression is FirBlock && expression.source?.kind == KtRealSourceElementKind
36-
) return
32+
if (expression is FirDeclaration || expression is FirErrorExpression) {
33+
return
34+
}
3735

3836
// To prevent double-reporting (we have also a call in this case)
3937
if (expression is FirVariableAssignment && expression.lValue is FirDesugaredAssignmentValueReferenceExpression) {
@@ -44,14 +42,18 @@ object FirExpressionAnnotationChecker : FirBasicExpressionChecker(MppCheckerKind
4442
if (annotations.isEmpty()) return
4543

4644
val annotationsMap = hashMapOf<ConeKotlinType, MutableList<AnnotationUseSiteTarget?>>()
45+
val inRealBlock = expression is FirBlock && expression.source?.kind == KtRealSourceElementKind
4746

4847
for (annotation in annotations) {
4948
val useSiteTarget = annotation.useSiteTarget ?: expression.getDefaultUseSiteTarget(annotation, context)
5049
val existingTargetsForAnnotation = annotationsMap.getOrPut(annotation.annotationTypeRef.coneType) { arrayListOf() }
5150

5251
val allowedAnnotationTargets = annotation.getAllowedAnnotationTargets(context.session)
53-
if (KotlinTarget.EXPRESSION !in allowedAnnotationTargets) {
52+
// We don't want to report WRONG_ANNOTATION_TARGET on a block according to KT-52175
53+
if (!inRealBlock && KotlinTarget.EXPRESSION !in allowedAnnotationTargets) {
5454
reporter.reportOn(annotation.source, FirErrors.WRONG_ANNOTATION_TARGET, "expression", allowedAnnotationTargets, context)
55+
} else if (useSiteTarget != null) {
56+
reporter.reportOn(annotation.source, FirErrors.ANNOTATION_WITH_USE_SITE_TARGET_ON_EXPRESSION, context)
5557
}
5658

5759
checkRepeatedAnnotation(useSiteTarget, existingTargetsForAnnotation, annotation, context, reporter, annotation.source)

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

+7
Original file line numberDiff line numberDiff line change
@@ -428,6 +428,7 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.MODIFIER_FORM_FOR
428428
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.MODIFIER_FORM_FOR_NON_BUILT_IN_SUSPEND_FUN
429429
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.AMBIGUOUS_CONTEXT_ARGUMENT
430430
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.ANNOTATIONS_ON_BLOCK_LEVEL_EXPRESSION_ON_THE_SAME_LINE
431+
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.ANNOTATION_WITH_USE_SITE_TARGET_ON_EXPRESSION
431432
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.ATOMIC_REF_WITHOUT_CONSISTENT_IDENTITY
432433
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.CALLABLE_REFERENCE_TO_CONTEXTUAL_DECLARATION
433434
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.COMPARE_TO_TYPE_MISMATCH
@@ -1213,6 +1214,12 @@ object FirErrorsDefaultMessages : BaseDiagnosticRendererFactory() {
12131214
TO_STRING,
12141215
KOTLIN_TARGETS,
12151216
)
1217+
map.put(
1218+
ANNOTATION_WITH_USE_SITE_TARGET_ON_EXPRESSION.warningFactory,
1219+
"Use-site targets in annotations on expressions will become an error in Kotlin " +
1220+
"${ANNOTATION_WITH_USE_SITE_TARGET_ON_EXPRESSION.deprecatingFeature.sinceVersion?.versionString}."
1221+
)
1222+
map.put(ANNOTATION_WITH_USE_SITE_TARGET_ON_EXPRESSION.errorFactory, "Use-site targets are forbidden in annotations on expressions.")
12161223
map.put(REPEATED_ANNOTATION, "This annotation is not repeatable.")
12171224
map.put(REPEATED_ANNOTATION_WARNING, "This annotation is not repeatable.")
12181225
map.put(NON_INTERNAL_PUBLISHED_API, "'@PublishedApi' annotation is only applicable to internal declaration.")

compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt

+1
Original file line numberDiff line numberDiff line change
@@ -403,6 +403,7 @@ enum class LanguageFeature(
403403
DontMakeExplicitJavaTypeArgumentsFlexible(KOTLIN_2_3, kind = OTHER), // KT-71718
404404
ResolveTopLevelLambdasAsSyntheticCallArgument(KOTLIN_2_3, kind = OTHER), // KT-67869
405405
UnstableSmartcastOnDelegatedProperties(KOTLIN_2_3, kind = BUG_FIX), // KTLC-273
406+
ForbidAnnotationsWithUseSiteTargetOnExpressions(KOTLIN_2_3, kind = BUG_FIX), // KT-75242
406407

407408
// End of 2.* language features --------------------------------------------------
408409

0 commit comments

Comments
 (0)