Search for all properties in layout files corresponding to the given JetProperty

This commit is contained in:
Yan Zhulanow
2015-03-24 20:25:20 +03:00
parent 96074bc948
commit 938248bd29
5 changed files with 40 additions and 32 deletions
@@ -58,10 +58,9 @@ class AndroidFindMemberUsagesHandler(
val moduleInfo = declaration.getModuleInfo() as? ModuleSourceInfo ?: return super.getPrimaryElements()
val parser = ModuleServiceManager.getService(moduleInfo.module, javaClass<AndroidUIXmlProcessor>())
val psiElement = parser?.resourceManager?.propertyToXmlAttribute(property) as? XmlAttribute
if (psiElement != null && psiElement.getValueElement() != null) {
return array(psiElement.getValueElement()!!)
}
val psiElements = parser?.resourceManager?.propertyToXmlAttributes(property)
val valueElements = psiElements?.map { (it as? XmlAttribute)?.getValueElement() as? PsiElement }?.filterNotNull()
if (valueElements != null && valueElements.isNotEmpty()) return valueElements.copyToArray()
return super.getPrimaryElements()
}
@@ -77,17 +76,21 @@ class AndroidFindMemberUsagesHandler(
val moduleInfo = declaration.getModuleInfo() as? ModuleSourceInfo ?: return super.getPrimaryElements()
val parser = ModuleServiceManager.getService(moduleInfo.module, javaClass<AndroidUIXmlProcessor>())
val psiElement = parser?.resourceManager?.propertyToXmlAttribute(property) as? XmlAttribute
if (psiElement != null) {
val res = ArrayList<PsiElement>()
val fields = AndroidResourceUtil.findIdFields(psiElement)
for (field in fields) {
res.add(field)
val psiElements = parser?.resourceManager?.propertyToXmlAttributes(property) ?: listOf()
val res = ArrayList<PsiElement>()
for (psiElement in psiElements) {
if (psiElement is XmlAttribute) {
val fields = AndroidResourceUtil.findIdFields(psiElement)
for (field in fields) {
res.add(field)
}
res.add(declaration)
}
res.add(declaration)
return res.copyToArray()
}
if (res.isNotEmpty()) return res.copyToArray()
return super.getSecondaryElements()
}
@@ -41,11 +41,9 @@ public class AndroidGotoDeclarationHandler : GotoDeclarationHandler {
if (moduleInfo !is ModuleSourceInfo) return null
val parser = ModuleServiceManager.getService(moduleInfo.module, javaClass<AndroidUIXmlProcessor>())
val psiElement = parser.resourceManager.propertyToXmlAttribute(property) as? XmlAttribute
val attributeValue = psiElement?.getValueElement()
if (attributeValue != null) {
return array(attributeValue)
}
val psiElements = parser.resourceManager.propertyToXmlAttributes(property)
val valueElements = psiElements.map { (it as? XmlAttribute)?.getValueElement() as? PsiElement }.filterNotNull()
if (valueElements.isNotEmpty()) return valueElements.copyToArray()
}
return null
}
@@ -96,12 +96,19 @@ public class AndroidRenameProcessor : RenamePsiElementProcessor() {
val processor = ModuleServiceManager.getService(module, javaClass<AndroidUIXmlProcessor>())
val resourceManager = processor.resourceManager
val attr = resourceManager.propertyToXmlAttribute(jetProperty) as XmlAttribute
val attributeValue = attr.getValueElement() ?: return
allRenames[XmlAttributeValueWrapper(attributeValue)] = nameToIdDeclaration(newName)
val name = AndroidResourceUtil.getResourceNameByReferenceText(newName) ?: return
for (resField in AndroidResourceUtil.findIdFields(attr)) {
allRenames.put(resField, AndroidResourceUtil.getFieldNameByResourceName(name))
val psiElements = resourceManager.propertyToXmlAttributes(jetProperty).map { it as? XmlAttribute }.filterNotNull()
for (psiElement in psiElements) {
val valueElement = psiElement.getValueElement()
if (valueElement != null) {
allRenames[XmlAttributeValueWrapper(valueElement)] = nameToIdDeclaration(newName)
val name = AndroidResourceUtil.getResourceNameByReferenceText(newName) ?: return
for (resField in AndroidResourceUtil.findIdFields(psiElement)) {
allRenames.put(resField, AndroidResourceUtil.getFieldNameByResourceName(name))
}
}
}
}
@@ -30,23 +30,23 @@ public class IDEAndroidResourceManager(val module: Module) : AndroidResourceMana
override val androidModuleInfo: AndroidModuleInfo? by Delegates.lazy { module.androidFacet?.toAndroidModuleInfo() }
override fun propertyToXmlAttribute(property: JetProperty): PsiElement? {
val fqPath = property.getFqName()?.pathSegments() ?: return null
if (fqPath.size() <= AndroidConst.SYNTHETIC_PACKAGE_PATH_LENGTH) return null
override fun propertyToXmlAttributes(property: JetProperty): List<PsiElement> {
val fqPath = property.getFqName()?.pathSegments() ?: return listOf()
if (fqPath.size() <= AndroidConst.SYNTHETIC_PACKAGE_PATH_LENGTH) return listOf()
val layoutPackageName = fqPath[AndroidConst.SYNTHETIC_PACKAGE_PATH_LENGTH].asString()
val layoutFiles = getLayoutXmlFiles()[layoutPackageName]
if (layoutFiles == null || layoutFiles.isEmpty()) return null
if (layoutFiles == null || layoutFiles.isEmpty()) return listOf()
val propertyName = property.getName()
var ret: PsiElement? = null
val attributes = arrayListOf<PsiElement>()
val visitor = AndroidXmlVisitor { retId, wClass, valueElement ->
if (retId == propertyName) ret = valueElement
if (retId == propertyName) attributes.add(valueElement)
}
layoutFiles.first().accept(visitor)
return ret
layoutFiles.forEach { it.accept(visitor) }
return attributes
}
private val Module.androidFacet: AndroidFacet?