From 240f033f4f65a524b292de804c0dc63f4d605b7b Mon Sep 17 00:00:00 2001 From: Alexey Sedunov Date: Wed, 21 May 2014 14:54:10 +0400 Subject: [PATCH] Extract Function: Fix NPE caused by unmatched offset-to-reference maps #KT-5001 Fixed --- .../extractFunction/extractFunctionUtils.kt | 2 +- .../extractFunction/parameters/misc/kt5001.kt | 12 ++++++++++++ .../parameters/misc/kt5001.kt.after | 16 ++++++++++++++++ .../JetExtractionTestGenerated.java | 5 +++++ 4 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 idea/testData/refactoring/extractFunction/parameters/misc/kt5001.kt create mode 100644 idea/testData/refactoring/extractFunction/parameters/misc/kt5001.kt.after diff --git a/idea/src/org/jetbrains/jet/plugin/refactoring/extractFunction/extractFunctionUtils.kt b/idea/src/org/jetbrains/jet/plugin/refactoring/extractFunction/extractFunctionUtils.kt index 078ffe0a346..fbd59470e52 100644 --- a/idea/src/org/jetbrains/jet/plugin/refactoring/extractFunction/extractFunctionUtils.kt +++ b/idea/src/org/jetbrains/jet/plugin/refactoring/extractFunction/extractFunctionUtils.kt @@ -739,7 +739,7 @@ fun ExtractionDescriptor.generateFunction( body.getStatements().last?.let { val newExpr = it.replaced(JetPsiFactory.createReturn(project, it.getText() ?: throw AssertionError("Return expression shouldn't be empty: code fragment = ${body.getText()}"))).getReturnedExpression()!! val counterpartMap = createNameCounterpartMap(it, newExpr) - nameByOffset.entrySet().forEach { it.setValue(counterpartMap[it.getValue()]!!) } + nameByOffset.entrySet().forEach { e -> counterpartMap[e.getValue()]?.let { e.setValue(it) } } } } } diff --git a/idea/testData/refactoring/extractFunction/parameters/misc/kt5001.kt b/idea/testData/refactoring/extractFunction/parameters/misc/kt5001.kt new file mode 100644 index 00000000000..d3f0e60bec8 --- /dev/null +++ b/idea/testData/refactoring/extractFunction/parameters/misc/kt5001.kt @@ -0,0 +1,12 @@ +fun Int.bar(n: Int): Boolean { + return true +} + +// SIBLING: +fun main(args: Array) { + val t = if (args.size > 0) { + val al = 0 + al.bar(1) + } + else false +} \ No newline at end of file diff --git a/idea/testData/refactoring/extractFunction/parameters/misc/kt5001.kt.after b/idea/testData/refactoring/extractFunction/parameters/misc/kt5001.kt.after new file mode 100644 index 00000000000..3824d091dd1 --- /dev/null +++ b/idea/testData/refactoring/extractFunction/parameters/misc/kt5001.kt.after @@ -0,0 +1,16 @@ +fun Int.bar(n: Int): Boolean { + return true +} + +// SIBLING: +fun main(args: Array) { + val t = if (args.size > 0) { + b() + } + else false +} + +fun b(): Boolean { + val al = 0 + return al.bar(1) +} \ 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 b4e61b50051..bcc10d873c4 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 @@ -724,6 +724,11 @@ public class JetExtractionTestGenerated extends AbstractJetExtractionTest { doExtractFunctionTest("idea/testData/refactoring/extractFunction/parameters/misc/innerClassObject.kt"); } + @TestMetadata("kt5001.kt") + public void testKt5001() throws Exception { + doExtractFunctionTest("idea/testData/refactoring/extractFunction/parameters/misc/kt5001.kt"); + } + @TestMetadata("multiDeclaration.kt") public void testMultiDeclaration() throws Exception { doExtractFunctionTest("idea/testData/refactoring/extractFunction/parameters/misc/multiDeclaration.kt");