[FIR] Forbid all use-site targets of FirTypeRef annotations

This commit is contained in:
Nikolay Lunyak
2023-03-06 10:27:47 +02:00
committed by Space Team
parent 93ba0c3e70
commit 1378d730d6
13 changed files with 39 additions and 49 deletions
@@ -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)) {
@@ -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() {}
@@ -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() {}
@@ -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
@@ -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,4 +1,3 @@
// FIR_IDENTICAL
// !LANGUAGE: +ProhibitUseSiteTargetAnnotationsOnSuperTypes
interface Foo
@@ -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,3 +1,4 @@
// FIR_IDENTICAL
// !LANGUAGE: +RestrictionOfWrongAnnotationsWithUseSiteTargetsOnTypes
// !DIAGNOSTICS: -UNUSED_PARAMETER
@@ -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,3 +1,4 @@
// FIR_IDENTICAL
// !LANGUAGE: +RestrictionOfWrongAnnotationsWithUseSiteTargetsOnTypes
// !DIAGNOSTICS: -UNUSED_PARAMETER
@@ -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
View File
@@ -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() {}