Unused symbol suppression: get annotation descriptors via entries
Otherwise we miss use-site targeted annotations, and getUseSiteTargetedAnnotations does not help So #KT-20332 Fixed
This commit is contained in:
+1
-1
@@ -91,7 +91,7 @@ class MemberVisibilityCanBePrivateInspection : AbstractKotlinInspection() {
|
|||||||
|
|
||||||
if (descriptor.hasJvmFieldAnnotation()) return false
|
if (descriptor.hasJvmFieldAnnotation()) return false
|
||||||
val entryPointsManager = EntryPointsManager.getInstance(declaration.project) as EntryPointsManagerBase
|
val entryPointsManager = EntryPointsManager.getInstance(declaration.project) as EntryPointsManagerBase
|
||||||
if (UnusedSymbolInspection.checkAnnotatedUsingPatterns(descriptor,
|
if (UnusedSymbolInspection.checkAnnotatedUsingPatterns(declaration,
|
||||||
with (entryPointsManager) {
|
with (entryPointsManager) {
|
||||||
additionalAnnotations + ADDITIONAL_ANNOTATIONS
|
additionalAnnotations + ADDITIONAL_ANNOTATIONS
|
||||||
})) return false
|
})) return false
|
||||||
|
|||||||
@@ -37,9 +37,9 @@ import org.jetbrains.kotlin.asJava.classes.KtLightClass
|
|||||||
import org.jetbrains.kotlin.asJava.toLightClass
|
import org.jetbrains.kotlin.asJava.toLightClass
|
||||||
import org.jetbrains.kotlin.asJava.toLightMethods
|
import org.jetbrains.kotlin.asJava.toLightMethods
|
||||||
import org.jetbrains.kotlin.descriptors.*
|
import org.jetbrains.kotlin.descriptors.*
|
||||||
import org.jetbrains.kotlin.descriptors.annotations.Annotated
|
|
||||||
import org.jetbrains.kotlin.fileClasses.JvmFileClassUtil
|
import org.jetbrains.kotlin.fileClasses.JvmFileClassUtil
|
||||||
import org.jetbrains.kotlin.idea.caches.project.implementingDescriptors
|
import org.jetbrains.kotlin.idea.caches.project.implementingDescriptors
|
||||||
|
import org.jetbrains.kotlin.idea.caches.resolve.analyze
|
||||||
import org.jetbrains.kotlin.idea.caches.resolve.findModuleDescriptor
|
import org.jetbrains.kotlin.idea.caches.resolve.findModuleDescriptor
|
||||||
import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptorIfAny
|
import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptorIfAny
|
||||||
import org.jetbrains.kotlin.idea.core.isInheritable
|
import org.jetbrains.kotlin.idea.core.isInheritable
|
||||||
@@ -52,7 +52,6 @@ import org.jetbrains.kotlin.idea.references.mainReference
|
|||||||
import org.jetbrains.kotlin.idea.references.resolveMainReferenceToDescriptors
|
import org.jetbrains.kotlin.idea.references.resolveMainReferenceToDescriptors
|
||||||
import org.jetbrains.kotlin.idea.search.isCheapEnoughToSearchConsideringOperators
|
import org.jetbrains.kotlin.idea.search.isCheapEnoughToSearchConsideringOperators
|
||||||
import org.jetbrains.kotlin.idea.search.usagesSearch.dataClassComponentFunction
|
import org.jetbrains.kotlin.idea.search.usagesSearch.dataClassComponentFunction
|
||||||
import org.jetbrains.kotlin.idea.search.usagesSearch.descriptor
|
|
||||||
import org.jetbrains.kotlin.idea.search.usagesSearch.getAccessorNames
|
import org.jetbrains.kotlin.idea.search.usagesSearch.getAccessorNames
|
||||||
import org.jetbrains.kotlin.idea.search.usagesSearch.getClassNameForCompanionObject
|
import org.jetbrains.kotlin.idea.search.usagesSearch.getClassNameForCompanionObject
|
||||||
import org.jetbrains.kotlin.idea.stubindex.KotlinSourceFilterScope
|
import org.jetbrains.kotlin.idea.stubindex.KotlinSourceFilterScope
|
||||||
@@ -61,6 +60,7 @@ import org.jetbrains.kotlin.idea.util.hasActualsFor
|
|||||||
import org.jetbrains.kotlin.lexer.KtTokens
|
import org.jetbrains.kotlin.lexer.KtTokens
|
||||||
import org.jetbrains.kotlin.psi.*
|
import org.jetbrains.kotlin.psi.*
|
||||||
import org.jetbrains.kotlin.psi.psiUtil.*
|
import org.jetbrains.kotlin.psi.psiUtil.*
|
||||||
|
import org.jetbrains.kotlin.resolve.BindingContext
|
||||||
import org.jetbrains.kotlin.resolve.DescriptorUtils
|
import org.jetbrains.kotlin.resolve.DescriptorUtils
|
||||||
import org.jetbrains.kotlin.util.findCallableMemberBySignature
|
import org.jetbrains.kotlin.util.findCallableMemberBySignature
|
||||||
import java.awt.GridBagConstraints
|
import java.awt.GridBagConstraints
|
||||||
@@ -81,10 +81,9 @@ class UnusedSymbolInspection : AbstractKotlinInspection() {
|
|||||||
is KtProperty, is KtParameter -> {
|
is KtProperty, is KtParameter -> {
|
||||||
if (declaration is KtParameter && !declaration.hasValOrVar()) return false
|
if (declaration is KtParameter && !declaration.hasValOrVar()) return false
|
||||||
// can't rely on light element, check annotation ourselves
|
// can't rely on light element, check annotation ourselves
|
||||||
val descriptor = declaration.descriptor ?: return false
|
|
||||||
val entryPointsManager = EntryPointsManager.getInstance(declaration.project) as EntryPointsManagerBase
|
val entryPointsManager = EntryPointsManager.getInstance(declaration.project) as EntryPointsManagerBase
|
||||||
return checkAnnotatedUsingPatterns(
|
return checkAnnotatedUsingPatterns(
|
||||||
descriptor,
|
declaration,
|
||||||
entryPointsManager.additionalAnnotations + entryPointsManager.ADDITIONAL_ANNOTATIONS
|
entryPointsManager.additionalAnnotations + entryPointsManager.ADDITIONAL_ANNOTATIONS
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@@ -106,8 +105,14 @@ class UnusedSymbolInspection : AbstractKotlinInspection() {
|
|||||||
toLightMethods().any { JavaHighlightUtil.isSerializationRelatedMethod(it, it.containingClass) }
|
toLightMethods().any { JavaHighlightUtil.isSerializationRelatedMethod(it, it.containingClass) }
|
||||||
|
|
||||||
// variation of IDEA's AnnotationUtil.checkAnnotatedUsingPatterns()
|
// variation of IDEA's AnnotationUtil.checkAnnotatedUsingPatterns()
|
||||||
fun checkAnnotatedUsingPatterns(annotated: Annotated, annotationPatterns: Collection<String>): Boolean {
|
fun checkAnnotatedUsingPatterns(
|
||||||
val annotationsPresent = annotated.annotations.mapNotNull { it.fqName?.asString() }
|
declaration: KtNamedDeclaration,
|
||||||
|
annotationPatterns: Collection<String>
|
||||||
|
): Boolean {
|
||||||
|
val context = declaration.analyze()
|
||||||
|
val annotationsPresent = declaration.annotationEntries.mapNotNull {
|
||||||
|
context[BindingContext.ANNOTATION, it]?.fqName?.asString()
|
||||||
|
}
|
||||||
if (annotationsPresent.isEmpty()) return false
|
if (annotationsPresent.isEmpty()) return false
|
||||||
|
|
||||||
for (pattern in annotationPatterns) {
|
for (pattern in annotationPatterns) {
|
||||||
|
|||||||
+6
@@ -3,4 +3,10 @@ val entryPoint = ""
|
|||||||
|
|
||||||
class Owner(@test.anno.EntryPoint val xx: Int) {
|
class Owner(@test.anno.EntryPoint val xx: Int) {
|
||||||
@test.anno.EntryPoint val yy = 42
|
@test.anno.EntryPoint val yy = 42
|
||||||
|
}
|
||||||
|
|
||||||
|
@test.anno.EntryPoint
|
||||||
|
class WithGetter {
|
||||||
|
@get:test.anno.EntryPoint
|
||||||
|
val zz = 13
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user