FIR: position INAPPLICABLE_FILE_TARGET on file use-site (when possible)
This commit is contained in:
+1
@@ -70,6 +70,7 @@ enum class PositioningStrategy(private val strategy: String? = null) {
|
||||
FUN_INTERFACE,
|
||||
RESERVED_UNDERSCORE,
|
||||
QUESTION_MARK_BY_TYPE,
|
||||
ANNOTATION_USE_SITE,
|
||||
|
||||
;
|
||||
|
||||
|
||||
+7
-7
@@ -180,19 +180,19 @@ object DIAGNOSTICS_LIST : DiagnosticList() {
|
||||
parameter<String>("actualTarget")
|
||||
parameter<String>("useSiteTarget")
|
||||
}
|
||||
val INAPPLICABLE_TARGET_ON_PROPERTY by error<PsiElement> {
|
||||
val INAPPLICABLE_TARGET_ON_PROPERTY by error<KtAnnotationEntry> {
|
||||
parameter<String>("useSiteDescription")
|
||||
}
|
||||
val INAPPLICABLE_TARGET_PROPERTY_IMMUTABLE by error<PsiElement> {
|
||||
val INAPPLICABLE_TARGET_PROPERTY_IMMUTABLE by error<KtAnnotationEntry> {
|
||||
parameter<String>("useSiteDescription")
|
||||
}
|
||||
val INAPPLICABLE_TARGET_PROPERTY_HAS_NO_DELEGATE by error<PsiElement>()
|
||||
val INAPPLICABLE_TARGET_PROPERTY_HAS_NO_BACKING_FIELD by error<PsiElement>()
|
||||
val INAPPLICABLE_PARAM_TARGET by error<PsiElement>()
|
||||
val REDUNDANT_ANNOTATION_TARGET by warning<PsiElement> {
|
||||
val INAPPLICABLE_TARGET_PROPERTY_HAS_NO_DELEGATE by error<KtAnnotationEntry>()
|
||||
val INAPPLICABLE_TARGET_PROPERTY_HAS_NO_BACKING_FIELD by error<KtAnnotationEntry>()
|
||||
val INAPPLICABLE_PARAM_TARGET by error<KtAnnotationEntry>()
|
||||
val REDUNDANT_ANNOTATION_TARGET by warning<KtAnnotationEntry> {
|
||||
parameter<String>("useSiteDescription")
|
||||
}
|
||||
val INAPPLICABLE_FILE_TARGET by error<PsiElement>()
|
||||
val INAPPLICABLE_FILE_TARGET by error<KtAnnotationEntry>(PositioningStrategy.ANNOTATION_USE_SITE)
|
||||
}
|
||||
|
||||
val EXPOSED_VISIBILITY by object : DiagnosticGroup("Exposed visibility") {
|
||||
|
||||
+7
-7
@@ -181,13 +181,13 @@ object FirErrors {
|
||||
val RESTRICTED_RETENTION_FOR_EXPRESSION_ANNOTATION by error0<PsiElement>()
|
||||
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<PsiElement, String>()
|
||||
val INAPPLICABLE_TARGET_PROPERTY_IMMUTABLE by error1<PsiElement, String>()
|
||||
val INAPPLICABLE_TARGET_PROPERTY_HAS_NO_DELEGATE by error0<PsiElement>()
|
||||
val INAPPLICABLE_TARGET_PROPERTY_HAS_NO_BACKING_FIELD by error0<PsiElement>()
|
||||
val INAPPLICABLE_PARAM_TARGET by error0<PsiElement>()
|
||||
val REDUNDANT_ANNOTATION_TARGET by warning1<PsiElement, String>()
|
||||
val INAPPLICABLE_FILE_TARGET by error0<PsiElement>()
|
||||
val INAPPLICABLE_TARGET_ON_PROPERTY 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>()
|
||||
val INAPPLICABLE_PARAM_TARGET by error0<KtAnnotationEntry>()
|
||||
val REDUNDANT_ANNOTATION_TARGET by warning1<KtAnnotationEntry, String>()
|
||||
val INAPPLICABLE_FILE_TARGET by error0<KtAnnotationEntry>(SourceElementPositioningStrategies.ANNOTATION_USE_SITE)
|
||||
|
||||
// Exposed visibility
|
||||
val EXPOSED_TYPEALIAS_EXPANDED_TYPE by error3<KtNamedDeclaration, EffectiveVisibility, FirMemberDeclaration, EffectiveVisibility>(SourceElementPositioningStrategies.DECLARATION_NAME)
|
||||
|
||||
+15
@@ -706,6 +706,21 @@ object LightTreePositioningStrategies {
|
||||
return super.mark(node, startOffset, endOffset, tree)
|
||||
}
|
||||
}
|
||||
|
||||
val ANNOTATION_USE_SITE: LightTreePositioningStrategy = object : LightTreePositioningStrategy() {
|
||||
override fun mark(
|
||||
node: LighterASTNode,
|
||||
startOffset: Int,
|
||||
endOffset: Int,
|
||||
tree: FlyweightCapableTreeStructure<LighterASTNode>
|
||||
): List<TextRange> {
|
||||
val useSiteTarget = tree.findChildByType(node, KtNodeTypes.ANNOTATION_TARGET)
|
||||
if (useSiteTarget != null) {
|
||||
return markElement(useSiteTarget, startOffset, endOffset, tree, node)
|
||||
}
|
||||
return super.mark(node, startOffset, endOffset, tree)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun FirSourceElement.hasValOrVar(): Boolean =
|
||||
|
||||
+5
@@ -242,4 +242,9 @@ object SourceElementPositioningStrategies {
|
||||
LightTreePositioningStrategies.QUESTION_MARK_BY_TYPE,
|
||||
PositioningStrategies.QUESTION_MARK_BY_TYPE
|
||||
)
|
||||
|
||||
val ANNOTATION_USE_SITE = SourceElementPositioningStrategy(
|
||||
LightTreePositioningStrategies.ANNOTATION_USE_SITE,
|
||||
PositioningStrategies.ANNOTATION_USE_SITE
|
||||
)
|
||||
}
|
||||
|
||||
@@ -865,6 +865,12 @@ object PositioningStrategies {
|
||||
}
|
||||
}
|
||||
|
||||
val ANNOTATION_USE_SITE: PositioningStrategy<KtAnnotationEntry> = object : PositioningStrategy<KtAnnotationEntry>() {
|
||||
override fun mark(element: KtAnnotationEntry): List<TextRange> {
|
||||
return markElement(element.useSiteTarget ?: element)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param locateReferencedName whether to remove any nested parentheses while locating the reference element. This is useful for
|
||||
|
||||
+3
-3
@@ -1,12 +1,12 @@
|
||||
package bar
|
||||
|
||||
<!MUST_BE_INITIALIZED!><!INAPPLICABLE_FILE_TARGET, WRONG_ANNOTATION_TARGET_WITH_USE_SITE_TARGET!>@file:foo<!>
|
||||
<!MUST_BE_INITIALIZED!><!WRONG_ANNOTATION_TARGET_WITH_USE_SITE_TARGET!>@<!INAPPLICABLE_FILE_TARGET!>file<!>:foo<!>
|
||||
val prop<!>
|
||||
|
||||
@file:[<!INAPPLICABLE_FILE_TARGET, WRONG_ANNOTATION_TARGET_WITH_USE_SITE_TARGET!>bar<!> <!INAPPLICABLE_FILE_TARGET, WRONG_ANNOTATION_TARGET_WITH_USE_SITE_TARGET!>baz<!>]
|
||||
@<!INAPPLICABLE_FILE_TARGET{PSI}, INAPPLICABLE_FILE_TARGET{PSI}!>file<!>:[<!INAPPLICABLE_FILE_TARGET{LT}, WRONG_ANNOTATION_TARGET_WITH_USE_SITE_TARGET!>bar<!> <!INAPPLICABLE_FILE_TARGET{LT}, WRONG_ANNOTATION_TARGET_WITH_USE_SITE_TARGET!>baz<!>]
|
||||
fun func() {}
|
||||
|
||||
@file:[<!INAPPLICABLE_FILE_TARGET, WRONG_ANNOTATION_TARGET_WITH_USE_SITE_TARGET!>baz<!>]
|
||||
@<!INAPPLICABLE_FILE_TARGET{PSI}!>file<!>:[<!INAPPLICABLE_FILE_TARGET{LT}, WRONG_ANNOTATION_TARGET_WITH_USE_SITE_TARGET!>baz<!>]
|
||||
class C
|
||||
|
||||
<!SYNTAX!>@file:<!>
|
||||
|
||||
Vendored
+1
-1
@@ -1,6 +1,6 @@
|
||||
<!WRONG_ANNOTATION_TARGET_WITH_USE_SITE_TARGET!>@file:foo<!>
|
||||
@foo @bar
|
||||
@file:[<!INAPPLICABLE_FILE_TARGET, WRONG_ANNOTATION_TARGET_WITH_USE_SITE_TARGET!>baz<!>]
|
||||
@<!INAPPLICABLE_FILE_TARGET{PSI}!>file<!>:[<!INAPPLICABLE_FILE_TARGET{LT}, WRONG_ANNOTATION_TARGET_WITH_USE_SITE_TARGET!>baz<!>]
|
||||
fun test() {}
|
||||
|
||||
annotation class foo
|
||||
|
||||
-8
@@ -1,8 +0,0 @@
|
||||
<!WRONG_ANNOTATION_TARGET_WITH_USE_SITE_TARGET!>@file:foo<!>
|
||||
@foo @bar
|
||||
<!INAPPLICABLE_FILE_TARGET, WRONG_ANNOTATION_TARGET_WITH_USE_SITE_TARGET!>@file: baz<!>
|
||||
fun test() {}
|
||||
|
||||
annotation class foo
|
||||
annotation class bar
|
||||
annotation class baz
|
||||
+1
@@ -1,3 +1,4 @@
|
||||
// FIR_IDENTICAL
|
||||
<!WRONG_ANNOTATION_TARGET_WITH_USE_SITE_TARGET!>@file:foo<!>
|
||||
@foo @bar
|
||||
<!WRONG_ANNOTATION_TARGET_WITH_USE_SITE_TARGET!>@<!INAPPLICABLE_FILE_TARGET!>file<!>: baz<!>
|
||||
|
||||
+2
-2
@@ -1,9 +1,9 @@
|
||||
// !LANGUAGE: +RestrictionOfWrongAnnotationsWithUseSiteTargetsOnTypes
|
||||
// !DIAGNOSTICS: -UNUSED_PARAMETER
|
||||
|
||||
fun test1(<!INAPPLICABLE_FILE_TARGET, WRONG_ANNOTATION_TARGET_WITH_USE_SITE_TARGET!>@file<!SYNTAX!><!> Suppress("")<!> x: Int) {}
|
||||
fun test1(<!WRONG_ANNOTATION_TARGET_WITH_USE_SITE_TARGET!>@<!INAPPLICABLE_FILE_TARGET!>file<!><!SYNTAX!><!> Suppress("")<!> x: Int) {}
|
||||
|
||||
<!INAPPLICABLE_FILE_TARGET, WRONG_ANNOTATION_TARGET_WITH_USE_SITE_TARGET!>@file <!SYNTAX!>@<!>Suppress("")<!>
|
||||
<!WRONG_ANNOTATION_TARGET_WITH_USE_SITE_TARGET!>@<!INAPPLICABLE_FILE_TARGET!>file<!> <!SYNTAX!>@<!>Suppress("")<!>
|
||||
fun test2() {}
|
||||
|
||||
class OnType(x: @file<!SYNTAX!><!> Suppress("") Int)
|
||||
|
||||
+2
-2
@@ -1,9 +1,9 @@
|
||||
// !LANGUAGE: -RestrictionOfWrongAnnotationsWithUseSiteTargetsOnTypes
|
||||
// !DIAGNOSTICS: -UNUSED_PARAMETER
|
||||
|
||||
fun test1(<!INAPPLICABLE_FILE_TARGET, WRONG_ANNOTATION_TARGET_WITH_USE_SITE_TARGET!>@file<!SYNTAX!><!> Suppress("")<!> x: Int) {}
|
||||
fun test1(<!WRONG_ANNOTATION_TARGET_WITH_USE_SITE_TARGET!>@<!INAPPLICABLE_FILE_TARGET!>file<!><!SYNTAX!><!> Suppress("")<!> x: Int) {}
|
||||
|
||||
<!INAPPLICABLE_FILE_TARGET, WRONG_ANNOTATION_TARGET_WITH_USE_SITE_TARGET!>@file <!SYNTAX!>@<!>Suppress("")<!>
|
||||
<!WRONG_ANNOTATION_TARGET_WITH_USE_SITE_TARGET!>@<!INAPPLICABLE_FILE_TARGET!>file<!> <!SYNTAX!>@<!>Suppress("")<!>
|
||||
fun test2() {}
|
||||
|
||||
class OnType(x: @file<!SYNTAX!><!> Suppress("") Int)
|
||||
|
||||
+7
-7
@@ -449,34 +449,34 @@ sealed class KtFirDiagnostic<PSI: PsiElement> : KtDiagnosticWithPsi<PSI> {
|
||||
abstract val useSiteTarget: String
|
||||
}
|
||||
|
||||
abstract class InapplicableTargetOnProperty : KtFirDiagnostic<PsiElement>() {
|
||||
abstract class InapplicableTargetOnProperty : KtFirDiagnostic<KtAnnotationEntry>() {
|
||||
override val diagnosticClass get() = InapplicableTargetOnProperty::class
|
||||
abstract val useSiteDescription: String
|
||||
}
|
||||
|
||||
abstract class InapplicableTargetPropertyImmutable : KtFirDiagnostic<PsiElement>() {
|
||||
abstract class InapplicableTargetPropertyImmutable : KtFirDiagnostic<KtAnnotationEntry>() {
|
||||
override val diagnosticClass get() = InapplicableTargetPropertyImmutable::class
|
||||
abstract val useSiteDescription: String
|
||||
}
|
||||
|
||||
abstract class InapplicableTargetPropertyHasNoDelegate : KtFirDiagnostic<PsiElement>() {
|
||||
abstract class InapplicableTargetPropertyHasNoDelegate : KtFirDiagnostic<KtAnnotationEntry>() {
|
||||
override val diagnosticClass get() = InapplicableTargetPropertyHasNoDelegate::class
|
||||
}
|
||||
|
||||
abstract class InapplicableTargetPropertyHasNoBackingField : KtFirDiagnostic<PsiElement>() {
|
||||
abstract class InapplicableTargetPropertyHasNoBackingField : KtFirDiagnostic<KtAnnotationEntry>() {
|
||||
override val diagnosticClass get() = InapplicableTargetPropertyHasNoBackingField::class
|
||||
}
|
||||
|
||||
abstract class InapplicableParamTarget : KtFirDiagnostic<PsiElement>() {
|
||||
abstract class InapplicableParamTarget : KtFirDiagnostic<KtAnnotationEntry>() {
|
||||
override val diagnosticClass get() = InapplicableParamTarget::class
|
||||
}
|
||||
|
||||
abstract class RedundantAnnotationTarget : KtFirDiagnostic<PsiElement>() {
|
||||
abstract class RedundantAnnotationTarget : KtFirDiagnostic<KtAnnotationEntry>() {
|
||||
override val diagnosticClass get() = RedundantAnnotationTarget::class
|
||||
abstract val useSiteDescription: String
|
||||
}
|
||||
|
||||
abstract class InapplicableFileTarget : KtFirDiagnostic<PsiElement>() {
|
||||
abstract class InapplicableFileTarget : KtFirDiagnostic<KtAnnotationEntry>() {
|
||||
override val diagnosticClass get() = InapplicableFileTarget::class
|
||||
}
|
||||
|
||||
|
||||
+7
-7
@@ -733,7 +733,7 @@ internal class InapplicableTargetOnPropertyImpl(
|
||||
override val useSiteDescription: String,
|
||||
firDiagnostic: FirPsiDiagnostic<*>,
|
||||
override val token: ValidityToken,
|
||||
) : KtFirDiagnostic.InapplicableTargetOnProperty(), KtAbstractFirDiagnostic<PsiElement> {
|
||||
) : KtFirDiagnostic.InapplicableTargetOnProperty(), KtAbstractFirDiagnostic<KtAnnotationEntry> {
|
||||
override val firDiagnostic: FirPsiDiagnostic<*> by weakRef(firDiagnostic)
|
||||
}
|
||||
|
||||
@@ -741,28 +741,28 @@ internal class InapplicableTargetPropertyImmutableImpl(
|
||||
override val useSiteDescription: String,
|
||||
firDiagnostic: FirPsiDiagnostic<*>,
|
||||
override val token: ValidityToken,
|
||||
) : KtFirDiagnostic.InapplicableTargetPropertyImmutable(), KtAbstractFirDiagnostic<PsiElement> {
|
||||
) : KtFirDiagnostic.InapplicableTargetPropertyImmutable(), KtAbstractFirDiagnostic<KtAnnotationEntry> {
|
||||
override val firDiagnostic: FirPsiDiagnostic<*> by weakRef(firDiagnostic)
|
||||
}
|
||||
|
||||
internal class InapplicableTargetPropertyHasNoDelegateImpl(
|
||||
firDiagnostic: FirPsiDiagnostic<*>,
|
||||
override val token: ValidityToken,
|
||||
) : KtFirDiagnostic.InapplicableTargetPropertyHasNoDelegate(), KtAbstractFirDiagnostic<PsiElement> {
|
||||
) : KtFirDiagnostic.InapplicableTargetPropertyHasNoDelegate(), KtAbstractFirDiagnostic<KtAnnotationEntry> {
|
||||
override val firDiagnostic: FirPsiDiagnostic<*> by weakRef(firDiagnostic)
|
||||
}
|
||||
|
||||
internal class InapplicableTargetPropertyHasNoBackingFieldImpl(
|
||||
firDiagnostic: FirPsiDiagnostic<*>,
|
||||
override val token: ValidityToken,
|
||||
) : KtFirDiagnostic.InapplicableTargetPropertyHasNoBackingField(), KtAbstractFirDiagnostic<PsiElement> {
|
||||
) : KtFirDiagnostic.InapplicableTargetPropertyHasNoBackingField(), KtAbstractFirDiagnostic<KtAnnotationEntry> {
|
||||
override val firDiagnostic: FirPsiDiagnostic<*> by weakRef(firDiagnostic)
|
||||
}
|
||||
|
||||
internal class InapplicableParamTargetImpl(
|
||||
firDiagnostic: FirPsiDiagnostic<*>,
|
||||
override val token: ValidityToken,
|
||||
) : KtFirDiagnostic.InapplicableParamTarget(), KtAbstractFirDiagnostic<PsiElement> {
|
||||
) : KtFirDiagnostic.InapplicableParamTarget(), KtAbstractFirDiagnostic<KtAnnotationEntry> {
|
||||
override val firDiagnostic: FirPsiDiagnostic<*> by weakRef(firDiagnostic)
|
||||
}
|
||||
|
||||
@@ -770,14 +770,14 @@ internal class RedundantAnnotationTargetImpl(
|
||||
override val useSiteDescription: String,
|
||||
firDiagnostic: FirPsiDiagnostic<*>,
|
||||
override val token: ValidityToken,
|
||||
) : KtFirDiagnostic.RedundantAnnotationTarget(), KtAbstractFirDiagnostic<PsiElement> {
|
||||
) : KtFirDiagnostic.RedundantAnnotationTarget(), KtAbstractFirDiagnostic<KtAnnotationEntry> {
|
||||
override val firDiagnostic: FirPsiDiagnostic<*> by weakRef(firDiagnostic)
|
||||
}
|
||||
|
||||
internal class InapplicableFileTargetImpl(
|
||||
firDiagnostic: FirPsiDiagnostic<*>,
|
||||
override val token: ValidityToken,
|
||||
) : KtFirDiagnostic.InapplicableFileTarget(), KtAbstractFirDiagnostic<PsiElement> {
|
||||
) : KtFirDiagnostic.InapplicableFileTarget(), KtAbstractFirDiagnostic<KtAnnotationEntry> {
|
||||
override val firDiagnostic: FirPsiDiagnostic<*> by weakRef(firDiagnostic)
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user