From 918eda0c9b765e1ff936d92c7e91f4120ac8340c Mon Sep 17 00:00:00 2001 From: Alexey Sedunov Date: Tue, 7 Apr 2015 20:40:20 +0300 Subject: [PATCH] Introduce Parameter: Do not suggest containers of object and non-inner classes --- .../KotlinIntroduceParameterHandler.kt | 21 ++++++++++++++++++- .../introduceParameter/forbiddenUsages.kt | 10 +++++++++ .../forbiddenUsages.kt.after | 10 +++++++++ .../introduce/JetExtractionTestGenerated.java | 6 ++++++ 4 files changed, 46 insertions(+), 1 deletion(-) create mode 100644 idea/testData/refactoring/introduceParameter/forbiddenUsages.kt create mode 100644 idea/testData/refactoring/introduceParameter/forbiddenUsages.kt.after diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/introduceParameter/KotlinIntroduceParameterHandler.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/introduceParameter/KotlinIntroduceParameterHandler.kt index e6cdb0547d7..915961634cf 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/introduceParameter/KotlinIntroduceParameterHandler.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/introduceParameter/KotlinIntroduceParameterHandler.kt @@ -135,6 +135,9 @@ fun IntroduceParameterDescriptor.performRefactoring() { public open class KotlinIntroduceParameterHandler: KotlinIntroduceHandlerBase() { open fun configure(descriptor: IntroduceParameterDescriptor): IntroduceParameterDescriptor = descriptor + private fun isObjectOrNonInnerClass(e: PsiElement): Boolean = + e is JetObjectDeclaration || (e is JetClass && !e.isInner()) + fun invoke(project: Project, editor: Editor, expression: JetExpression, targetParent: JetNamedDeclaration) { val psiFactory = JetPsiFactory(project) @@ -170,8 +173,19 @@ public open class KotlinIntroduceParameterHandler: KotlinIntroduceHandlerBase() .filter { it.second.isNotEmpty() } .toMap() + val forbiddenRanges = + if (targetParent is JetClass) { + targetParent.getDeclarations().filter { isObjectOrNonInnerClass(it) }.map { it.getTextRange() } + } + else { + Collections.emptyList() + } val occurrencesToReplace = expression.toRange() .match(body, JetPsiUnifier.DEFAULT) + .filterNot { + val textRange = it.range.getTextRange() + forbiddenRanges.any { it.intersects(textRange) } + } .map { val matchedElement = it.range.elements.singleOrNull() when (matchedElement) { @@ -241,7 +255,12 @@ public open class KotlinIntroduceParameterHandler: KotlinIntroduceHandlerBase() editor = editor, file = file, getContainers = { elements, parent -> - parent.parents(withItself = false) + val parents = parent.parents(withItself = false) + val stopAt = (parent.parents(withItself = false) zip parent.parents(withItself = false).drop(1)) + .firstOrNull { isObjectOrNonInnerClass(it.first) } + ?.second + + (if (stopAt != null) parent.parents(withItself = false).takeWhile { it != stopAt } else parents) .filter { ((it is JetClass && !it.isTrait() && it !is JetEnumEntry) || it is JetNamedFunction || it is JetSecondaryConstructor) && ((it as JetNamedDeclaration).getValueParameterList() != null || it.getNameIdentifier() != null) diff --git a/idea/testData/refactoring/introduceParameter/forbiddenUsages.kt b/idea/testData/refactoring/introduceParameter/forbiddenUsages.kt new file mode 100644 index 00000000000..dc9a0b92df2 --- /dev/null +++ b/idea/testData/refactoring/introduceParameter/forbiddenUsages.kt @@ -0,0 +1,10 @@ +// TARGET: +class A { + inner class B { + fun foo() = 1 + } + + object O { + fun foo() = 1 + } +} \ No newline at end of file diff --git a/idea/testData/refactoring/introduceParameter/forbiddenUsages.kt.after b/idea/testData/refactoring/introduceParameter/forbiddenUsages.kt.after new file mode 100644 index 00000000000..a442703be5e --- /dev/null +++ b/idea/testData/refactoring/introduceParameter/forbiddenUsages.kt.after @@ -0,0 +1,10 @@ +// TARGET: +class A(val i: Int = 1) { + inner class B { + fun foo() = i + } + + object O { + fun foo() = 1 + } +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/refactoring/introduce/JetExtractionTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/refactoring/introduce/JetExtractionTestGenerated.java index 1ebc6c2daa2..d73c512255e 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/refactoring/introduce/JetExtractionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/refactoring/introduce/JetExtractionTestGenerated.java @@ -2269,6 +2269,12 @@ public class JetExtractionTestGenerated extends AbstractJetExtractionTest { doIntroduceParameterTest(fileName); } + @TestMetadata("forbiddenUsages.kt") + public void testForbiddenUsages() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/refactoring/introduceParameter/forbiddenUsages.kt"); + doIntroduceParameterTest(fileName); + } + @TestMetadata("functionMultipleUnusedParameters.kt") public void testFunctionMultipleUnusedParameters() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/refactoring/introduceParameter/functionMultipleUnusedParameters.kt");