diff --git a/idea/src/org/jetbrains/jet/plugin/quickfix/createFromUsage/callableBuilder/CallableBuilder.kt b/idea/src/org/jetbrains/jet/plugin/quickfix/createFromUsage/callableBuilder/CallableBuilder.kt index 1cff29e5bd1..51c0d1d8c78 100644 --- a/idea/src/org/jetbrains/jet/plugin/quickfix/createFromUsage/callableBuilder/CallableBuilder.kt +++ b/idea/src/org/jetbrains/jet/plugin/quickfix/createFromUsage/callableBuilder/CallableBuilder.kt @@ -57,6 +57,7 @@ import com.intellij.psi.PsiElement import org.jetbrains.jet.lexer.JetTokens import org.jetbrains.jet.plugin.quickfix.createFromUsage.createFunction import org.jetbrains.jet.plugin.util.application.runWriteAction +import org.jetbrains.jet.plugin.refactoring.isMultiLine private val TYPE_PARAMETER_LIST_VARIABLE_NAME = "typeParameterList" private val TEMPLATE_FROM_USAGE_FUNCTION_BODY = "New Kotlin Function Body.kt" @@ -256,9 +257,15 @@ class CallableBuilder(val config: CallableBuilderConfiguration) { } val newLine = psiFactory.createNewLine() - fun prepend(element: PsiElement, elementBeforeStart: PsiElement): PsiElement { + fun prepend(element: PsiElement, elementBeforeStart: PsiElement, skipInitial: Boolean): PsiElement { val parent = elementBeforeStart.getParent()!! - val anchor = PsiTreeUtil.skipSiblingsForward(elementBeforeStart, javaClass()) + val anchor = + if (!skipInitial && elementBeforeStart !is PsiWhiteSpace) { + elementBeforeStart + } + else { + PsiTreeUtil.skipSiblingsForward(elementBeforeStart, javaClass()) + } val addedElement = parent.addBefore(element, anchor)!! parent.addAfter(newLine, addedElement) parent.addAfter(newLine, addedElement) @@ -296,7 +303,18 @@ class CallableBuilder(val config: CallableBuilderConfiguration) { ?: append(declaration, classBody!!.getLastChild()!!, false)) as JetCallableDeclaration } - is JetBlockExpression -> return prepend(declaration, containingElement.getLBrace()!!) as JetCallableDeclaration + is JetBlockExpression -> { + val parent = containingElement.getParent() + if (parent is JetFunctionLiteral) { + if (!parent.isMultiLine()) { + parent.addBefore(newLine, containingElement) + parent.addAfter(newLine, containingElement) + } + + return prepend(declaration, containingElement.getFirstChild()!!, false) as JetCallableDeclaration + } + return prepend(declaration, containingElement.getLBrace()!!, true) as JetCallableDeclaration + } else -> throw AssertionError("Invalid containing element: ${containingElement.getText()}") } diff --git a/idea/testData/quickfix/createFromUsage/createVariable/localVariable/afterInLambdaNoParams.kt b/idea/testData/quickfix/createFromUsage/createVariable/localVariable/afterInLambdaNoParams.kt new file mode 100644 index 00000000000..19e96d3d4b6 --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createVariable/localVariable/afterInLambdaNoParams.kt @@ -0,0 +1,11 @@ +// "Create local variable 'foo'" "true" +// ACTION: Create parameter 'foo' +// ERROR: Variable 'foo' must be initialized + +fun test(n: Int) { + val f: () -> Int = { + val foo: Int + + foo + } +} \ No newline at end of file diff --git a/idea/testData/quickfix/createFromUsage/createVariable/localVariable/afterInLambdaWithParams.kt b/idea/testData/quickfix/createFromUsage/createVariable/localVariable/afterInLambdaWithParams.kt new file mode 100644 index 00000000000..bfe7386fa19 --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createVariable/localVariable/afterInLambdaWithParams.kt @@ -0,0 +1,11 @@ +// "Create local variable 'foo'" "true" +// ACTION: Create parameter 'foo' +// ERROR: Variable 'foo' must be initialized + +fun test(n: Int) { + val f: (Int, Int) -> Int = { (a, b) -> + val foo: Int + + foo + } +} \ No newline at end of file diff --git a/idea/testData/quickfix/createFromUsage/createVariable/localVariable/afterInMultiLineLambdaNoParams.kt b/idea/testData/quickfix/createFromUsage/createVariable/localVariable/afterInMultiLineLambdaNoParams.kt new file mode 100644 index 00000000000..19e96d3d4b6 --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createVariable/localVariable/afterInMultiLineLambdaNoParams.kt @@ -0,0 +1,11 @@ +// "Create local variable 'foo'" "true" +// ACTION: Create parameter 'foo' +// ERROR: Variable 'foo' must be initialized + +fun test(n: Int) { + val f: () -> Int = { + val foo: Int + + foo + } +} \ No newline at end of file diff --git a/idea/testData/quickfix/createFromUsage/createVariable/localVariable/afterInMultiLineLambdaWithParams.kt b/idea/testData/quickfix/createFromUsage/createVariable/localVariable/afterInMultiLineLambdaWithParams.kt new file mode 100644 index 00000000000..bfe7386fa19 --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createVariable/localVariable/afterInMultiLineLambdaWithParams.kt @@ -0,0 +1,11 @@ +// "Create local variable 'foo'" "true" +// ACTION: Create parameter 'foo' +// ERROR: Variable 'foo' must be initialized + +fun test(n: Int) { + val f: (Int, Int) -> Int = { (a, b) -> + val foo: Int + + foo + } +} \ No newline at end of file diff --git a/idea/testData/quickfix/createFromUsage/createVariable/localVariable/beforeInLambdaNoParams.kt b/idea/testData/quickfix/createFromUsage/createVariable/localVariable/beforeInLambdaNoParams.kt new file mode 100644 index 00000000000..4658d82edbc --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createVariable/localVariable/beforeInLambdaNoParams.kt @@ -0,0 +1,7 @@ +// "Create local variable 'foo'" "true" +// ACTION: Create parameter 'foo' +// ERROR: Variable 'foo' must be initialized + +fun test(n: Int) { + val f: () -> Int = { foo } +} \ No newline at end of file diff --git a/idea/testData/quickfix/createFromUsage/createVariable/localVariable/beforeInLambdaWithParams.kt b/idea/testData/quickfix/createFromUsage/createVariable/localVariable/beforeInLambdaWithParams.kt new file mode 100644 index 00000000000..08e56a6a8be --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createVariable/localVariable/beforeInLambdaWithParams.kt @@ -0,0 +1,7 @@ +// "Create local variable 'foo'" "true" +// ACTION: Create parameter 'foo' +// ERROR: Variable 'foo' must be initialized + +fun test(n: Int) { + val f: (Int, Int) -> Int = { (a, b) -> foo } +} \ No newline at end of file diff --git a/idea/testData/quickfix/createFromUsage/createVariable/localVariable/beforeInMultiLineLambdaNoParams.kt b/idea/testData/quickfix/createFromUsage/createVariable/localVariable/beforeInMultiLineLambdaNoParams.kt new file mode 100644 index 00000000000..1d6370a7e59 --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createVariable/localVariable/beforeInMultiLineLambdaNoParams.kt @@ -0,0 +1,9 @@ +// "Create local variable 'foo'" "true" +// ACTION: Create parameter 'foo' +// ERROR: Variable 'foo' must be initialized + +fun test(n: Int) { + val f: () -> Int = { + foo + } +} \ No newline at end of file diff --git a/idea/testData/quickfix/createFromUsage/createVariable/localVariable/beforeInMultiLineLambdaWithParams.kt b/idea/testData/quickfix/createFromUsage/createVariable/localVariable/beforeInMultiLineLambdaWithParams.kt new file mode 100644 index 00000000000..567980a7b5a --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createVariable/localVariable/beforeInMultiLineLambdaWithParams.kt @@ -0,0 +1,9 @@ +// "Create local variable 'foo'" "true" +// ACTION: Create parameter 'foo' +// ERROR: Variable 'foo' must be initialized + +fun test(n: Int) { + val f: (Int, Int) -> Int = { (a, b) -> + foo + } +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/jet/plugin/quickfix/QuickFixTestGenerated.java b/idea/tests/org/jetbrains/jet/plugin/quickfix/QuickFixTestGenerated.java index 409cad77819..11b08dc63c5 100644 --- a/idea/tests/org/jetbrains/jet/plugin/quickfix/QuickFixTestGenerated.java +++ b/idea/tests/org/jetbrains/jet/plugin/quickfix/QuickFixTestGenerated.java @@ -1209,6 +1209,30 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { doTest(fileName); } + @TestMetadata("beforeInLambdaNoParams.kt") + public void testInLambdaNoParams() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/createFromUsage/createVariable/localVariable/beforeInLambdaNoParams.kt"); + doTest(fileName); + } + + @TestMetadata("beforeInLambdaWithParams.kt") + public void testInLambdaWithParams() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/createFromUsage/createVariable/localVariable/beforeInLambdaWithParams.kt"); + doTest(fileName); + } + + @TestMetadata("beforeInMultiLineLambdaNoParams.kt") + public void testInMultiLineLambdaNoParams() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/createFromUsage/createVariable/localVariable/beforeInMultiLineLambdaNoParams.kt"); + doTest(fileName); + } + + @TestMetadata("beforeInMultiLineLambdaWithParams.kt") + public void testInMultiLineLambdaWithParams() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/createFromUsage/createVariable/localVariable/beforeInMultiLineLambdaWithParams.kt"); + doTest(fileName); + } + @TestMetadata("beforeInWhen.kt") public void testInWhen() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/createFromUsage/createVariable/localVariable/beforeInWhen.kt");