android goto declaration handler reference fix

- goto handler now utilizes full featured reference resolving instead of simple name based resolving
This commit is contained in:
Mikhail Mutcianko
2014-08-08 14:30:52 +04:00
committed by Yan Zhulanow
parent 37c851cafc
commit 9c9bad2f78
@@ -25,20 +25,34 @@ import org.jetbrains.jet.lang.resolve.android.AndroidUIXmlProcessor
import com.intellij.psi.impl.source.tree.LeafPsiElement
import com.intellij.psi.util.PsiTreeUtil
import com.intellij.psi.PsiReferenceExpression
import org.jetbrains.jet.plugin.references.JetSimpleNameReference
import org.jetbrains.jet.lang.psi.JetSimpleNameExpression
import org.jetbrains.jet.lang.psi.JetProperty
import com.intellij.psi.impl.light.LightElement
import org.jetbrains.android.augment.AndroidInternalRClass
import com.intellij.psi.xml.XmlAttributeValue
import com.intellij.psi.xml.XmlAttribute
public class AndroidGotoDeclarationHandler : GotoDeclarationHandler {
override fun getGotoDeclarationTargets(sourceElement: PsiElement?, offset: Int, editor: Editor?): Array<PsiElement>? {
// FIXME: find a way to filter out more bad sourceElements before they hit idToXmlAttribute() resulting in cache rebuild
if (sourceElement is LeafPsiElement) {
val refExp = PsiTreeUtil.getParentOfType(sourceElement, javaClass<PsiReferenceExpression>())
val parser = ServiceManager.getService(sourceElement.getProject(), javaClass<AndroidUIXmlProcessor>())
val psiElement = parser?.resourceManager?.idToXmlAttribute(sourceElement.getText())
if (psiElement != null) {
return array(psiElement)
if (sourceElement is LeafPsiElement && sourceElement.getParent() is JetSimpleNameExpression) {
val resolved = JetSimpleNameReference(sourceElement.getParent() as JetSimpleNameExpression).resolve()
val name = if (resolved is JetProperty) {
resolved.getName()
}
else if (resolved is LightElement && resolved.getParent().toString() == "AndroidRClass") {
resolved.getName()
}
else null
if (name != null) {
val parser = ServiceManager.getService(sourceElement.getProject(), javaClass<AndroidUIXmlProcessor>())
val psiElement = parser?.resourceManager?.idToXmlAttribute(name) as? XmlAttribute
if (psiElement != null) {
return array(psiElement.getValueElement()!!)
}
}
else return null
}
else return null
return null
}
override fun getActionText(context: DataContext?): String? {