diff --git a/idea/src/org/jetbrains/jet/plugin/refactoring/extractFunction/ExtractKotlinFunctionHandler.kt b/idea/src/org/jetbrains/jet/plugin/refactoring/extractFunction/ExtractKotlinFunctionHandler.kt index 81b796a068d..18b34dae227 100644 --- a/idea/src/org/jetbrains/jet/plugin/refactoring/extractFunction/ExtractKotlinFunctionHandler.kt +++ b/idea/src/org/jetbrains/jet/plugin/refactoring/extractFunction/ExtractKotlinFunctionHandler.kt @@ -66,6 +66,7 @@ import org.jetbrains.jet.lang.descriptors.FunctionDescriptor import org.jetbrains.jet.renderer.DescriptorRenderer import org.jetbrains.jet.lang.psi.JetPropertyAccessor import org.jetbrains.jet.lang.psi.JetClassOrObject +import org.jetbrains.jet.lang.psi.JetMultiDeclaration public open class ExtractKotlinFunctionHandlerHelper { open fun adjustGeneratorOptions(options: ExtractionGeneratorOptions): ExtractionGeneratorOptions = options @@ -206,7 +207,7 @@ fun selectElements( val parent = declaration.getParent()?.let { when (it) { - is JetProperty -> it.getParent() + is JetProperty, is JetMultiDeclaration -> it.getParent() is JetParameterList -> it.getParent()?.getParent() else -> it } diff --git a/idea/src/org/jetbrains/jet/plugin/refactoring/extractFunction/extractableAnalysisUtil.kt b/idea/src/org/jetbrains/jet/plugin/refactoring/extractFunction/extractableAnalysisUtil.kt index 5b191813d6f..4967eb711cd 100644 --- a/idea/src/org/jetbrains/jet/plugin/refactoring/extractFunction/extractableAnalysisUtil.kt +++ b/idea/src/org/jetbrains/jet/plugin/refactoring/extractFunction/extractableAnalysisUtil.kt @@ -598,6 +598,7 @@ fun ExtractionData.performAnalysis(): AnalysisResult { val bodyElement = when (enclosingDeclaration) { is JetDeclarationWithBody -> enclosingDeclaration.getBodyExpression() is JetWithExpressionInitializer -> enclosingDeclaration.getInitializer() + is JetMultiDeclaration -> enclosingDeclaration.getInitializer() is JetParameter -> enclosingDeclaration.getDefaultValue() is JetClassInitializer -> enclosingDeclaration.getBody() is JetClass -> { diff --git a/idea/testData/refactoring/extractFunction/initializers/properties/multiDeclaration.kt b/idea/testData/refactoring/extractFunction/initializers/properties/multiDeclaration.kt new file mode 100644 index 00000000000..39ad63948bb --- /dev/null +++ b/idea/testData/refactoring/extractFunction/initializers/properties/multiDeclaration.kt @@ -0,0 +1,7 @@ +data class Pair(val a: A, val b: B) +fun A.to(b: B) = Pair(this, b) + +// SIBLING: +fun foo() { + val (a, b) = 1 to 2 +} \ No newline at end of file diff --git a/idea/testData/refactoring/extractFunction/initializers/properties/multiDeclaration.kt.after b/idea/testData/refactoring/extractFunction/initializers/properties/multiDeclaration.kt.after new file mode 100644 index 00000000000..eac90dcbcd2 --- /dev/null +++ b/idea/testData/refactoring/extractFunction/initializers/properties/multiDeclaration.kt.after @@ -0,0 +1,11 @@ +data class Pair(val a: A, val b: B) +fun A.to(b: B) = Pair(this, b) + +// SIBLING: +fun foo() { + val (a, b) = pair() +} + +private fun pair(): Pair { + return 1 to 2 +} \ No newline at end of file diff --git a/idea/testData/refactoring/extractFunction/initializers/properties/nestedInMultiDeclaration.kt b/idea/testData/refactoring/extractFunction/initializers/properties/nestedInMultiDeclaration.kt new file mode 100644 index 00000000000..68b412cd7ab --- /dev/null +++ b/idea/testData/refactoring/extractFunction/initializers/properties/nestedInMultiDeclaration.kt @@ -0,0 +1,13 @@ +data class Pair(val a: A, val b: B) +fun A.to(b: B) = Pair(this, b) + +// SIBLING: +fun foo() { + val (a, b) = + if (true) { + 1 + 1 + 1 to 2 + } else { + 2 to 3 + } +} \ No newline at end of file diff --git a/idea/testData/refactoring/extractFunction/initializers/properties/nestedInMultiDeclaration.kt.after b/idea/testData/refactoring/extractFunction/initializers/properties/nestedInMultiDeclaration.kt.after new file mode 100644 index 00000000000..125bffcbb24 --- /dev/null +++ b/idea/testData/refactoring/extractFunction/initializers/properties/nestedInMultiDeclaration.kt.after @@ -0,0 +1,17 @@ +data class Pair(val a: A, val b: B) +fun A.to(b: B) = Pair(this, b) + +// SIBLING: +fun foo() { + val (a, b) = + if (true) { + unit() + 1 to 2 + } else { + 2 to 3 + } +} + +private fun unit() { + 1 + 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 72b4a917b6a..a557106a2f6 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 @@ -974,6 +974,16 @@ public class JetExtractionTestGenerated extends AbstractJetExtractionTest { doExtractFunctionTest("idea/testData/refactoring/extractFunction/initializers/properties/memberPropertyWithLambda.kt"); } + @TestMetadata("multiDeclaration.kt") + public void testMultiDeclaration() throws Exception { + doExtractFunctionTest("idea/testData/refactoring/extractFunction/initializers/properties/multiDeclaration.kt"); + } + + @TestMetadata("nestedInMultiDeclaration.kt") + public void testNestedInMultiDeclaration() throws Exception { + doExtractFunctionTest("idea/testData/refactoring/extractFunction/initializers/properties/nestedInMultiDeclaration.kt"); + } + @TestMetadata("topLevelProperty.kt") public void testTopLevelProperty() throws Exception { doExtractFunctionTest("idea/testData/refactoring/extractFunction/initializers/properties/topLevelProperty.kt");