fix R class field resolving
- resolve by class name and package defined in AndroidManifest.xml
This commit is contained in:
committed by
Yan Zhulanow
parent
adbe9afd4a
commit
f507857930
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user