From d597c98445f17e5722d8afa62b902cc136302936 Mon Sep 17 00:00:00 2001 From: Alexey Sedunov Date: Thu, 13 Nov 2014 19:36:14 +0300 Subject: [PATCH] Extract Function: Fix NPE when extracting this in object #KT-6238 Fixed --- .../extractFunction/ExtractableCodeDescriptor.kt | 5 +++++ .../extractFunction/parameters/misc/thisInObject.kt | 9 +++++++++ .../parameters/misc/thisInObject.kt.after | 13 +++++++++++++ .../JetExtractionTestGenerated.java | 6 ++++++ 4 files changed, 33 insertions(+) create mode 100644 idea/testData/refactoring/extractFunction/parameters/misc/thisInObject.kt create mode 100644 idea/testData/refactoring/extractFunction/parameters/misc/thisInObject.kt.after diff --git a/idea/src/org/jetbrains/jet/plugin/refactoring/extractFunction/ExtractableCodeDescriptor.kt b/idea/src/org/jetbrains/jet/plugin/refactoring/extractFunction/ExtractableCodeDescriptor.kt index a3b4bb3b984..9e56df0aeb5 100644 --- a/idea/src/org/jetbrains/jet/plugin/refactoring/extractFunction/ExtractableCodeDescriptor.kt +++ b/idea/src/org/jetbrains/jet/plugin/refactoring/extractFunction/ExtractableCodeDescriptor.kt @@ -120,6 +120,11 @@ class AddPrefixReplacement(override val parameter: Parameter): ParameterReplacem class FqNameReplacement(val fqName: FqName): Replacement { [suppress("PARAMETER_NAME_CHANGED_ON_OVERRIDE")] override fun invoke(e: JetElement): JetElement { + val thisExpr = e.getParent() as? JetThisExpression + if (thisExpr != null) { + return thisExpr.replaced(JetPsiFactory(e).createExpression(fqName.asString())).getQualifiedElementSelector()!! + } + val newExpr = (e.getReference() as? JetSimpleNameReference)?.bindToFqName(fqName, ShorteningMode.NO_SHORTENING) as JetElement return if (newExpr is JetQualifiedExpression) newExpr.getSelectorExpression()!! else newExpr } diff --git a/idea/testData/refactoring/extractFunction/parameters/misc/thisInObject.kt b/idea/testData/refactoring/extractFunction/parameters/misc/thisInObject.kt new file mode 100644 index 00000000000..a38356aecf4 --- /dev/null +++ b/idea/testData/refactoring/extractFunction/parameters/misc/thisInObject.kt @@ -0,0 +1,9 @@ +package p + +// SIBLING: +object O { + val a = 1 + fun test() { + this.a + } +} \ No newline at end of file diff --git a/idea/testData/refactoring/extractFunction/parameters/misc/thisInObject.kt.after b/idea/testData/refactoring/extractFunction/parameters/misc/thisInObject.kt.after new file mode 100644 index 00000000000..f3ad7b8a0c8 --- /dev/null +++ b/idea/testData/refactoring/extractFunction/parameters/misc/thisInObject.kt.after @@ -0,0 +1,13 @@ +package p + +// SIBLING: +object O { + val a = 1 + fun test() { + unit() + } +} + +private fun unit() { + O.a +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/jet/plugin/refactoring/introduce/introduceVariable/JetExtractionTestGenerated.java b/idea/tests/org/jetbrains/jet/plugin/refactoring/introduce/introduceVariable/JetExtractionTestGenerated.java index d5004772e6e..d174a96314d 100644 --- a/idea/tests/org/jetbrains/jet/plugin/refactoring/introduce/introduceVariable/JetExtractionTestGenerated.java +++ b/idea/tests/org/jetbrains/jet/plugin/refactoring/introduce/introduceVariable/JetExtractionTestGenerated.java @@ -1625,6 +1625,12 @@ public class JetExtractionTestGenerated extends AbstractJetExtractionTest { doExtractFunctionTest(fileName); } + @TestMetadata("thisInObject.kt") + public void testThisInObject() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/refactoring/extractFunction/parameters/misc/thisInObject.kt"); + doExtractFunctionTest(fileName); + } + @TestMetadata("typeRef.kt") public void testTypeRef() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/refactoring/extractFunction/parameters/misc/typeRef.kt");