From 02e876679cd9cfc6abe1cbc5cf051f7f192c8b65 Mon Sep 17 00:00:00 2001 From: Valentin Kipyatkov Date: Thu, 4 Jun 2015 19:47:19 +0300 Subject: [PATCH] Completion: more correct code for lambda template insertion --- .../handlers/KotlinFunctionInsertHandler.kt | 9 +++++++-- .../highOrderFunctions/WithArgsEmptyLambdaAfter.kt | 8 ++++++++ .../WithArgsEmptyLambdaAfter.kt.after | 8 ++++++++ .../WithArgsNonEmptyLambdaAfter.kt | 8 ++++++++ .../WithArgsNonEmptyLambdaAfter.kt.after | 8 ++++++++ .../BasicCompletionHandlerTestGenerated.java | 12 ++++++++++++ 6 files changed, 51 insertions(+), 2 deletions(-) create mode 100644 idea/idea-completion/testData/handlers/basic/highOrderFunctions/WithArgsEmptyLambdaAfter.kt create mode 100644 idea/idea-completion/testData/handlers/basic/highOrderFunctions/WithArgsEmptyLambdaAfter.kt.after create mode 100644 idea/idea-completion/testData/handlers/basic/highOrderFunctions/WithArgsNonEmptyLambdaAfter.kt create mode 100644 idea/idea-completion/testData/handlers/basic/highOrderFunctions/WithArgsNonEmptyLambdaAfter.kt.after diff --git a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/handlers/KotlinFunctionInsertHandler.kt b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/handlers/KotlinFunctionInsertHandler.kt index 99979d15f52..dd81d8f4e94 100644 --- a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/handlers/KotlinFunctionInsertHandler.kt +++ b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/handlers/KotlinFunctionInsertHandler.kt @@ -114,7 +114,13 @@ class KotlinFunctionInsertHandler(val caretPosition: CaretPosition, val lambdaIn } var openingBracketOffset = chars.indexOfSkippingSpace(openingBracket, offset) + var closeBracketOffset = openingBracketOffset?.let { chars.indexOfSkippingSpace(closingBracket, it + 1) } var inBracketsShift = 0 + + if (insertLambda && lambdaInfo!!.explicitParameters && closeBracketOffset == null) { + openingBracketOffset = null + } + if (openingBracketOffset == null) { if (insertLambda) { if (completionChar == ' ' || completionChar == '{') { @@ -135,10 +141,9 @@ class KotlinFunctionInsertHandler(val caretPosition: CaretPosition, val lambdaIn PsiDocumentManager.getInstance(context.getProject()).commitDocument(document) openingBracketOffset = chars.indexOfSkippingSpace(openingBracket, offset)!! + closeBracketOffset = chars.indexOfSkippingSpace(closingBracket, openingBracketOffset + 1)!! } - val closeBracketOffset = chars.indexOfSkippingSpace(closingBracket, openingBracketOffset + 1) - val editor = context.getEditor() if (shouldPlaceCaretInBrackets(completionChar) || closeBracketOffset == null) { editor.getCaretModel().moveToOffset(openingBracketOffset + 1 + inBracketsShift) diff --git a/idea/idea-completion/testData/handlers/basic/highOrderFunctions/WithArgsEmptyLambdaAfter.kt b/idea/idea-completion/testData/handlers/basic/highOrderFunctions/WithArgsEmptyLambdaAfter.kt new file mode 100644 index 00000000000..327a06bba0f --- /dev/null +++ b/idea/idea-completion/testData/handlers/basic/highOrderFunctions/WithArgsEmptyLambdaAfter.kt @@ -0,0 +1,8 @@ +fun foo(p : (String, Char) -> Boolean){} + +fun main(args: Array) { + fo{ } +} + +// ELEMENT: foo +// TAIL_TEXT: " { String, Char -> ... } ()" diff --git a/idea/idea-completion/testData/handlers/basic/highOrderFunctions/WithArgsEmptyLambdaAfter.kt.after b/idea/idea-completion/testData/handlers/basic/highOrderFunctions/WithArgsEmptyLambdaAfter.kt.after new file mode 100644 index 00000000000..42a9678079b --- /dev/null +++ b/idea/idea-completion/testData/handlers/basic/highOrderFunctions/WithArgsEmptyLambdaAfter.kt.after @@ -0,0 +1,8 @@ +fun foo(p : (String, Char) -> Boolean){} + +fun main(args: Array) { + foo{ s, c -> } +} + +// ELEMENT: foo +// TAIL_TEXT: " { String, Char -> ... } ()" diff --git a/idea/idea-completion/testData/handlers/basic/highOrderFunctions/WithArgsNonEmptyLambdaAfter.kt b/idea/idea-completion/testData/handlers/basic/highOrderFunctions/WithArgsNonEmptyLambdaAfter.kt new file mode 100644 index 00000000000..880d6e96240 --- /dev/null +++ b/idea/idea-completion/testData/handlers/basic/highOrderFunctions/WithArgsNonEmptyLambdaAfter.kt @@ -0,0 +1,8 @@ +fun foo(p : (String, Char) -> Boolean){} + +fun main(args: Array) { + fo{ x } +} + +// ELEMENT: foo +// TAIL_TEXT: " { String, Char -> ... } ()" diff --git a/idea/idea-completion/testData/handlers/basic/highOrderFunctions/WithArgsNonEmptyLambdaAfter.kt.after b/idea/idea-completion/testData/handlers/basic/highOrderFunctions/WithArgsNonEmptyLambdaAfter.kt.after new file mode 100644 index 00000000000..ecb94d95e39 --- /dev/null +++ b/idea/idea-completion/testData/handlers/basic/highOrderFunctions/WithArgsNonEmptyLambdaAfter.kt.after @@ -0,0 +1,8 @@ +fun foo(p : (String, Char) -> Boolean){} + +fun main(args: Array) { + foo { s, c -> }{ x } +} + +// ELEMENT: foo +// TAIL_TEXT: " { String, Char -> ... } ()" diff --git a/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/handlers/BasicCompletionHandlerTestGenerated.java b/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/handlers/BasicCompletionHandlerTestGenerated.java index 90ca98858d6..9fdb38f9459 100644 --- a/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/handlers/BasicCompletionHandlerTestGenerated.java +++ b/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/handlers/BasicCompletionHandlerTestGenerated.java @@ -225,6 +225,18 @@ public class BasicCompletionHandlerTestGenerated extends AbstractBasicCompletion String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/handlers/basic/highOrderFunctions/ReplaceByLambdaTemplateNoClosingParenth.kt"); doTest(fileName); } + + @TestMetadata("WithArgsEmptyLambdaAfter.kt") + public void testWithArgsEmptyLambdaAfter() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/handlers/basic/highOrderFunctions/WithArgsEmptyLambdaAfter.kt"); + doTest(fileName); + } + + @TestMetadata("WithArgsNonEmptyLambdaAfter.kt") + public void testWithArgsNonEmptyLambdaAfter() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/handlers/basic/highOrderFunctions/WithArgsNonEmptyLambdaAfter.kt"); + doTest(fileName); + } } @TestMetadata("idea/idea-completion/testData/handlers/basic/stringTemplate")