diff --git a/platform/lang-impl/src/com/intellij/codeInsight/completion/command/CommandCompletionProvider.kt b/platform/lang-impl/src/com/intellij/codeInsight/completion/command/CommandCompletionProvider.kt index 7884d5d2da1e..693963e10406 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/completion/command/CommandCompletionProvider.kt +++ b/platform/lang-impl/src/com/intellij/codeInsight/completion/command/CommandCompletionProvider.kt @@ -175,11 +175,9 @@ internal class CommandCompletionProvider(val contributor: CommandCompletionContr val prefix = commandCompletionType.pattern val sorter = createSorter(parameters) - val matcher = LimitedToleranceMatcher(prefix) - val withPrefixMatcher = resultSet.withPrefixMatcher(matcher) - .withRelevanceSorter(sorter) + val withRelevanceSorter = resultSet.withRelevanceSorter(sorter) - withPrefixMatcher.restartCompletionOnPrefixChange( + resultSet.restartCompletionOnPrefixChange( StandardPatterns.string().with(object : PatternCondition("add filter for command completion") { override fun accepts(t: String, context: ProcessingContext?): Boolean { return (!isReadOnly && commandCompletionType.suffix + t == @@ -199,6 +197,7 @@ internal class CommandCompletionProvider(val contributor: CommandCompletionContr isReadOnly = isReadOnly, isInjected = isInjected, commandCompletionType = commandCompletionType) { commands -> + val baseMatcher = CamelHumpMatcher(prefix, false, true) commands.forEach { command -> ProgressManager.checkCanceled() CommandCompletionCollector.shown(command::class.java, originalFile.language, commandCompletionType::class.java) @@ -213,9 +212,11 @@ internal class CommandCompletionProvider(val contributor: CommandCompletionContr } else { for (element in lookupElements) { - if (!matcher.basePrefixMatches(element)) continue + if (!baseMatcher.prefixMatches(element)) continue + val commandCompletionElement = element.`as`(CommandCompletionLookupElement::class.java)!! + val matcher = LimitedToleranceMatcher(prefix, commandCompletionElement.currentTags, commandCompletionElement.otherTags) element.putUserData(SHOULD_NOT_CHECK_WHEN_WRAP, true) - withPrefixMatcher.addElement(element) + withRelevanceSorter.withPrefixMatcher(matcher).addElement(element) } } } @@ -645,23 +646,20 @@ internal fun findCommandCompletionType( return null } -private class LimitedToleranceMatcher(prefix: String) : CamelHumpMatcher(prefix, false, true) { - - fun basePrefixMatches(element: LookupElement): Boolean { - return super.prefixMatches(element) - } +private class LimitedToleranceMatcher( + prefix: String, + private val currentTags: List, + private val otherTags: List +) : CamelHumpMatcher(prefix, false, true) { override fun prefixMatches(element: LookupElement): Boolean { if (!super.prefixMatches(element)) return false - val commandCompletionElement = element.`as`(CommandCompletionLookupElement::class.java) ?: return false - val currentTags = commandCompletionElement.currentTags - val allLookupStrings = currentTags.ifEmpty { element.allLookupStrings } + val allLookupStrings = this.currentTags.ifEmpty { element.allLookupStrings } if (!matched(allLookupStrings)) return false - val otherTags = commandCompletionElement.otherTags - if (otherTags.isEmpty()) return true - val indexOfFirst = otherTags.indexOfFirst { allLookupStrings.contains(it) } + if (this.otherTags.isEmpty()) return true + val indexOfFirst = this.otherTags.indexOfFirst { allLookupStrings.contains(it) } if (indexOfFirst <= 0) return true - if (matched(otherTags.subList(0, indexOfFirst))) return false + if (matched(this.otherTags.subList(0, indexOfFirst))) return false return true } @@ -693,7 +691,7 @@ private class LimitedToleranceMatcher(prefix: String) : CamelHumpMatcher(prefix, if (prefix == this.prefix) { return this } - return LimitedToleranceMatcher(prefix) + return LimitedToleranceMatcher(prefix, currentTags, otherTags) } }