From b9a62d0acf3946685d5c7f4f10d378536bf4d923 Mon Sep 17 00:00:00 2001 From: Valentin Kipyatkov Date: Thu, 23 Jul 2015 22:46:17 +0300 Subject: [PATCH] Fixed parameter name&type auto-popup completion to insert "dynamic" on typing ": " --- .../idea/completion/BasicCompletionSession.kt | 10 ++++++++-- .../idea/completion/KotlinCompletionCharFilter.kt | 10 +++++++--- .../idea/completion/LookupElementsCollector.kt | 13 +++++++++---- 3 files changed, 24 insertions(+), 9 deletions(-) diff --git a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/BasicCompletionSession.kt b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/BasicCompletionSession.kt index c5262d5ff28..295f1161444 100644 --- a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/BasicCompletionSession.kt +++ b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/BasicCompletionSession.kt @@ -16,7 +16,9 @@ package org.jetbrains.kotlin.idea.completion -import com.intellij.codeInsight.completion.* +import com.intellij.codeInsight.completion.CompletionParameters +import com.intellij.codeInsight.completion.CompletionResultSet +import com.intellij.codeInsight.completion.CompletionType import com.intellij.patterns.PatternCondition import com.intellij.patterns.StandardPatterns import com.intellij.psi.JavaPsiFacade @@ -160,7 +162,11 @@ class BasicCompletionSession(configuration: CompletionSessionConfiguration, } if (completionKind == CompletionKind.PARAMETER_NAME || completionKind == CompletionKind.ANNOTATION_TYPES_OR_PARAMETER_NAME) { - collector.suppressItemSelectionByCharsOnTyping = true + collector.addLookupElementPostProcessor { lookupElement -> + lookupElement.putUserData(KotlinCompletionCharFilter.SUPPRESS_ITEM_SELECTION_BY_CHARS_ON_TYPING, Unit) + lookupElement.putUserData(KotlinCompletionCharFilter.HIDE_LOOKUP_ON_COLON, Unit) + lookupElement + } } if (completionKind != CompletionKind.NAMED_ARGUMENTS_ONLY) { 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 edaf11912f5..51e916a38c6 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,9 +32,10 @@ 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_OPENING_BRACE") public val SUPPRESS_ITEM_SELECTION_BY_CHARS_ON_TYPING: Key = Key("KotlinCompletionCharFilter.SUPPRESS_ITEM_SELECTION_BY_CHARS_ON_TYPING") + public val HIDE_LOOKUP_ON_COLON: Key = Key("KotlinCompletionCharFilter.HIDE_LOOKUP_ON_COLON") public val JUST_TYPING_PREFIX: Key = Key("KotlinCompletionCharFilter.JUST_TYPING_PREFIX") } @@ -59,8 +60,11 @@ public class KotlinCompletionCharFilter() : CharFilter() { return Result.HIDE_LOOKUP } - if (c == ':' /* used in '::xxx'*/) { - return CharFilter.Result.ADD_TO_PREFIX + if (c == ':') { + return when { + currentItem?.getUserData(HIDE_LOOKUP_ON_COLON) != null -> Result.HIDE_LOOKUP + else -> CharFilter.Result.ADD_TO_PREFIX /* used in '::xxx'*/ + } } if (!lookup.isSelectionTouched()) { 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 d69cc0df920..901ef836a11 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 @@ -54,6 +54,8 @@ class LookupElementsCollector( .withPrefixMatcher(defaultPrefixMatcher) .addKotlinSorting(completionParameters) + private val postProcessors = ArrayList<(LookupElement) -> LookupElement>() + public fun flushToResultSet() { if (!elements.isEmpty()) { for ((prefixMatcher, elements) in elements) { @@ -71,7 +73,9 @@ class LookupElementsCollector( public var isResultEmpty: Boolean = true private set - public var suppressItemSelectionByCharsOnTyping: Boolean = false + public fun addLookupElementPostProcessor(processor: (LookupElement) -> LookupElement) { + postProcessors.add(processor) + } public fun addDescriptorElements(descriptors: Iterable, suppressAutoInsertion: Boolean, // auto-insertion suppression is used for elements that require adding an import @@ -178,11 +182,12 @@ class LookupElementsCollector( } } - if (suppressItemSelectionByCharsOnTyping) { - decorated.putUserData(KotlinCompletionCharFilter.SUPPRESS_ITEM_SELECTION_BY_CHARS_ON_TYPING, Unit) + var result: LookupElement = decorated + for (postProcessor in postProcessors) { + result = postProcessor(result) } - elements.getOrPut(prefixMatcher) { ArrayList() }.add(decorated) + elements.getOrPut(prefixMatcher) { ArrayList() }.add(result) } }