From b1c4a5670a18e281c3d0c116ca7027d840b0fe71 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Wed, 29 Apr 2015 19:40:31 +0200 Subject: [PATCH] provide element type name for multi-declaration entries; enable in-place rename for those; show local properties as "variable" #KT-7627 Fixed --- .../kotlin/psi/JetMultiDeclarationEntry.java | 11 ++++ .../idea/findUsages/JetFindUsagesProvider.kt | 3 +- .../JetElementDescriptionProvider.kt | 3 +- .../KotlinRefactoringSupportProvider.kt | 63 ++++++++----------- .../conflicts.txt | 2 +- .../conflicts.txt | 2 +- .../rename/inplace/MultiDeclaration.kt | 5 ++ .../rename/inplace/MultiDeclaration.kt.after | 5 ++ .../idea/refactoring/InplaceRenameTest.kt | 4 ++ 9 files changed, 57 insertions(+), 41 deletions(-) create mode 100644 idea/testData/refactoring/rename/inplace/MultiDeclaration.kt create mode 100644 idea/testData/refactoring/rename/inplace/MultiDeclaration.kt.after diff --git a/compiler/frontend/src/org/jetbrains/kotlin/psi/JetMultiDeclarationEntry.java b/compiler/frontend/src/org/jetbrains/kotlin/psi/JetMultiDeclarationEntry.java index cf0cbbaca2b..c3daddf09a0 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/psi/JetMultiDeclarationEntry.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/psi/JetMultiDeclarationEntry.java @@ -18,6 +18,8 @@ package org.jetbrains.kotlin.psi; import com.intellij.lang.ASTNode; import com.intellij.psi.PsiElement; +import com.intellij.psi.search.LocalSearchScope; +import com.intellij.psi.search.SearchScope; import com.intellij.psi.tree.TokenSet; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -134,4 +136,13 @@ public class JetMultiDeclarationEntry extends JetNamedDeclarationNotStubbed impl public FqName getFqName() { return null; } + + @NotNull + @Override + public SearchScope getUseScope() { + JetElement enclosingBlock = JetPsiUtil.getEnclosingElementForLocalDeclaration(this, false); + if (enclosingBlock != null) return new LocalSearchScope(enclosingBlock); + + return super.getUseScope(); + } } diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/findUsages/JetFindUsagesProvider.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/findUsages/JetFindUsagesProvider.kt index aa3876bc2e0..5e011749faf 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/findUsages/JetFindUsagesProvider.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/findUsages/JetFindUsagesProvider.kt @@ -36,7 +36,8 @@ public class JetFindUsagesProvider : FindUsagesProvider { is JetNamedFunction -> "function" is JetClass -> "class" is JetParameter -> "parameter" - is JetProperty -> "property" + is JetProperty -> if (element.isLocal()) "variable" else "property" + is JetMultiDeclarationEntry -> "variable" is JetTypeParameter -> "type parameter" is JetSecondaryConstructor -> "constructor" is JetObjectDeclaration -> "object" diff --git a/idea/src/org/jetbrains/kotlin/idea/findUsages/JetElementDescriptionProvider.kt b/idea/src/org/jetbrains/kotlin/idea/findUsages/JetElementDescriptionProvider.kt index b9230f505a5..ce6c508f071 100644 --- a/idea/src/org/jetbrains/kotlin/idea/findUsages/JetElementDescriptionProvider.kt +++ b/idea/src/org/jetbrains/kotlin/idea/findUsages/JetElementDescriptionProvider.kt @@ -40,9 +40,10 @@ public class JetElementDescriptionProvider : ElementDescriptionProvider { is JetObjectDeclaration -> "object" is JetNamedFunction -> "function" is JetSecondaryConstructor -> "constructor" - is JetProperty -> "property" + is JetProperty -> if (targetElement.isLocal()) "variable" else "property" is JetTypeParameter -> "type parameter" is JetParameter -> "parameter" + is JetMultiDeclarationEntry -> "variable" else -> null } diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/KotlinRefactoringSupportProvider.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/KotlinRefactoringSupportProvider.kt index 0e2e122c64e..c05e7a8c3a9 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/KotlinRefactoringSupportProvider.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/KotlinRefactoringSupportProvider.kt @@ -30,55 +30,44 @@ import org.jetbrains.kotlin.idea.refactoring.safeDelete.* import org.jetbrains.kotlin.psi.* public class KotlinRefactoringSupportProvider : RefactoringSupportProvider() { - override fun isSafeDeleteAvailable(element: PsiElement): Boolean { - return element.canDeleteElement() - } + override fun isSafeDeleteAvailable(element: PsiElement) = element.canDeleteElement() - override fun getIntroduceVariableHandler(): RefactoringActionHandler? { - return KotlinIntroduceVariableHandler() - } + override fun getIntroduceVariableHandler() = KotlinIntroduceVariableHandler() - override fun getIntroduceParameterHandler(): RefactoringActionHandler? { - return KotlinIntroduceParameterHandler() - } + override fun getIntroduceParameterHandler() = KotlinIntroduceParameterHandler() - public fun getIntroduceLambdaParameterHandler(): RefactoringActionHandler { - return KotlinIntroduceLambdaParameterHandler() - } + public fun getIntroduceLambdaParameterHandler(): RefactoringActionHandler = KotlinIntroduceLambdaParameterHandler() - public fun getIntroducePropertyHandler(): RefactoringActionHandler { - return KotlinIntroducePropertyHandler() - } + public fun getIntroducePropertyHandler(): RefactoringActionHandler = KotlinIntroducePropertyHandler() - public fun getExtractFunctionHandler(): RefactoringActionHandler { - return ExtractKotlinFunctionHandler() - } + public fun getExtractFunctionHandler(): RefactoringActionHandler = + ExtractKotlinFunctionHandler() - public fun getExtractFunctionToScopeHandler(): RefactoringActionHandler { - return ExtractKotlinFunctionHandler(true, ExtractKotlinFunctionHandler.InteractiveExtractionHelper) - } + public fun getExtractFunctionToScopeHandler(): RefactoringActionHandler = + ExtractKotlinFunctionHandler(true, ExtractKotlinFunctionHandler.InteractiveExtractionHelper) override fun isInplaceRenameAvailable(element: PsiElement, context: PsiElement?): Boolean { - if (element is JetProperty) { - if (element.isLocal()) return true - } - else if (element is JetFunction) { - if (element.isLocal()) return true - } - else if (element is JetParameter) { - val parent = element.getParent() - if (parent is JetForExpression) { - return true + when (element) { + is JetProperty -> { + if (element.isLocal()) return true } - if (parent is JetParameterList) { - val grandparent = parent.getParent() - return grandparent is JetCatchClause || grandparent is JetFunctionLiteral + is JetMultiDeclarationEntry -> return true + is JetFunction -> { + if (element.isLocal()) return true + } + is JetParameter -> { + val parent = element.getParent() + if (parent is JetForExpression) { + return true + } + if (parent is JetParameterList) { + val grandparent = parent.getParent() + return grandparent is JetCatchClause || grandparent is JetFunctionLiteral + } } } return false } - override fun getChangeSignatureHandler(): ChangeSignatureHandler? { - return JetChangeSignatureHandler() - } + override fun getChangeSignatureHandler() = JetChangeSignatureHandler() } diff --git a/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveClassToPackageWithConflicts/conflicts.txt b/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveClassToPackageWithConflicts/conflicts.txt index 753e162cfb0..5343694dfaf 100644 --- a/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveClassToPackageWithConflicts/conflicts.txt +++ b/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveClassToPackageWithConflicts/conflicts.txt @@ -1,4 +1,4 @@ Class a.Test uses package-private class a.Foo Class a.Test uses package-private function a.foo Package-private class a.Test will no longer be accessible from method J.bar() -Package-private class a.Test will no longer be accessible from property a.bar.t +Package-private class a.Test will no longer be accessible from variable a.bar.t \ No newline at end of file diff --git a/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveObjectToPackageWithConflicts/conflicts.txt b/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveObjectToPackageWithConflicts/conflicts.txt index 2b35b4c2461..745ac918cfb 100644 --- a/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveObjectToPackageWithConflicts/conflicts.txt +++ b/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveObjectToPackageWithConflicts/conflicts.txt @@ -1,4 +1,4 @@ Object a.Test uses package-private class a.Foo Object a.Test uses package-private function a.foo Package-private object a.Test will no longer be accessible from method J.bar() -Package-private object a.Test will no longer be accessible from property a.bar.t +Package-private object a.Test will no longer be accessible from variable a.bar.t \ No newline at end of file diff --git a/idea/testData/refactoring/rename/inplace/MultiDeclaration.kt b/idea/testData/refactoring/rename/inplace/MultiDeclaration.kt new file mode 100644 index 00000000000..9e74a4d9174 --- /dev/null +++ b/idea/testData/refactoring/rename/inplace/MultiDeclaration.kt @@ -0,0 +1,5 @@ +fun xyzzy(x: Pair) { + val (bar, baz) = x + println(baz) + println(baz.length()) +} diff --git a/idea/testData/refactoring/rename/inplace/MultiDeclaration.kt.after b/idea/testData/refactoring/rename/inplace/MultiDeclaration.kt.after new file mode 100644 index 00000000000..80e44ca6300 --- /dev/null +++ b/idea/testData/refactoring/rename/inplace/MultiDeclaration.kt.after @@ -0,0 +1,5 @@ +fun xyzzy(x: Pair) { + val (bar, foo) = x + println(foo) + println(foo.length()) +} diff --git a/idea/tests/org/jetbrains/kotlin/idea/refactoring/InplaceRenameTest.kt b/idea/tests/org/jetbrains/kotlin/idea/refactoring/InplaceRenameTest.kt index 9720ad252db..9197ae2f110 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/refactoring/InplaceRenameTest.kt +++ b/idea/tests/org/jetbrains/kotlin/idea/refactoring/InplaceRenameTest.kt @@ -128,6 +128,10 @@ public class InplaceRenameTest : LightPlatformCodeInsightTestCase() { doTestInplaceRename("foo") } + public fun testMultiDeclaration() { + doTestInplaceRename("foo") + } + private fun doTestInplaceRename(newName: String?) { configureByFile(getTestName(false) + ".kt") val element = TargetElementUtilBase.findTargetElement(