Android Extensions: handle layout file rename

This commit is contained in:
Yan Zhulanow
2016-03-25 16:38:43 +03:00
parent 47b3394f62
commit 6e14c11280
7 changed files with 145 additions and 6 deletions
@@ -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
}
}