Android Extensions: handle layout file rename
This commit is contained in:
+23
-5
@@ -20,22 +20,40 @@ import com.intellij.psi.PsiElement
|
||||
import com.intellij.psi.xml.XmlAttributeValue
|
||||
import org.jetbrains.android.dom.wrappers.ValueResourceElementWrapper
|
||||
import org.jetbrains.android.util.AndroidResourceUtil
|
||||
import org.jetbrains.kotlin.android.synthetic.AndroidConst
|
||||
import org.jetbrains.kotlin.android.synthetic.androidIdToName
|
||||
import org.jetbrains.kotlin.idea.references.KtSimpleNameReference
|
||||
import org.jetbrains.kotlin.plugin.references.SimpleNameReferenceExtension
|
||||
import org.jetbrains.kotlin.psi.KtDotQualifiedExpression
|
||||
import org.jetbrains.kotlin.psi.KtPsiFactory
|
||||
|
||||
class AndroidSimpleNameReferenceExtension : SimpleNameReferenceExtension {
|
||||
|
||||
override fun isReferenceTo(reference: KtSimpleNameReference, element: PsiElement): Boolean {
|
||||
return element is ValueResourceElementWrapper && AndroidResourceUtil.isIdDeclaration(element)
|
||||
override fun isReferenceTo(reference: KtSimpleNameReference, element: PsiElement) = when {
|
||||
element is ValueResourceElementWrapper && AndroidResourceUtil.isIdDeclaration(element) -> true
|
||||
isLayoutPackageIdentifier(reference) -> true
|
||||
else -> false
|
||||
}
|
||||
|
||||
private fun isLayoutPackageIdentifier(reference: KtSimpleNameReference): Boolean {
|
||||
val probablyVariant = reference.element?.parent as? KtDotQualifiedExpression ?: return false
|
||||
val probablyKAS = probablyVariant.receiverExpression as? KtDotQualifiedExpression ?: return false
|
||||
return probablyKAS.receiverExpression.text == AndroidConst.SYNTHETIC_PACKAGE
|
||||
}
|
||||
|
||||
override fun handleElementRename(reference: KtSimpleNameReference, psiFactory: KtPsiFactory, newElementName: String): PsiElement? {
|
||||
val resolvedElement = reference.resolve()
|
||||
if (resolvedElement !is XmlAttributeValue || !AndroidResourceUtil.isIdDeclaration(resolvedElement)) return null
|
||||
val newSyntheticPropertyName = androidIdToName(newElementName) ?: return null
|
||||
if (resolvedElement is XmlAttributeValue && AndroidResourceUtil.isIdDeclaration(resolvedElement)) {
|
||||
val newSyntheticPropertyName = androidIdToName(newElementName) ?: return null
|
||||
return psiFactory.createNameIdentifier(newSyntheticPropertyName.name)
|
||||
}
|
||||
else if (isLayoutPackageIdentifier(reference)) {
|
||||
return if (newElementName.endsWith(".xml"))
|
||||
psiFactory.createSimpleName(newElementName.dropLast(".xml".length))
|
||||
else
|
||||
reference.element
|
||||
}
|
||||
|
||||
return psiFactory.createNameIdentifier(newSyntheticPropertyName.name)
|
||||
return null
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user