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:
Mikhail Glukhikh
2018-04-27 18:51:46 +03:00
parent 59c019cb00
commit e933bb8220
3 changed files with 18 additions and 7 deletions
@@ -91,7 +91,7 @@ class MemberVisibilityCanBePrivateInspection : AbstractKotlinInspection() {
if (descriptor.hasJvmFieldAnnotation()) return false
val entryPointsManager = EntryPointsManager.getInstance(declaration.project) as EntryPointsManagerBase
if (UnusedSymbolInspection.checkAnnotatedUsingPatterns(descriptor,
if (UnusedSymbolInspection.checkAnnotatedUsingPatterns(declaration,
with (entryPointsManager) {
additionalAnnotations + ADDITIONAL_ANNOTATIONS
})) return false
@@ -37,9 +37,9 @@ import org.jetbrains.kotlin.asJava.classes.KtLightClass
import org.jetbrains.kotlin.asJava.toLightClass
import org.jetbrains.kotlin.asJava.toLightMethods
import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.descriptors.annotations.Annotated
import org.jetbrains.kotlin.fileClasses.JvmFileClassUtil
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.resolveToDescriptorIfAny
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.search.isCheapEnoughToSearchConsideringOperators
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.getClassNameForCompanionObject
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.psi.*
import org.jetbrains.kotlin.psi.psiUtil.*
import org.jetbrains.kotlin.resolve.BindingContext
import org.jetbrains.kotlin.resolve.DescriptorUtils
import org.jetbrains.kotlin.util.findCallableMemberBySignature
import java.awt.GridBagConstraints
@@ -81,10 +81,9 @@ class UnusedSymbolInspection : AbstractKotlinInspection() {
is KtProperty, is KtParameter -> {
if (declaration is KtParameter && !declaration.hasValOrVar()) return false
// can't rely on light element, check annotation ourselves
val descriptor = declaration.descriptor ?: return false
val entryPointsManager = EntryPointsManager.getInstance(declaration.project) as EntryPointsManagerBase
return checkAnnotatedUsingPatterns(
descriptor,
declaration,
entryPointsManager.additionalAnnotations + entryPointsManager.ADDITIONAL_ANNOTATIONS
)
}
@@ -106,8 +105,14 @@ class UnusedSymbolInspection : AbstractKotlinInspection() {
toLightMethods().any { JavaHighlightUtil.isSerializationRelatedMethod(it, it.containingClass) }
// variation of IDEA's AnnotationUtil.checkAnnotatedUsingPatterns()
fun checkAnnotatedUsingPatterns(annotated: Annotated, annotationPatterns: Collection<String>): Boolean {
val annotationsPresent = annotated.annotations.mapNotNull { it.fqName?.asString() }
fun checkAnnotatedUsingPatterns(
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
for (pattern in annotationPatterns) {
@@ -3,4 +3,10 @@ val entryPoint = ""
class Owner(@test.anno.EntryPoint val xx: Int) {
@test.anno.EntryPoint val yy = 42
}
@test.anno.EntryPoint
class WithGetter {
@get:test.anno.EntryPoint
val zz = 13
}