FIR: position INAPPLICABLE_FILE_TARGET on file use-site (when possible)

This commit is contained in:
Mikhail Glukhikh
2021-05-19 10:52:03 +03:00
parent 6572010eed
commit 6dd41b617a
14 changed files with 64 additions and 44 deletions
@@ -70,6 +70,7 @@ enum class PositioningStrategy(private val strategy: String? = null) {
FUN_INTERFACE,
RESERVED_UNDERSCORE,
QUESTION_MARK_BY_TYPE,
ANNOTATION_USE_SITE,
;
@@ -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") {
@@ -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)
@@ -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 =
@@ -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
)
}