diff --git a/idea/src/org/jetbrains/kotlin/idea/inspections/MemberVisibilityCanBePrivateInspection.kt b/idea/src/org/jetbrains/kotlin/idea/inspections/MemberVisibilityCanBePrivateInspection.kt index 4368b7a3aa3..81d32f122be 100644 --- a/idea/src/org/jetbrains/kotlin/idea/inspections/MemberVisibilityCanBePrivateInspection.kt +++ b/idea/src/org/jetbrains/kotlin/idea/inspections/MemberVisibilityCanBePrivateInspection.kt @@ -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 diff --git a/idea/src/org/jetbrains/kotlin/idea/inspections/UnusedSymbolInspection.kt b/idea/src/org/jetbrains/kotlin/idea/inspections/UnusedSymbolInspection.kt index a0268abbfb5..742f4d2be86 100644 --- a/idea/src/org/jetbrains/kotlin/idea/inspections/UnusedSymbolInspection.kt +++ b/idea/src/org/jetbrains/kotlin/idea/inspections/UnusedSymbolInspection.kt @@ -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): Boolean { - val annotationsPresent = annotated.annotations.mapNotNull { it.fqName?.asString() } + fun checkAnnotatedUsingPatterns( + declaration: KtNamedDeclaration, + annotationPatterns: Collection + ): 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) { diff --git a/idea/testData/inspections/unusedSymbol/property/unusedButEntryPointAnnotated.kt b/idea/testData/inspections/unusedSymbol/property/unusedButEntryPointAnnotated.kt index 9d67609720a..be9f4e7304b 100644 --- a/idea/testData/inspections/unusedSymbol/property/unusedButEntryPointAnnotated.kt +++ b/idea/testData/inspections/unusedSymbol/property/unusedButEntryPointAnnotated.kt @@ -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 } \ No newline at end of file