2/2 Implement deprecation for use-site '@get:' target
^KT-15470 Fixed Review: https://jetbrains.team/p/kt/reviews/9250
This commit is contained in:
+12
@@ -2667,6 +2667,18 @@ public class FirLightTreeOldFrontendDiagnosticsTestGenerated extends AbstractFir
|
||||
runTest("compiler/testData/diagnostics/tests/annotations/withUseSiteTarget/ParamAnnotations.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("prohibitUseSiteGetTargetAnnotationsOff.kt")
|
||||
public void testProhibitUseSiteGetTargetAnnotationsOff() throws Exception {
|
||||
runTest("compiler/testData/diagnostics/tests/annotations/withUseSiteTarget/prohibitUseSiteGetTargetAnnotationsOff.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("prohibitUseSiteGetTargetAnnotationsOn.kt")
|
||||
public void testProhibitUseSiteGetTargetAnnotationsOn() throws Exception {
|
||||
runTest("compiler/testData/diagnostics/tests/annotations/withUseSiteTarget/prohibitUseSiteGetTargetAnnotationsOn.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("PropertyAnnotations.kt")
|
||||
public void testPropertyAnnotations() throws Exception {
|
||||
|
||||
+12
@@ -2673,6 +2673,18 @@ public class FirPsiOldFrontendDiagnosticsTestGenerated extends AbstractFirPsiDia
|
||||
runTest("compiler/testData/diagnostics/tests/annotations/withUseSiteTarget/ParamAnnotations.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("prohibitUseSiteGetTargetAnnotationsOff.kt")
|
||||
public void testProhibitUseSiteGetTargetAnnotationsOff() throws Exception {
|
||||
runTest("compiler/testData/diagnostics/tests/annotations/withUseSiteTarget/prohibitUseSiteGetTargetAnnotationsOff.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("prohibitUseSiteGetTargetAnnotationsOn.kt")
|
||||
public void testProhibitUseSiteGetTargetAnnotationsOn() throws Exception {
|
||||
runTest("compiler/testData/diagnostics/tests/annotations/withUseSiteTarget/prohibitUseSiteGetTargetAnnotationsOn.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("PropertyAnnotations.kt")
|
||||
public void testPropertyAnnotations() throws Exception {
|
||||
|
||||
+3
@@ -292,6 +292,9 @@ object DIAGNOSTICS_LIST : DiagnosticList("FirErrors") {
|
||||
val INAPPLICABLE_TARGET_ON_PROPERTY by error<KtAnnotationEntry> {
|
||||
parameter<String>("useSiteDescription")
|
||||
}
|
||||
val INAPPLICABLE_TARGET_ON_PROPERTY_WARNING by error<KtAnnotationEntry> {
|
||||
parameter<String>("useSiteDescription")
|
||||
}
|
||||
val INAPPLICABLE_TARGET_PROPERTY_IMMUTABLE by error<KtAnnotationEntry> {
|
||||
parameter<String>("useSiteDescription")
|
||||
}
|
||||
|
||||
@@ -252,6 +252,7 @@ object FirErrors {
|
||||
val WRONG_ANNOTATION_TARGET by error1<KtAnnotationEntry, String>()
|
||||
val WRONG_ANNOTATION_TARGET_WITH_USE_SITE_TARGET by error2<KtAnnotationEntry, String, String>()
|
||||
val INAPPLICABLE_TARGET_ON_PROPERTY by error1<KtAnnotationEntry, String>()
|
||||
val INAPPLICABLE_TARGET_ON_PROPERTY_WARNING by error1<KtAnnotationEntry, String>()
|
||||
val INAPPLICABLE_TARGET_PROPERTY_IMMUTABLE by error1<KtAnnotationEntry, String>()
|
||||
val INAPPLICABLE_TARGET_PROPERTY_HAS_NO_DELEGATE by error0<KtAnnotationEntry>()
|
||||
val INAPPLICABLE_TARGET_PROPERTY_HAS_NO_BACKING_FIELD by error0<KtAnnotationEntry>()
|
||||
|
||||
+34
-3
@@ -12,6 +12,7 @@ import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget
|
||||
import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget.*
|
||||
import org.jetbrains.kotlin.descriptors.annotations.KotlinTarget
|
||||
import org.jetbrains.kotlin.diagnostics.DiagnosticReporter
|
||||
import org.jetbrains.kotlin.diagnostics.KtDiagnosticFactory1
|
||||
import org.jetbrains.kotlin.diagnostics.hasValOrVar
|
||||
import org.jetbrains.kotlin.diagnostics.reportOn
|
||||
import org.jetbrains.kotlin.fir.FirAnnotationContainer
|
||||
@@ -29,6 +30,8 @@ import org.jetbrains.kotlin.fir.resolve.fullyExpandedType
|
||||
import org.jetbrains.kotlin.fir.types.*
|
||||
import org.jetbrains.kotlin.name.FqName
|
||||
import org.jetbrains.kotlin.name.StandardClassIds
|
||||
import kotlin.contracts.ExperimentalContracts
|
||||
import kotlin.contracts.contract
|
||||
|
||||
object FirAnnotationChecker : FirBasicDeclarationChecker() {
|
||||
private val deprecatedClassId = FqName("kotlin.Deprecated")
|
||||
@@ -196,6 +199,17 @@ object FirAnnotationChecker : FirBasicDeclarationChecker() {
|
||||
when (target) {
|
||||
PROPERTY,
|
||||
PROPERTY_GETTER -> {
|
||||
checkPropertyGetter(
|
||||
annotated,
|
||||
annotation,
|
||||
target,
|
||||
context,
|
||||
reporter,
|
||||
when (context.session.languageVersionSettings.supportsFeature(LanguageFeature.ProhibitUseSiteGetTargetAnnotations)) {
|
||||
true -> FirErrors.INAPPLICABLE_TARGET_ON_PROPERTY
|
||||
false -> FirErrors.INAPPLICABLE_TARGET_ON_PROPERTY_WARNING
|
||||
}
|
||||
)
|
||||
}
|
||||
FIELD -> {
|
||||
if (annotated is FirProperty && annotated.delegateFieldSymbol != null && !annotated.hasBackingField) {
|
||||
@@ -209,9 +223,9 @@ object FirAnnotationChecker : FirBasicDeclarationChecker() {
|
||||
}
|
||||
PROPERTY_SETTER,
|
||||
SETTER_PARAMETER -> {
|
||||
if (annotated !is FirProperty || annotated.isLocal) {
|
||||
reporter.reportOn(annotation.source, FirErrors.INAPPLICABLE_TARGET_ON_PROPERTY, target.renderName, context)
|
||||
} else if (!annotated.isVar) {
|
||||
if (!checkPropertyGetter(annotated, annotation, target, context, reporter, FirErrors.INAPPLICABLE_TARGET_ON_PROPERTY) &&
|
||||
!annotated.isVar
|
||||
) {
|
||||
reporter.reportOn(annotation.source, FirErrors.INAPPLICABLE_TARGET_PROPERTY_IMMUTABLE, target.renderName, context)
|
||||
}
|
||||
}
|
||||
@@ -244,6 +258,23 @@ object FirAnnotationChecker : FirBasicDeclarationChecker() {
|
||||
}
|
||||
}
|
||||
|
||||
@OptIn(ExperimentalContracts::class)
|
||||
private fun checkPropertyGetter(
|
||||
annotated: FirAnnotationContainer,
|
||||
annotation: FirAnnotation,
|
||||
target: AnnotationUseSiteTarget,
|
||||
context: CheckerContext,
|
||||
reporter: DiagnosticReporter,
|
||||
diagnostic: KtDiagnosticFactory1<String>
|
||||
): Boolean {
|
||||
contract {
|
||||
returns(false) implies (annotated is FirProperty)
|
||||
}
|
||||
val isReport = annotated !is FirProperty || annotated.isLocal
|
||||
if (isReport) reporter.reportOn(annotation.source, diagnostic, target.renderName, context)
|
||||
return isReport
|
||||
}
|
||||
|
||||
private fun checkDeprecatedCalls(
|
||||
deprecatedSinceKotlin: FirAnnotation,
|
||||
deprecated: FirAnnotation?,
|
||||
|
||||
+6
@@ -256,6 +256,7 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.INAPPLICABLE_LATE
|
||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.INAPPLICABLE_OPERATOR_MODIFIER
|
||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.INAPPLICABLE_PARAM_TARGET
|
||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.INAPPLICABLE_TARGET_ON_PROPERTY
|
||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.INAPPLICABLE_TARGET_ON_PROPERTY_WARNING
|
||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.INAPPLICABLE_TARGET_PROPERTY_HAS_NO_BACKING_FIELD
|
||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.INAPPLICABLE_TARGET_PROPERTY_HAS_NO_DELEGATE
|
||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.INAPPLICABLE_TARGET_PROPERTY_IMMUTABLE
|
||||
@@ -857,6 +858,11 @@ object FirErrorsDefaultMessages : BaseDiagnosticRendererFactory() {
|
||||
map.put(ANNOTATION_ON_SUPERCLASS, "Annotations on superclass are meaningless")
|
||||
map.put(WRONG_ANNOTATION_TARGET, "This annotation is not applicable to target ''{0}''", TO_STRING)
|
||||
map.put(INAPPLICABLE_TARGET_ON_PROPERTY, "''@{0}:'' annotations could be applied only to property declarations", TO_STRING)
|
||||
map.put(
|
||||
INAPPLICABLE_TARGET_ON_PROPERTY_WARNING,
|
||||
"''@{0}:'' annotations could be applied only to property declarations. It will be an error in a future release. See https://youtrack.jetbrains.com/issue/KT-15470",
|
||||
TO_STRING
|
||||
)
|
||||
map.put(INAPPLICABLE_TARGET_PROPERTY_IMMUTABLE, "''@{0}:'' annotations could be applied only to mutable properties", TO_STRING)
|
||||
map.put(INAPPLICABLE_TARGET_PROPERTY_HAS_NO_DELEGATE, "'@delegate:' annotations could be applied only to delegated properties")
|
||||
map.put(
|
||||
|
||||
Reference in New Issue
Block a user