From 22ad1389f511ae37ef08063687c606a75bb5b971 Mon Sep 17 00:00:00 2001 From: Valentin Kipyatkov Date: Wed, 17 Jun 2015 21:26:57 +0300 Subject: [PATCH] Parameter name completion: no insertion on just typing --- .../kotlin/idea/completion/CompletionSession.kt | 4 ++++ .../idea/completion/KotlinCompletionCharFilter.kt | 14 +++++++++----- .../kotlin/idea/completion/LookupElementFactory.kt | 2 +- .../idea/completion/LookupElementsCollector.kt | 14 ++++++++++---- .../completion/smart/TypeInstantiationItems.kt | 2 +- .../NoInsertionOnTypingColon.kt | 7 +++++++ .../NoInsertionOnTypingColon.kt.after | 7 +++++++ .../NoInsertionOnTypingSpace.kt | 7 +++++++ .../NoInsertionOnTypingSpace.kt.after | 7 +++++++ .../BasicCompletionHandlerTestGenerated.java | 12 ++++++++++++ 10 files changed, 65 insertions(+), 11 deletions(-) create mode 100644 idea/idea-completion/testData/handlers/basic/parameterNameAndType/NoInsertionOnTypingColon.kt create mode 100644 idea/idea-completion/testData/handlers/basic/parameterNameAndType/NoInsertionOnTypingColon.kt.after create mode 100644 idea/idea-completion/testData/handlers/basic/parameterNameAndType/NoInsertionOnTypingSpace.kt create mode 100644 idea/idea-completion/testData/handlers/basic/parameterNameAndType/NoInsertionOnTypingSpace.kt.after diff --git a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/CompletionSession.kt b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/CompletionSession.kt index 693059d2dac..24bbb286a7a 100644 --- a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/CompletionSession.kt +++ b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/CompletionSession.kt @@ -351,6 +351,10 @@ class BasicCompletionSession(configuration: CompletionSessionConfiguration, override fun doComplete() { assert(parameters.getCompletionType() == CompletionType.BASIC) + if (completionKind == CompletionKind.PARAMETER_NAME || completionKind == CompletionKind.ANNOTATION_TYPES_OR_PARAMETER_NAME) { + collector.suppressItemSelectionByCharsOnTyping = true + } + if (completionKind != CompletionKind.NAMED_ARGUMENTS_ONLY) { collector.addDescriptorElements(referenceVariants, suppressAutoInsertion = false) diff --git a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/KotlinCompletionCharFilter.kt b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/KotlinCompletionCharFilter.kt index c7741fc25cc..edaf11912f5 100644 --- a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/KotlinCompletionCharFilter.kt +++ b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/KotlinCompletionCharFilter.kt @@ -32,7 +32,9 @@ import org.jetbrains.kotlin.psi.psiUtil.prevLeaf public class KotlinCompletionCharFilter() : CharFilter() { companion object { - public val ACCEPT_OPENING_BRACE: Key = Key("KotlinCompletionCharFilter.ACCEPT_OPENNING_BRACE") + public val ACCEPT_OPENING_BRACE: Key = Key("KotlinCompletionCharFilter.ACCEPT_OPENNING_BRACE") + + public val SUPPRESS_ITEM_SELECTION_BY_CHARS_ON_TYPING: Key = Key("KotlinCompletionCharFilter.SUPPRESS_ITEM_SELECTION_BY_CHARS_ON_TYPING") public val JUST_TYPING_PREFIX: Key = Key("KotlinCompletionCharFilter.JUST_TYPING_PREFIX") } @@ -49,8 +51,11 @@ public class KotlinCompletionCharFilter() : CharFilter() { return CharFilter.Result.ADD_TO_PREFIX } - // do not accept items by special chars in the very beginning of function literal where name of the first parameter can be - if (isAutopopup && !lookup.isSelectionTouched() && isInFunctionLiteralStart(completionParameters.getPosition())) { + val currentItem = lookup.getCurrentItem() + + // do not accept items by special chars in some special positions such as in the very beginning of function literal where name of the first parameter can be + if (isAutopopup && !lookup.isSelectionTouched() + && (currentItem?.getUserData(SUPPRESS_ITEM_SELECTION_BY_CHARS_ON_TYPING) != null || isInFunctionLiteralStart(completionParameters.getPosition()))) { return Result.HIDE_LOOKUP } @@ -58,7 +63,6 @@ public class KotlinCompletionCharFilter() : CharFilter() { return CharFilter.Result.ADD_TO_PREFIX } - val currentItem = lookup.getCurrentItem() if (!lookup.isSelectionTouched()) { currentItem?.putUserData(JUST_TYPING_PREFIX, lookup.itemPattern(currentItem)) } @@ -75,7 +79,7 @@ public class KotlinCompletionCharFilter() : CharFilter() { } '{' -> { - if (currentItem != null && currentItem.getUserData(ACCEPT_OPENING_BRACE) ?: false) + if (currentItem != null && currentItem.getUserData(ACCEPT_OPENING_BRACE) != null) Result.SELECT_ITEM_AND_FINISH_LOOKUP else Result.HIDE_LOOKUP diff --git a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/LookupElementFactory.kt b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/LookupElementFactory.kt index ec8330cf13b..da833432343 100644 --- a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/LookupElementFactory.kt +++ b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/LookupElementFactory.kt @@ -207,7 +207,7 @@ public class LookupElementFactory( element = element.withInsertHandler(insertHandler) if (insertHandler is KotlinFunctionInsertHandler && insertHandler.lambdaInfo != null) { - element.putUserData(KotlinCompletionCharFilter.ACCEPT_OPENING_BRACE, true) + element.putUserData(KotlinCompletionCharFilter.ACCEPT_OPENING_BRACE, Unit) } return element diff --git a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/LookupElementsCollector.kt b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/LookupElementsCollector.kt index 1ed9f088b3f..551777abb4d 100644 --- a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/LookupElementsCollector.kt +++ b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/LookupElementsCollector.kt @@ -42,8 +42,8 @@ class LookupElementsCollector( private val context: LookupElementsCollector.Context ) { public enum class Context { - NORMAL - STRING_TEMPLATE_AFTER_DOLLAR + NORMAL, + STRING_TEMPLATE_AFTER_DOLLAR, INFIX_CALL } @@ -60,6 +60,8 @@ class LookupElementsCollector( public var isResultEmpty: Boolean = true private set + public var suppressItemSelectionByCharsOnTyping: Boolean = false + public fun addDescriptorElements(descriptors: Iterable, suppressAutoInsertion: Boolean, // auto-insertion suppression is used for elements that require adding an import withReceiverCast: Boolean = false @@ -137,7 +139,7 @@ class LookupElementsCollector( public fun addElement(element: LookupElement) { if (prefixMatcher.prefixMatches(element)) { - elements.add(object: LookupElementDecorator(element) { + val decorated = object : LookupElementDecorator(element) { override fun handleInsert(context: InsertionContext) { getDelegate().handleInsert(context) @@ -155,7 +157,11 @@ class LookupElementsCollector( } } - }) + } + if (suppressItemSelectionByCharsOnTyping) { + decorated.putUserData(KotlinCompletionCharFilter.SUPPRESS_ITEM_SELECTION_BY_CHARS_ON_TYPING, Unit) + } + elements.add(decorated) } } diff --git a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/smart/TypeInstantiationItems.kt b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/smart/TypeInstantiationItems.kt index 88a2f3d3454..23d3e9f76c0 100644 --- a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/smart/TypeInstantiationItems.kt +++ b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/smart/TypeInstantiationItems.kt @@ -200,7 +200,7 @@ class TypeInstantiationItems( lookupElement = lookupElement.keepOldArgumentListOnTab() } if (baseInsertHandler.lambdaInfo != null) { - lookupElement.putUserData(KotlinCompletionCharFilter.ACCEPT_OPENING_BRACE, true) + lookupElement.putUserData(KotlinCompletionCharFilter.ACCEPT_OPENING_BRACE, Unit) } lookupElement = lookupElement.assignSmartCompletionPriority(SmartCompletionItemPriority.INSTANTIATION) } diff --git a/idea/idea-completion/testData/handlers/basic/parameterNameAndType/NoInsertionOnTypingColon.kt b/idea/idea-completion/testData/handlers/basic/parameterNameAndType/NoInsertionOnTypingColon.kt new file mode 100644 index 00000000000..e26c1b8d55a --- /dev/null +++ b/idea/idea-completion/testData/handlers/basic/parameterNameAndType/NoInsertionOnTypingColon.kt @@ -0,0 +1,7 @@ +class FooBar + +fun f(foo) + +// ELEMENT: * +// INVOCATION_COUNT: 0 +// CHAR: ':' diff --git a/idea/idea-completion/testData/handlers/basic/parameterNameAndType/NoInsertionOnTypingColon.kt.after b/idea/idea-completion/testData/handlers/basic/parameterNameAndType/NoInsertionOnTypingColon.kt.after new file mode 100644 index 00000000000..137365089f5 --- /dev/null +++ b/idea/idea-completion/testData/handlers/basic/parameterNameAndType/NoInsertionOnTypingColon.kt.after @@ -0,0 +1,7 @@ +class FooBar + +fun f(foo:) + +// ELEMENT: * +// INVOCATION_COUNT: 0 +// CHAR: ':' diff --git a/idea/idea-completion/testData/handlers/basic/parameterNameAndType/NoInsertionOnTypingSpace.kt b/idea/idea-completion/testData/handlers/basic/parameterNameAndType/NoInsertionOnTypingSpace.kt new file mode 100644 index 00000000000..515b759a059 --- /dev/null +++ b/idea/idea-completion/testData/handlers/basic/parameterNameAndType/NoInsertionOnTypingSpace.kt @@ -0,0 +1,7 @@ +class FooBar + +fun f(foo) + +// ELEMENT: * +// INVOCATION_COUNT: 0 +// CHAR: ' ' diff --git a/idea/idea-completion/testData/handlers/basic/parameterNameAndType/NoInsertionOnTypingSpace.kt.after b/idea/idea-completion/testData/handlers/basic/parameterNameAndType/NoInsertionOnTypingSpace.kt.after new file mode 100644 index 00000000000..d0e16d99f03 --- /dev/null +++ b/idea/idea-completion/testData/handlers/basic/parameterNameAndType/NoInsertionOnTypingSpace.kt.after @@ -0,0 +1,7 @@ +class FooBar + +fun f(foo ) + +// ELEMENT: * +// INVOCATION_COUNT: 0 +// 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 5740ee686ab..1e67ffe60c5 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 @@ -265,6 +265,18 @@ public class BasicCompletionHandlerTestGenerated extends AbstractBasicCompletion doTest(fileName); } + @TestMetadata("NoInsertionOnTypingColon.kt") + public void testNoInsertionOnTypingColon() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/handlers/basic/parameterNameAndType/NoInsertionOnTypingColon.kt"); + doTest(fileName); + } + + @TestMetadata("NoInsertionOnTypingSpace.kt") + public void testNoInsertionOnTypingSpace() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/handlers/basic/parameterNameAndType/NoInsertionOnTypingSpace.kt"); + doTest(fileName); + } + @TestMetadata("Simple.kt") public void testSimple() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/handlers/basic/parameterNameAndType/Simple.kt");