[FIR] Forbid all use-site targets of FirTypeRef annotations
This commit is contained in:
committed by
Space Team
parent
93ba0c3e70
commit
1378d730d6
+5
-9
@@ -26,21 +26,17 @@ object FirTypeAnnotationChecker : FirTypeRefChecker() {
|
||||
for (annotation in typeRef.annotations) {
|
||||
if (annotation.source == null) continue
|
||||
val useSiteTarget = annotation.useSiteTarget
|
||||
val annotationTargets = annotation.getAllowedAnnotationTargets(context.session)
|
||||
|
||||
// Annotations with `@receiver:` go
|
||||
// Annotations like `@receiver:` go
|
||||
// into FirReceiverParameter, not FirTypeRef
|
||||
if (useSiteTarget == AnnotationUseSiteTarget.RECEIVER) {
|
||||
if (useSiteTarget != null) {
|
||||
reporter.reportOn(
|
||||
annotation.source, FirErrors.WRONG_ANNOTATION_TARGET_WITH_USE_SITE_TARGET,
|
||||
"type usage", useSiteTarget.renderName, context
|
||||
)
|
||||
}
|
||||
|
||||
val annotationTargets = annotation.getAllowedAnnotationTargets(context.session)
|
||||
if (KotlinTarget.TYPE !in annotationTargets) {
|
||||
if (useSiteTarget == null || KotlinTarget.USE_SITE_MAPPING[useSiteTarget] !in annotationTargets) {
|
||||
reporter.reportOn(annotation.source, FirErrors.WRONG_ANNOTATION_TARGET, "type usage", context)
|
||||
}
|
||||
} else if (KotlinTarget.TYPE !in annotationTargets) {
|
||||
reporter.reportOn(annotation.source, FirErrors.WRONG_ANNOTATION_TARGET, "type usage", context)
|
||||
}
|
||||
if (annotation.toAnnotationClassId(context.session) == StandardClassIds.Annotations.ExtensionFunctionType) {
|
||||
if (!typeRef.type.isSomeFunctionType(context.session)) {
|
||||
|
||||
+2
-2
@@ -6,6 +6,6 @@ fun test1(<!WRONG_ANNOTATION_TARGET_WITH_USE_SITE_TARGET!>@<!INAPPLICABLE_FILE_T
|
||||
<!WRONG_ANNOTATION_TARGET_WITH_USE_SITE_TARGET!>@<!INAPPLICABLE_FILE_TARGET!>file<!> <!SYNTAX!>@<!>Suppress("")<!>
|
||||
fun test2() {}
|
||||
|
||||
class OnType(x: @file<!SYNTAX!><!> Suppress("") Int)
|
||||
class OnType(x: <!WRONG_ANNOTATION_TARGET_WITH_USE_SITE_TARGET!>@file<!SYNTAX!><!> Suppress("")<!> Int)
|
||||
|
||||
fun @file : Suppress("") Int.test3() {}
|
||||
fun <!WRONG_ANNOTATION_TARGET_WITH_USE_SITE_TARGET!>@file : Suppress("")<!> Int.test3() {}
|
||||
|
||||
+2
-2
@@ -6,6 +6,6 @@ fun test1(<!WRONG_ANNOTATION_TARGET_WITH_USE_SITE_TARGET!>@<!INAPPLICABLE_FILE_T
|
||||
<!WRONG_ANNOTATION_TARGET_WITH_USE_SITE_TARGET!>@<!INAPPLICABLE_FILE_TARGET!>file<!> <!SYNTAX!>@<!>Suppress("")<!>
|
||||
fun test2() {}
|
||||
|
||||
class OnType(x: @file<!SYNTAX!><!> Suppress("") Int)
|
||||
class OnType(x: <!WRONG_ANNOTATION_TARGET_WITH_USE_SITE_TARGET!>@file<!SYNTAX!><!> Suppress("")<!> Int)
|
||||
|
||||
fun @file : Suppress("") Int.test3() {}
|
||||
fun <!WRONG_ANNOTATION_TARGET_WITH_USE_SITE_TARGET!>@file : Suppress("")<!> Int.test3() {}
|
||||
|
||||
+10
@@ -0,0 +1,10 @@
|
||||
// !LANGUAGE: -ProhibitUseSiteTargetAnnotationsOnSuperTypes
|
||||
|
||||
interface Foo
|
||||
|
||||
@Target(AnnotationTarget.TYPE)
|
||||
annotation class Ann
|
||||
|
||||
class E : <!ANNOTATION_ON_SUPERCLASS_WARNING, WRONG_ANNOTATION_TARGET_WITH_USE_SITE_TARGET!>@field:Ann<!> <!ANNOTATION_ON_SUPERCLASS_WARNING, WRONG_ANNOTATION_TARGET_WITH_USE_SITE_TARGET!>@get:Ann<!> <!ANNOTATION_ON_SUPERCLASS_WARNING, WRONG_ANNOTATION_TARGET_WITH_USE_SITE_TARGET!>@set:Ann<!> <!ANNOTATION_ON_SUPERCLASS_WARNING, WRONG_ANNOTATION_TARGET_WITH_USE_SITE_TARGET!>@setparam:Ann<!> Foo
|
||||
|
||||
interface G : @Ann Foo
|
||||
@@ -1,4 +1,3 @@
|
||||
// FIR_IDENTICAL
|
||||
// !LANGUAGE: -ProhibitUseSiteTargetAnnotationsOnSuperTypes
|
||||
|
||||
interface Foo
|
||||
|
||||
+10
@@ -0,0 +1,10 @@
|
||||
// !LANGUAGE: +ProhibitUseSiteTargetAnnotationsOnSuperTypes
|
||||
|
||||
interface Foo
|
||||
|
||||
@Target(AnnotationTarget.TYPE)
|
||||
annotation class Ann
|
||||
|
||||
class E : <!ANNOTATION_ON_SUPERCLASS_ERROR, WRONG_ANNOTATION_TARGET_WITH_USE_SITE_TARGET!>@field:Ann<!> <!ANNOTATION_ON_SUPERCLASS_ERROR, WRONG_ANNOTATION_TARGET_WITH_USE_SITE_TARGET!>@get:Ann<!> <!ANNOTATION_ON_SUPERCLASS_ERROR, WRONG_ANNOTATION_TARGET_WITH_USE_SITE_TARGET!>@set:Ann<!> <!ANNOTATION_ON_SUPERCLASS_ERROR, WRONG_ANNOTATION_TARGET_WITH_USE_SITE_TARGET!>@setparam:Ann<!> Foo
|
||||
|
||||
interface G : @Ann Foo
|
||||
-1
@@ -1,4 +1,3 @@
|
||||
// FIR_IDENTICAL
|
||||
// !LANGUAGE: +ProhibitUseSiteTargetAnnotationsOnSuperTypes
|
||||
|
||||
interface Foo
|
||||
|
||||
-13
@@ -1,13 +0,0 @@
|
||||
// !LANGUAGE: +RestrictionOfWrongAnnotationsWithUseSiteTargetsOnTypes
|
||||
// !DIAGNOSTICS: -UNUSED_PARAMETER
|
||||
|
||||
fun test1(i: @setparam:Suppress Int) {}
|
||||
fun test2(i: @param:Suppress Int) {}
|
||||
fun test3(i: <!WRONG_ANNOTATION_TARGET_WITH_USE_SITE_TARGET!>@receiver:Suppress<!> Int) {}
|
||||
|
||||
fun test4(): @setparam:Suppress Int = TODO()
|
||||
fun test5(i: (@setparam:Suppress Int) -> Unit) {}
|
||||
|
||||
fun ((@setparam:Suppress Int) -> Unit).test6() {}
|
||||
|
||||
fun test7(): ((@setparam:Suppress Int) -> Unit) = TODO()
|
||||
+1
@@ -1,3 +1,4 @@
|
||||
// FIR_IDENTICAL
|
||||
// !LANGUAGE: +RestrictionOfWrongAnnotationsWithUseSiteTargetsOnTypes
|
||||
// !DIAGNOSTICS: -UNUSED_PARAMETER
|
||||
|
||||
|
||||
-13
@@ -1,13 +0,0 @@
|
||||
// !LANGUAGE: +RestrictionOfWrongAnnotationsWithUseSiteTargetsOnTypes
|
||||
// !DIAGNOSTICS: -UNUSED_PARAMETER
|
||||
|
||||
fun test1(i: @setparam:Suppress Int) {}
|
||||
fun test2(i: @param:Suppress Int) {}
|
||||
fun test3(i: <!WRONG_ANNOTATION_TARGET_WITH_USE_SITE_TARGET!>@receiver:Suppress<!> Int) {}
|
||||
|
||||
fun test4(): @setparam:Suppress Int = TODO()
|
||||
fun test5(i: (@setparam:Suppress Int) -> Unit) {}
|
||||
|
||||
fun ((@setparam:Suppress Int) -> Unit).test6() {}
|
||||
|
||||
fun test7(): ((@setparam:Suppress Int) -> Unit) = TODO()
|
||||
+1
@@ -1,3 +1,4 @@
|
||||
// FIR_IDENTICAL
|
||||
// !LANGUAGE: +RestrictionOfWrongAnnotationsWithUseSiteTargetsOnTypes
|
||||
// !DIAGNOSTICS: -UNUSED_PARAMETER
|
||||
|
||||
|
||||
+6
-6
@@ -1,13 +1,13 @@
|
||||
// !LANGUAGE: -RestrictionOfWrongAnnotationsWithUseSiteTargetsOnTypes
|
||||
// !DIAGNOSTICS: -UNUSED_PARAMETER
|
||||
|
||||
fun test1(i: @setparam:Suppress Int) {}
|
||||
fun test2(i: @param:Suppress Int) {}
|
||||
fun test1(i: <!WRONG_ANNOTATION_TARGET_WITH_USE_SITE_TARGET!>@setparam:Suppress<!> Int) {}
|
||||
fun test2(i: <!WRONG_ANNOTATION_TARGET_WITH_USE_SITE_TARGET!>@param:Suppress<!> Int) {}
|
||||
fun test3(i: <!WRONG_ANNOTATION_TARGET_WITH_USE_SITE_TARGET!>@receiver:Suppress<!> Int) {}
|
||||
|
||||
fun test4(): @setparam:Suppress Int = TODO()
|
||||
fun test5(i: (@setparam:Suppress Int) -> Unit) {}
|
||||
fun test4(): <!WRONG_ANNOTATION_TARGET_WITH_USE_SITE_TARGET!>@setparam:Suppress<!> Int = TODO()
|
||||
fun test5(i: (<!WRONG_ANNOTATION_TARGET_WITH_USE_SITE_TARGET!>@setparam:Suppress<!> Int) -> Unit) {}
|
||||
|
||||
fun ((@setparam:Suppress Int) -> Unit).test6() {}
|
||||
fun ((<!WRONG_ANNOTATION_TARGET_WITH_USE_SITE_TARGET!>@setparam:Suppress<!> Int) -> Unit).test6() {}
|
||||
|
||||
fun test7(): ((@setparam:Suppress Int) -> Unit) = TODO()
|
||||
fun test7(): ((<!WRONG_ANNOTATION_TARGET_WITH_USE_SITE_TARGET!>@setparam:Suppress<!> Int) -> Unit) = TODO()
|
||||
|
||||
+2
-2
@@ -6,7 +6,7 @@ fun Int.train(args: Array<<!WRONG_ANNOTATION_TARGET_WITH_USE_SITE_TARGET!>@recei
|
||||
|
||||
fun Int.plane(<!WRONG_ANNOTATION_TARGET_WITH_USE_SITE_TARGET!>@receiver:Anno<!> args: Array<String>) {}
|
||||
|
||||
fun vein(args: Array<<!WRONG_ANNOTATION_TARGET!>@file:Anno<!> String>) {}
|
||||
fun vein(args: Array<<!WRONG_ANNOTATION_TARGET_WITH_USE_SITE_TARGET!>@file:Anno<!> String>) {}
|
||||
|
||||
fun rain(args: Array<<!WRONG_ANNOTATION_TARGET!>@Anno<!> String>) {}
|
||||
|
||||
@@ -14,6 +14,6 @@ fun <!WRONG_ANNOTATION_TARGET!>@Anno<!> Int.strain() {}
|
||||
|
||||
fun @receiver:Anno Int.drain() {}
|
||||
|
||||
fun <!WRONG_ANNOTATION_TARGET!>@file:Anno<!> Int.brain() {}
|
||||
fun <!WRONG_ANNOTATION_TARGET_WITH_USE_SITE_TARGET!>@file:Anno<!> Int.brain() {}
|
||||
|
||||
fun (<!WRONG_ANNOTATION_TARGET!>@Anno<!> Int).crane() {}
|
||||
|
||||
Reference in New Issue
Block a user