From d54b261c613f70eba87cf02ae1b798e78c69f51e Mon Sep 17 00:00:00 2001 From: Alexey Sedunov Date: Tue, 13 Jan 2015 15:37:22 +0300 Subject: [PATCH] Extract Function: Fix 'this' label (extension case) #KT-5456 Fixed --- .../extractFunction/extractableAnalysisUtil.kt | 6 ++++-- .../extractThis/qualifiedThisAsArgument.kt | 14 ++++++++++++++ .../qualifiedThisAsArgument.kt.after | 18 ++++++++++++++++++ .../JetExtractionTestGenerated.java | 6 ++++++ 4 files changed, 42 insertions(+), 2 deletions(-) create mode 100644 idea/testData/refactoring/extractFunction/parameters/extractThis/qualifiedThisAsArgument.kt create mode 100644 idea/testData/refactoring/extractFunction/parameters/extractThis/qualifiedThisAsArgument.kt.after diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/extractFunction/extractableAnalysisUtil.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/extractFunction/extractableAnalysisUtil.kt index 2ee5a95365d..46f05260bee 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/extractFunction/extractableAnalysisUtil.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/extractFunction/extractableAnalysisUtil.kt @@ -622,8 +622,10 @@ private fun ExtractionData.inferParametersInfo( val parameter = extractedDescriptorToParameter.getOrPut(descriptorToExtract) { val argumentText = - if (hasThisReceiver && extractThis) - "this@${parameterType.getConstructor().getDeclarationDescriptor()!!.getName().asString()}" + if (hasThisReceiver && extractThis) { + val label = if (descriptorToExtract is ClassDescriptor) "@${descriptorToExtract.getName().asString()}" else "" + "this$label" + } else (thisExpr ?: ref).getText() ?: throw AssertionError("'this' reference shouldn't be empty: code fragment = ${getCodeFragmentText()}") diff --git a/idea/testData/refactoring/extractFunction/parameters/extractThis/qualifiedThisAsArgument.kt b/idea/testData/refactoring/extractFunction/parameters/extractThis/qualifiedThisAsArgument.kt new file mode 100644 index 00000000000..ac99be7f570 --- /dev/null +++ b/idea/testData/refactoring/extractFunction/parameters/extractThis/qualifiedThisAsArgument.kt @@ -0,0 +1,14 @@ +// PARAM_TYPES: A +// PARAM_TYPES: B +// PARAM_DESCRIPTOR: internal final class A defined in root package +// PARAM_DESCRIPTOR: internal final fun B.foo(): Int defined in A +// SIBLING: +class A { + val a = 1 + + fun B.foo() = a + b +} + +class B { + val b = 1 +} \ No newline at end of file diff --git a/idea/testData/refactoring/extractFunction/parameters/extractThis/qualifiedThisAsArgument.kt.after b/idea/testData/refactoring/extractFunction/parameters/extractThis/qualifiedThisAsArgument.kt.after new file mode 100644 index 00000000000..73dd09c44bc --- /dev/null +++ b/idea/testData/refactoring/extractFunction/parameters/extractThis/qualifiedThisAsArgument.kt.after @@ -0,0 +1,18 @@ +// PARAM_TYPES: A +// PARAM_TYPES: B +// PARAM_DESCRIPTOR: internal final class A defined in root package +// PARAM_DESCRIPTOR: internal final fun B.foo(): Int defined in A +// SIBLING: +class A { + val a = 1 + + fun B.foo() = i(this@A, this) +} + +private fun i(a1: A, b: B): Int { + return a1.a + b.b +} + +class B { + val b = 1 +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/refactoring/introduce/introduceVariable/JetExtractionTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/refactoring/introduce/introduceVariable/JetExtractionTestGenerated.java index 20800b0e4bf..f10d6e4fbf6 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/refactoring/introduce/introduceVariable/JetExtractionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/refactoring/introduce/introduceVariable/JetExtractionTestGenerated.java @@ -1639,6 +1639,12 @@ public class JetExtractionTestGenerated extends AbstractJetExtractionTest { String fileName = JetTestUtils.navigationMetadata("idea/testData/refactoring/extractFunction/parameters/extractThis/implicitThisInMember.kt"); doExtractFunctionTest(fileName); } + + @TestMetadata("qualifiedThisAsArgument.kt") + public void testQualifiedThisAsArgument() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/refactoring/extractFunction/parameters/extractThis/qualifiedThisAsArgument.kt"); + doExtractFunctionTest(fileName); + } } @TestMetadata("idea/testData/refactoring/extractFunction/parameters/it")