diff --git a/idea/src/org/jetbrains/jet/plugin/refactoring/jetRefactoringUtil.kt b/idea/src/org/jetbrains/jet/plugin/refactoring/jetRefactoringUtil.kt index b4453a9dc9c..6b138aa0eb8 100644 --- a/idea/src/org/jetbrains/jet/plugin/refactoring/jetRefactoringUtil.kt +++ b/idea/src/org/jetbrains/jet/plugin/refactoring/jetRefactoringUtil.kt @@ -73,6 +73,7 @@ import org.jetbrains.kotlin.psi.psiUtil.getParentOfType import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType import com.intellij.psi.PsiPackage import org.jetbrains.jet.plugin.util.ProjectRootsUtil +import org.jetbrains.kotlin.psi.psiUtil.parents fun PsiElement.getAndRemoveCopyableUserData(key: Key): T? { val data = getCopyableUserData(key) @@ -137,27 +138,27 @@ public fun PsiElement.getAllExtractionContainers(strict: Boolean = true): List { + fun getEnclosingDeclaration(element: PsiElement, strict: Boolean): PsiElement? { + return element.parents(!strict) + .filter { + (it is JetDeclarationWithBody && it !is JetFunctionLiteral) + || it is JetClassInitializer + || it is JetClassBody + || it is JetFile + } + .firstOrNull() + } + if (includeAll) return getAllExtractionContainers(strict) - val declaration = getParentOfType(strict)?.let { declaration -> - stream(declaration) { it.getStrictParentOfType() }.firstOrNull { it !is JetFunctionLiteral } - } ?: return Collections.emptyList() - - val parent = declaration.getParent()?.let { - when (it) { - is JetProperty, is JetMultiDeclaration -> it.getParent() - is JetParameterList -> it.getParent()?.getParent() - else -> it - } + val enclosingDeclaration = getEnclosingDeclaration(this, strict)?.let { + if (it is JetDeclarationWithBody || it is JetClassInitializer) getEnclosingDeclaration(it, true) else it } - return when (parent) { - is JetFile -> Collections.singletonList(parent) - is JetClassBody -> { - getAllExtractionContainers(strict).filterIsInstance() - } + + return when (enclosingDeclaration) { + is JetFile -> Collections.singletonList(enclosingDeclaration) + is JetClassBody -> getAllExtractionContainers(strict).filterIsInstance() else -> { - val enclosingDeclaration = - PsiTreeUtil.getNonStrictParentOfType(parent, javaClass(), javaClass()) val targetContainer = when (enclosingDeclaration) { is JetDeclarationWithBody -> enclosingDeclaration.getBodyExpression() is JetClassInitializer -> enclosingDeclaration.getBody() diff --git a/idea/testData/quickfix/autoImports/noImportInImports.before.Main.kt b/idea/testData/quickfix/autoImports/noImportInImports.before.Main.kt index de5cb10351f..0b5a0466b26 100644 --- a/idea/testData/quickfix/autoImports/noImportInImports.before.Main.kt +++ b/idea/testData/quickfix/autoImports/noImportInImports.before.Main.kt @@ -3,6 +3,7 @@ // ACTION: Create class 'SomeTest' // ACTION: Create enum 'SomeTest' // ACTION: Create object 'SomeTest' +// ACTION: Create property 'SomeTest' // ACTION: Create trait 'SomeTest' // ERROR: Unresolved reference: SomeTest diff --git a/idea/testData/quickfix/createFromUsage/createClass/importDirective/beforeEnumEntryInPackage.kt b/idea/testData/quickfix/createFromUsage/createClass/importDirective/beforeEnumEntryInPackage.kt index 76bf8af903f..482d34e8a21 100644 --- a/idea/testData/quickfix/createFromUsage/createClass/importDirective/beforeEnumEntryInPackage.kt +++ b/idea/testData/quickfix/createFromUsage/createClass/importDirective/beforeEnumEntryInPackage.kt @@ -2,6 +2,7 @@ // ACTION: Create class 'A' // ACTION: Create trait 'A' // ACTION: Create object 'A' +// ACTION: Create property 'A' // ACTION: Create enum 'A' // ACTION: Create annotation 'A' // ERROR: Unresolved reference: A diff --git a/idea/testData/quickfix/createFromUsage/createClass/importDirective/beforeEnumEntryWithQualifier.kt b/idea/testData/quickfix/createFromUsage/createClass/importDirective/beforeEnumEntryWithQualifier.kt index 82f94fde623..3c30517128b 100644 --- a/idea/testData/quickfix/createFromUsage/createClass/importDirective/beforeEnumEntryWithQualifier.kt +++ b/idea/testData/quickfix/createFromUsage/createClass/importDirective/beforeEnumEntryWithQualifier.kt @@ -2,6 +2,7 @@ // ACTION: Create class 'A' // ACTION: Create trait 'A' // ACTION: Create object 'A' +// ACTION: Create property 'A' // ACTION: Create enum 'A' // ACTION: Create annotation 'A' // ERROR: Unresolved reference: A diff --git a/idea/testData/quickfix/createFromUsage/createVariable/parameter/beforeInClassObjectInitializer.kt b/idea/testData/quickfix/createFromUsage/createVariable/parameter/beforeInClassObjectInitializer.kt index 26555d5680a..e6b9e00850e 100644 --- a/idea/testData/quickfix/createFromUsage/createVariable/parameter/beforeInClassObjectInitializer.kt +++ b/idea/testData/quickfix/createFromUsage/createVariable/parameter/beforeInClassObjectInitializer.kt @@ -1,5 +1,6 @@ // "Create parameter 'foo'" "false" // ACTION: Create local variable 'foo' +// ACTION: Create property 'foo' // ACTION: Split property declaration // ERROR: Unresolved reference: foo diff --git a/idea/testData/refactoring/extractFunction/duplicates/insertBeforeDuplicates.kt.after b/idea/testData/refactoring/extractFunction/duplicates/insertBeforeDuplicates.kt.after index 416ec506584..ec6be0d48af 100644 --- a/idea/testData/refactoring/extractFunction/duplicates/insertBeforeDuplicates.kt.after +++ b/idea/testData/refactoring/extractFunction/duplicates/insertBeforeDuplicates.kt.after @@ -1,8 +1,8 @@ fun foo() { - fun i(): Int { - return 1 + 1 - } - val x = i() val y = i() +} + +private fun i(): Int { + return 1 + 1 } \ No newline at end of file diff --git a/idea/testData/refactoring/extractFunction/initializers/properties/localProperty.kt b/idea/testData/refactoring/extractFunction/initializers/properties/localProperty.kt index b36d53d77e8..89190f5bfca 100644 --- a/idea/testData/refactoring/extractFunction/initializers/properties/localProperty.kt +++ b/idea/testData/refactoring/extractFunction/initializers/properties/localProperty.kt @@ -1,3 +1,7 @@ +// PARAM_TYPES: kotlin.Int +// PARAM_TYPES: kotlin.Int +// PARAM_DESCRIPTOR: value-parameter val a: kotlin.Int defined in bar +// PARAM_DESCRIPTOR: value-parameter val b: kotlin.Int defined in bar fun bar(a: Int, b: Int) { val foo = a + b - 1 } \ No newline at end of file diff --git a/idea/testData/refactoring/extractFunction/initializers/properties/localProperty.kt.after b/idea/testData/refactoring/extractFunction/initializers/properties/localProperty.kt.after index 77b732dfc0f..c4f363e52d5 100644 --- a/idea/testData/refactoring/extractFunction/initializers/properties/localProperty.kt.after +++ b/idea/testData/refactoring/extractFunction/initializers/properties/localProperty.kt.after @@ -1,7 +1,11 @@ +// PARAM_TYPES: kotlin.Int +// PARAM_TYPES: kotlin.Int +// PARAM_DESCRIPTOR: value-parameter val a: kotlin.Int defined in bar +// PARAM_DESCRIPTOR: value-parameter val b: kotlin.Int defined in bar fun bar(a: Int, b: Int) { - fun i(): Int { - return a + b - } + val foo = i(a, b) - 1 +} - val foo = i() - 1 +private fun i(a: Int, b: Int): Int { + return a + b } \ No newline at end of file diff --git a/idea/testData/refactoring/extractFunction/initializers/properties/localPropertyWithLambda.kt b/idea/testData/refactoring/extractFunction/initializers/properties/localPropertyWithLambda.kt index 2b7845c0b2c..2613155daf0 100644 --- a/idea/testData/refactoring/extractFunction/initializers/properties/localPropertyWithLambda.kt +++ b/idea/testData/refactoring/extractFunction/initializers/properties/localPropertyWithLambda.kt @@ -1,3 +1,7 @@ +// PARAM_TYPES: kotlin.Int +// PARAM_TYPES: kotlin.Int +// PARAM_DESCRIPTOR: value-parameter val a: kotlin.Int defined in bar +// PARAM_DESCRIPTOR: value-parameter val b: kotlin.Int defined in bar fun bar(a: Int, b: Int) { val foo = { a + b - 1 }.invoke() } \ No newline at end of file diff --git a/idea/testData/refactoring/extractFunction/initializers/properties/localPropertyWithLambda.kt.after b/idea/testData/refactoring/extractFunction/initializers/properties/localPropertyWithLambda.kt.after index b5e693aaf29..ea272ef71f1 100644 --- a/idea/testData/refactoring/extractFunction/initializers/properties/localPropertyWithLambda.kt.after +++ b/idea/testData/refactoring/extractFunction/initializers/properties/localPropertyWithLambda.kt.after @@ -1,7 +1,11 @@ +// PARAM_TYPES: kotlin.Int +// PARAM_TYPES: kotlin.Int +// PARAM_DESCRIPTOR: value-parameter val a: kotlin.Int defined in bar +// PARAM_DESCRIPTOR: value-parameter val b: kotlin.Int defined in bar fun bar(a: Int, b: Int) { - fun i(): Int { - return a + b - } + val foo = { i(a, b) - 1 }.invoke() +} - val foo = { i() - 1 }.invoke() +private fun i(a: Int, b: Int): Int { + return a + b } \ No newline at end of file