diff --git a/idea/src/org/jetbrains/kotlin/idea/findUsages/handlers/DelegatingFindMemberUsagesHandler.kt b/idea/src/org/jetbrains/kotlin/idea/findUsages/handlers/DelegatingFindMemberUsagesHandler.kt index 5c63c7b65d7..20687f02311 100644 --- a/idea/src/org/jetbrains/kotlin/idea/findUsages/handlers/DelegatingFindMemberUsagesHandler.kt +++ b/idea/src/org/jetbrains/kotlin/idea/findUsages/handlers/DelegatingFindMemberUsagesHandler.kt @@ -29,6 +29,13 @@ import com.intellij.find.findUsages.JavaFindUsagesHandler import org.jetbrains.kotlin.idea.findUsages.KotlinFunctionFindUsagesOptions import org.jetbrains.kotlin.idea.findUsages.toJavaMethodOptions import com.intellij.openapi.actionSystem.DataContext +import com.intellij.openapi.components.ServiceManager +import org.jetbrains.jet.lang.resolve.android.AndroidUIXmlProcessor +import com.intellij.psi.xml.XmlAttribute +import org.jetbrains.jet.lang.resolve.android.isAndroidSyntheticElement +import org.jetbrains.kotlin.psi.JetProperty +import com.intellij.find.findUsages.JavaVariableFindUsagesOptions +import java.util.ArrayList class DelegatingFindMemberUsagesHandler( val declaration: JetNamedDeclaration, @@ -52,16 +59,51 @@ class DelegatingFindMemberUsagesHandler( else -> null } - override fun getPrimaryElements(): Array = - kotlinHandler.getPrimaryElements() + override fun getPrimaryElements(): Array { + val primaryElements = kotlinHandler.getPrimaryElements() + if (isAndroidSyntheticElement(declaration)) { + val name = (declaration as JetProperty).getName()!! + val parser = ServiceManager.getService(declaration.getProject(), javaClass()) + val psiElement = parser?.resourceManager?.idToXmlAttribute(name) as? XmlAttribute + if (psiElement != null && psiElement.getValueElement() != null) { + return array(psiElement.getValueElement()!!) + } + } + return primaryElements + } override fun getFindUsagesOptions(dataContext: DataContext?): FindUsagesOptions { return kotlinHandler.getFindUsagesOptions(dataContext) } + override fun getSecondaryElements(): Array { + if (isAndroidSyntheticElement(declaration)) { + val name = (declaration as JetProperty).getName()!! + val parser = ServiceManager.getService(declaration.getProject(), javaClass()) + val psiElement = parser?.resourceManager?.idToXmlAttribute(name) as? XmlAttribute + if (psiElement != null) { + val res = ArrayList() + val fields = AndroidResourceUtil.findIdFields(psiElement) + for (field in fields) { + res.add(field) + } + return res.copyToArray() + } + } + return array() + } + override fun processElementUsages(element: PsiElement, processor: Processor, options: FindUsagesOptions): Boolean { val handler = getHandler(element) - if (handler == null) return true + if (handler == null || isAndroidSyntheticElement(element)) { + val findUsagesOptions = JavaVariableFindUsagesOptions(element.getProject()) + findUsagesOptions.isSearchForTextOccurrences = false + findUsagesOptions.isSkipImportStatements = true + findUsagesOptions.isUsages = true + findUsagesOptions.isReadAccess = true + findUsagesOptions.isWriteAccess = true + return super.processElementUsages(element, processor, findUsagesOptions) + } val handlerOptions = when (handler) { /* Can't have KotlinPropertyFindUsagesOptions here since Kotlin properties do not override java methods, so