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");