From a0629bfc582ac89de255c3538297348c5ac90291 Mon Sep 17 00:00:00 2001 From: Alexey Sedunov Date: Fri, 2 Jun 2017 16:15:46 +0300 Subject: [PATCH] Rename: Fix rename of import alias referring to object member #KT-18096 Fixed --- .../kotlin/idea/references/KtSimpleNameReference.kt | 7 +++++-- .../objectFunctionImportAliasByRef/after/test.kt | 9 +++++++++ .../objectFunctionImportAliasByRef/before/test.kt | 9 +++++++++ .../objectFunctionImportAliasByRef.test | 5 +++++ .../objectPropertyImportAliasByRef/after/test.kt | 9 +++++++++ .../objectPropertyImportAliasByRef/before/test.kt | 9 +++++++++ .../objectPropertyImportAliasByRef.test | 5 +++++ .../idea/refactoring/rename/RenameTestGenerated.java | 12 ++++++++++++ 8 files changed, 63 insertions(+), 2 deletions(-) create mode 100644 idea/testData/refactoring/rename/objectFunctionImportAliasByRef/after/test.kt create mode 100644 idea/testData/refactoring/rename/objectFunctionImportAliasByRef/before/test.kt create mode 100644 idea/testData/refactoring/rename/objectFunctionImportAliasByRef/objectFunctionImportAliasByRef.test create mode 100644 idea/testData/refactoring/rename/objectPropertyImportAliasByRef/after/test.kt create mode 100644 idea/testData/refactoring/rename/objectPropertyImportAliasByRef/before/test.kt create mode 100644 idea/testData/refactoring/rename/objectPropertyImportAliasByRef/objectPropertyImportAliasByRef.test diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/references/KtSimpleNameReference.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/references/KtSimpleNameReference.kt index 7356f90d235..9098382f2ee 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/references/KtSimpleNameReference.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/references/KtSimpleNameReference.kt @@ -45,6 +45,7 @@ import org.jetbrains.kotlin.psi.psiUtil.getQualifiedElementSelector import org.jetbrains.kotlin.psi.psiUtil.startOffset import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.DataClassDescriptorResolver +import org.jetbrains.kotlin.resolve.ImportedFromObjectCallableDescriptor import org.jetbrains.kotlin.resolve.descriptorUtil.getImportableDescriptor import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode import org.jetbrains.kotlin.types.expressions.OperatorConventions @@ -241,13 +242,15 @@ class KtSimpleNameReference(expression: KtSimpleNameExpression) : KtSimpleRefere } fun getImportAlias(): KtImportAlias? { + fun DeclarationDescriptor.unwrap() = if (this is ImportedFromObjectCallableDescriptor<*>) callableFromObject else this + val element = element val name = element.getReferencedName() val file = element.containingKtFile val importDirective = file.findImportByAlias(name) ?: return null val fqName = importDirective.importedFqName ?: return null - val importedDescriptors = file.resolveImportReference(fqName) - if (getTargetDescriptors(element.analyze(BodyResolveMode.PARTIAL)).any { it.getImportableDescriptor() in importedDescriptors }) { + val importedDescriptors = file.resolveImportReference(fqName).map { it.unwrap() } + if (getTargetDescriptors(element.analyze(BodyResolveMode.PARTIAL)).any { it.unwrap().getImportableDescriptor() in importedDescriptors }) { return importDirective.alias } return null diff --git a/idea/testData/refactoring/rename/objectFunctionImportAliasByRef/after/test.kt b/idea/testData/refactoring/rename/objectFunctionImportAliasByRef/after/test.kt new file mode 100644 index 00000000000..b99824a06a3 --- /dev/null +++ b/idea/testData/refactoring/rename/objectFunctionImportAliasByRef/after/test.kt @@ -0,0 +1,9 @@ +import Foo.foo as baz + +object Foo { + fun foo() {} +} + +fun test() { + baz() +} \ No newline at end of file diff --git a/idea/testData/refactoring/rename/objectFunctionImportAliasByRef/before/test.kt b/idea/testData/refactoring/rename/objectFunctionImportAliasByRef/before/test.kt new file mode 100644 index 00000000000..a179e87068c --- /dev/null +++ b/idea/testData/refactoring/rename/objectFunctionImportAliasByRef/before/test.kt @@ -0,0 +1,9 @@ +import Foo.foo as bar + +object Foo { + fun foo() {} +} + +fun test() { + /*rename*/bar() +} \ No newline at end of file diff --git a/idea/testData/refactoring/rename/objectFunctionImportAliasByRef/objectFunctionImportAliasByRef.test b/idea/testData/refactoring/rename/objectFunctionImportAliasByRef/objectFunctionImportAliasByRef.test new file mode 100644 index 00000000000..dae046abfe1 --- /dev/null +++ b/idea/testData/refactoring/rename/objectFunctionImportAliasByRef/objectFunctionImportAliasByRef.test @@ -0,0 +1,5 @@ +{ + "type": "AUTO_DETECT", + "mainFile": "test.kt", + "newName": "baz" +} \ No newline at end of file diff --git a/idea/testData/refactoring/rename/objectPropertyImportAliasByRef/after/test.kt b/idea/testData/refactoring/rename/objectPropertyImportAliasByRef/after/test.kt new file mode 100644 index 00000000000..8e0fc5a8426 --- /dev/null +++ b/idea/testData/refactoring/rename/objectPropertyImportAliasByRef/after/test.kt @@ -0,0 +1,9 @@ +import Foo.foo as baz + +object Foo { + val foo = 1 +} + +fun test() { + val x = baz +} \ No newline at end of file diff --git a/idea/testData/refactoring/rename/objectPropertyImportAliasByRef/before/test.kt b/idea/testData/refactoring/rename/objectPropertyImportAliasByRef/before/test.kt new file mode 100644 index 00000000000..91cd1962724 --- /dev/null +++ b/idea/testData/refactoring/rename/objectPropertyImportAliasByRef/before/test.kt @@ -0,0 +1,9 @@ +import Foo.foo as bar + +object Foo { + val foo = 1 +} + +fun test() { + val x = /*rename*/bar +} \ No newline at end of file diff --git a/idea/testData/refactoring/rename/objectPropertyImportAliasByRef/objectPropertyImportAliasByRef.test b/idea/testData/refactoring/rename/objectPropertyImportAliasByRef/objectPropertyImportAliasByRef.test new file mode 100644 index 00000000000..dae046abfe1 --- /dev/null +++ b/idea/testData/refactoring/rename/objectPropertyImportAliasByRef/objectPropertyImportAliasByRef.test @@ -0,0 +1,5 @@ +{ + "type": "AUTO_DETECT", + "mainFile": "test.kt", + "newName": "baz" +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/refactoring/rename/RenameTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/refactoring/rename/RenameTestGenerated.java index 572f5af5b1b..e512cc45ce0 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/refactoring/rename/RenameTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/refactoring/rename/RenameTestGenerated.java @@ -396,6 +396,18 @@ public class RenameTestGenerated extends AbstractRenameTest { doTest(fileName); } + @TestMetadata("objectFunctionImportAliasByRef/objectFunctionImportAliasByRef.test") + public void testObjectFunctionImportAliasByRef_ObjectFunctionImportAliasByRef() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/rename/objectFunctionImportAliasByRef/objectFunctionImportAliasByRef.test"); + doTest(fileName); + } + + @TestMetadata("objectPropertyImportAliasByRef/objectPropertyImportAliasByRef.test") + public void testObjectPropertyImportAliasByRef_ObjectPropertyImportAliasByRef() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/rename/objectPropertyImportAliasByRef/objectPropertyImportAliasByRef.test"); + doTest(fileName); + } + @TestMetadata("paramererAsReceiverWithNewNameAsSelector/parameterAsReceiverWithNewNameAsSelector.test") public void testParamererAsReceiverWithNewNameAsSelector_ParameterAsReceiverWithNewNameAsSelector() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/rename/paramererAsReceiverWithNewNameAsSelector/parameterAsReceiverWithNewNameAsSelector.test");