fix R class field resolving

- resolve by class name and package defined in AndroidManifest.xml
This commit is contained in:
Mikhail Mutcianko
2014-09-01 12:19:12 +04:00
committed by Yan Zhulanow
parent adbe9afd4a
commit f507857930
3 changed files with 22 additions and 3 deletions
@@ -22,6 +22,8 @@ import com.intellij.openapi.project.Project
import org.jetbrains.jet.lang.psi.JetFile
import com.intellij.openapi.components.ServiceManager
import java.util.ArrayList
import com.intellij.psi.PsiField
import com.intellij.psi.PsiClass
trait AndroidResource
@@ -49,6 +51,7 @@ fun isAndroidSyntheticFile(f: PsiFile?): Boolean {
public fun isAndroidSyntheticElement(element: PsiElement?): Boolean {
return isAndroidSyntheticFile(element?.getContainingFile())
}
public fun searchAndAddAndroidDeclarations(project: Project, originalFiles: Collection<JetFile>): Collection<JetFile> {
val parser = ServiceManager.getService<AndroidUIXmlProcessor>(project, javaClass<AndroidUIXmlProcessor>())
val file = parser?.parseToPsi(project)
@@ -56,3 +59,15 @@ public fun searchAndAddAndroidDeclarations(project: Project, originalFiles: Coll
if (file != null) files.add(file)
return files
}
public fun isRClassField(element: PsiElement): Boolean {
return if (element is PsiField) {
val outerClass = element.getParent()?.getParent()
if (outerClass !is PsiClass) return false
val processor = ServiceManager.getService<AndroidUIXmlProcessor>(element.getProject(), javaClass<AndroidUIXmlProcessor>())
val packageName = processor?.resourceManager?.readManifest()?._package
if ((outerClass as PsiClass).getQualifiedName()?.startsWith(packageName ?: "") ?: false)
true else false
}
else false
}
@@ -28,16 +28,19 @@ import org.jetbrains.jet.lang.psi.JetSimpleNameExpression
import org.jetbrains.jet.lang.psi.JetProperty
import com.intellij.psi.impl.light.LightElement
import com.intellij.psi.xml.XmlAttribute
import org.jetbrains.jet.lang.resolve.android.isRClassField
import com.intellij.psi.PsiField
public class AndroidGotoDeclarationHandler : GotoDeclarationHandler {
override fun getGotoDeclarationTargets(sourceElement: PsiElement?, offset: Int, editor: Editor?): Array<PsiElement>? {
if (sourceElement is LeafPsiElement && sourceElement.getParent() is JetSimpleNameExpression) {
val resolved = JetSimpleNameReference(sourceElement.getParent() as JetSimpleNameExpression).resolve()
if (resolved == null) return null
val name = if (resolved is JetProperty) {
resolved.getName()
}
else if (resolved is LightElement && resolved.getParent().toString() == "AndroidRClass") {
resolved.getName()
else if (isRClassField(resolved)) {
(resolved as PsiField).getName()
}
else null
if (name != null) {
@@ -29,13 +29,14 @@ import org.jetbrains.android.dom.wrappers.LazyValueResourceElementWrapper
import org.jetbrains.android.util.AndroidResourceUtil
import com.intellij.psi.xml.XmlAttribute
import com.intellij.psi.impl.light.LightElement
import org.jetbrains.jet.lang.resolve.android.isRClassField
public class AndroidRenameProcessor : RenamePsiElementProcessor() {
override fun canProcessElement(element: PsiElement): Boolean {
// either renaming synthetic property, or value in ui xml, or R light class field
return (element.namedUnwrappedElement is JetProperty &&
isAndroidSyntheticElement(element.namedUnwrappedElement)) || element is XmlAttributeValue ||
element is LightElement
isRClassField(element)
}
override fun prepareRenaming(element: PsiElement?, newName: String?, allRenames: MutableMap<PsiElement, String>, scope: SearchScope) {