From 7f55c0626febafb80f0f92c1765fae4e5b3ca990 Mon Sep 17 00:00:00 2001 From: Valentin Kipyatkov Date: Mon, 20 Oct 2014 19:25:55 +0400 Subject: [PATCH] Fixed KT-6033 Smart completion: wrong replacement range by Tab for item with all arguments at once #KT-6033 Fixed --- .../plugin/completion/KotlinCompletionContributor.kt | 8 ++++++++ .../completion/smart/MultipleArgumentsItemProvider.kt | 10 ++++++++++ .../jet/plugin/completion/smart/SmartCompletion.kt | 1 + .../completion/handlers/smart/MultipleArgsItemByTab.kt | 8 ++++++++ .../handlers/smart/MultipleArgsItemByTab.kt.after | 8 ++++++++ 5 files changed, 35 insertions(+) create mode 100644 idea/testData/completion/handlers/smart/MultipleArgsItemByTab.kt create mode 100644 idea/testData/completion/handlers/smart/MultipleArgsItemByTab.kt.after diff --git a/idea/src/org/jetbrains/jet/plugin/completion/KotlinCompletionContributor.kt b/idea/src/org/jetbrains/jet/plugin/completion/KotlinCompletionContributor.kt index 5303ff8580f..358612fe10a 100644 --- a/idea/src/org/jetbrains/jet/plugin/completion/KotlinCompletionContributor.kt +++ b/idea/src/org/jetbrains/jet/plugin/completion/KotlinCompletionContributor.kt @@ -43,6 +43,8 @@ import org.jetbrains.jet.lang.psi.JetPsiFactory import com.intellij.psi.PsiErrorElement import com.intellij.psi.search.PsiElementProcessor import com.intellij.psi.PsiComment +import org.jetbrains.jet.lang.psi.JetValueArgument +import org.jetbrains.jet.lang.psi.JetValueArgumentList public class KotlinCompletionContributor : CompletionContributor() { @@ -106,6 +108,12 @@ public class KotlinCompletionContributor : CompletionContributor() { } context.getOffsetMap().addOffset(SmartCompletion.OLD_ARGUMENTS_REPLACEMENT_OFFSET, expressionEnd) + + val argumentList = (expression.getParent() as? JetValueArgument)?.getParent() as? JetValueArgumentList + if (argumentList != null) { + context.getOffsetMap().addOffset(SmartCompletion.MULTIPLE_ARGUMENTS_REPLACEMENT_OFFSET, + argumentList.getRightParenthesis()?.getTextRange()?.getStartOffset() ?: argumentList.getTextRange().getEndOffset()) + } } } } diff --git a/idea/src/org/jetbrains/jet/plugin/completion/smart/MultipleArgumentsItemProvider.kt b/idea/src/org/jetbrains/jet/plugin/completion/smart/MultipleArgumentsItemProvider.kt index 64c56bb3ce2..afd11d3bba6 100644 --- a/idea/src/org/jetbrains/jet/plugin/completion/smart/MultipleArgumentsItemProvider.kt +++ b/idea/src/org/jetbrains/jet/plugin/completion/smart/MultipleArgumentsItemProvider.kt @@ -36,6 +36,7 @@ import org.jetbrains.jet.plugin.completion.PositionalArgumentExpectedInfo import java.util.ArrayList import org.jetbrains.jet.plugin.util.IdeDescriptorRenderers import org.jetbrains.jet.plugin.completion.assignPriority +import com.intellij.codeInsight.lookup.Lookup class MultipleArgumentsItemProvider(val bindingContext: BindingContext, val typesWithAutoCasts: (DeclarationDescriptor) -> Iterable) { @@ -76,6 +77,15 @@ class MultipleArgumentsItemProvider(val bindingContext: BindingContext, return LookupElementBuilder .create(variables.map { IdeDescriptorRenderers.SOURCE_CODE.renderName(it.getName()) }.joinToString(", ")) + .withInsertHandler { (context, lookupElement) -> + if (context.getCompletionChar() == Lookup.REPLACE_SELECT_CHAR) { + val offset = context.getOffsetMap().getOffset(SmartCompletion.MULTIPLE_ARGUMENTS_REPLACEMENT_OFFSET) + if (offset != -1) { + context.getDocument().deleteString(context.getTailOffset(), offset) + } + } + + } .withIcon(compoundIcon) .addTail(Tail.RPARENTH) //TODO: support square brackets .assignPriority(ItemPriority.MULTIPLE_ARGUMENTS_ITEM) diff --git a/idea/src/org/jetbrains/jet/plugin/completion/smart/SmartCompletion.kt b/idea/src/org/jetbrains/jet/plugin/completion/smart/SmartCompletion.kt index 75e3356c5fc..6e481905158 100644 --- a/idea/src/org/jetbrains/jet/plugin/completion/smart/SmartCompletion.kt +++ b/idea/src/org/jetbrains/jet/plugin/completion/smart/SmartCompletion.kt @@ -324,5 +324,6 @@ class SmartCompletion(val expression: JetSimpleNameExpression, class object { public val OLD_ARGUMENTS_REPLACEMENT_OFFSET: OffsetKey = OffsetKey.create("nonFunctionReplacementOffset") + public val MULTIPLE_ARGUMENTS_REPLACEMENT_OFFSET: OffsetKey = OffsetKey.create("multipleArgumentsReplacementOffset") } } diff --git a/idea/testData/completion/handlers/smart/MultipleArgsItemByTab.kt b/idea/testData/completion/handlers/smart/MultipleArgsItemByTab.kt new file mode 100644 index 00000000000..8530fa87c31 --- /dev/null +++ b/idea/testData/completion/handlers/smart/MultipleArgsItemByTab.kt @@ -0,0 +1,8 @@ +fun foo(a: Int, b: String, c: String) {} + +fun bar(b: String, a: Int, c: String) { + foo(1, "", "") +} + +// ELEMENT: "a, b, c" +// CHAR: \t diff --git a/idea/testData/completion/handlers/smart/MultipleArgsItemByTab.kt.after b/idea/testData/completion/handlers/smart/MultipleArgsItemByTab.kt.after new file mode 100644 index 00000000000..066656881c9 --- /dev/null +++ b/idea/testData/completion/handlers/smart/MultipleArgsItemByTab.kt.after @@ -0,0 +1,8 @@ +fun foo(a: Int, b: String, c: String) {} + +fun bar(b: String, a: Int, c: String) { + foo(a, b, c) +} + +// ELEMENT: "a, b, c" +// CHAR: \t