[java-completion] IDEA-359174 first draft of command completion

- fix corner cases

GitOrigin-RevId: 27b68684d1c9671e01aa88dd50b7050d8b53c932
This commit is contained in:
Mikhail Pyltsin
2024-11-19 10:44:09 +00:00
committed by intellij-monorepo-bot
parent 0f9badce9a
commit 691b94da97
2 changed files with 9 additions and 6 deletions
@@ -2,8 +2,8 @@
package com.intellij.codeInsight.completion.commands.core
import com.intellij.codeInsight.completion.*
import com.intellij.codeInsight.completion.commands.api.CompletionCommand
import com.intellij.codeInsight.completion.commands.api.CommandCompletionFactory
import com.intellij.codeInsight.completion.commands.api.CompletionCommand
import com.intellij.codeInsight.completion.impl.CamelHumpMatcher
import com.intellij.codeInsight.completion.ml.MLWeigherUtil
import com.intellij.codeInsight.lookup.LookupElement
@@ -23,7 +23,6 @@ import com.intellij.openapi.util.registry.Registry
import com.intellij.openapi.util.text.StringUtil
import com.intellij.patterns.PatternCondition
import com.intellij.patterns.StandardPatterns
import com.intellij.psi.PsiDocumentManager
import com.intellij.psi.PsiFile
import com.intellij.psi.PsiFileFactory
import com.intellij.testFramework.LightVirtualFile
@@ -43,7 +42,7 @@ internal class CommandCompletionProvider : CompletionProvider<CompletionParamete
context: ProcessingContext,
resultSet: CompletionResultSet,
) {
if(!Registry.`is`("java.completion.command.enabled")) return
if (!Registry.`is`("java.completion.command.enabled")) return
resultSet.runRemainingContributors(parameters) {
resultSet.passResult(it)
}
@@ -230,7 +229,7 @@ internal sealed interface InvocationCommandType {
internal fun findActualIndex(suffix: String, text: CharSequence, offset: Int): Int {
var indexOf = suffix.length
if (offset > text.length || offset == 0) return 0
while (indexOf > 0 && text.substring(offset - indexOf, offset) != suffix.substring(0, indexOf)) {
while (indexOf > 0 && offset - indexOf >= 0 && text.substring(offset - indexOf, offset) != suffix.substring(0, indexOf)) {
indexOf--
}
//try to find outside
@@ -78,9 +78,13 @@ class CommandCompletionService(
val language = lookup.psiFile?.language ?: return
val completionFactory = getFactory(language)
val filterSuffix = completionFactory?.filterSuffix() ?: return
val index = findActualIndex(completionFactory.suffix() + filterSuffix.toString(), lookup.editor.document.immutableCharSequence, lookup.lookupOriginalStart)
val fullSuffix = completionFactory.suffix() + filterSuffix.toString()
val index = findActualIndex(fullSuffix, lookup.editor.document.immutableCharSequence, lookup.lookupOriginalStart)
if (index == 0) return
if (lookup.lookupOriginalStart - index + 1 < lookup.editor.document.textLength && lookup.editor.document.immutableCharSequence[lookup.lookupOriginalStart - index + 1] != filterSuffix) return
val offsetOfFullIndex = lookup.lookupOriginalStart - index
if (offsetOfFullIndex < 0 ||
offsetOfFullIndex >= lookup.editor.document.textLength ||
lookup.editor.document.immutableCharSequence.substring(offsetOfFullIndex) != fullSuffix) return
lookup.putUserData(INSTALLED_ADDITIONAL_MATCHER_KEY, true)
lookup.arranger.registerAdditionalMatcher(CommandCompletionLookupItemFilter)
lookup.arranger.prefixChanged(lookup);