diff --git a/ChangeLog.md b/ChangeLog.md index 8f4886e70f0..a90c50175ac 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -223,6 +223,7 @@ Issues fixed: - [KT-11264](https://youtrack.jetbrains.com/issue/KT-11264) Action to create new activity in Kotlin - [KT-11201](https://youtrack.jetbrains.com/issue/KT-11201) Do not ignore items with similar names in kapt - [KT-7729](https://youtrack.jetbrains.com/issue/KT-7729) Add Android Lint checks for Kotlin (Android Studio 1.5) +- Rename Android Extensions imports when the layout file is renamed ### Maven diff --git a/generators/src/org/jetbrains/kotlin/generators/tests/GenerateTests.kt b/generators/src/org/jetbrains/kotlin/generators/tests/GenerateTests.kt index b7ddad9d633..4416e0aa845 100644 --- a/generators/src/org/jetbrains/kotlin/generators/tests/GenerateTests.kt +++ b/generators/src/org/jetbrains/kotlin/generators/tests/GenerateTests.kt @@ -998,6 +998,10 @@ fun main(args: Array) { model("android/rename", recursive = false, extension = null) } + testClass() { + model("android/renameLayout", recursive = false, extension = null) + } + testClass() { model("android/findUsages", recursive = false, extension = null) } @@ -1157,7 +1161,7 @@ class TestGroup(val testsRoot: String, val testDataRoot: String) { } else { SimpleTestClassModel(rootFile, recursive, excludeParentDirs, - compiledPattern, filenameStartsLowerCase, testMethod, className, + compiledPattern, filenameStartsLowerCase, testMethod, className, targetBackend, excludeDirs) } ) diff --git a/plugins/android-extensions/android-extensions-idea/src/org/jetbrains/kotlin/android/synthetic/idea/AndroidSimpleNameReferenceExtension.kt b/plugins/android-extensions/android-extensions-idea/src/org/jetbrains/kotlin/android/synthetic/idea/AndroidSimpleNameReferenceExtension.kt index 7ea5ef58763..c2a4d4d04f4 100644 --- a/plugins/android-extensions/android-extensions-idea/src/org/jetbrains/kotlin/android/synthetic/idea/AndroidSimpleNameReferenceExtension.kt +++ b/plugins/android-extensions/android-extensions-idea/src/org/jetbrains/kotlin/android/synthetic/idea/AndroidSimpleNameReferenceExtension.kt @@ -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 } } \ No newline at end of file diff --git a/plugins/android-extensions/android-extensions-idea/testData/android/renameLayout/simple/res/layout/layout.xml b/plugins/android-extensions/android-extensions-idea/testData/android/renameLayout/simple/res/layout/layout.xml new file mode 100644 index 00000000000..1f019bffe41 --- /dev/null +++ b/plugins/android-extensions/android-extensions-idea/testData/android/renameLayout/simple/res/layout/layout.xml @@ -0,0 +1,10 @@ + + +