diff --git a/plugins/gradle/BUILD.bazel b/plugins/gradle/BUILD.bazel index 73469ab1c1f7..19e549c868c6 100644 --- a/plugins/gradle/BUILD.bazel +++ b/plugins/gradle/BUILD.bazel @@ -80,6 +80,7 @@ jvm_library( "//platform/forms_rt:java-guiForms-rt", "//libraries/jspecify", "//plugins/repository-search", + "//platform/util/text-matching", ], exports = [ "//platform/external-system-api:externalSystem", diff --git a/plugins/gradle/intellij.gradle.iml b/plugins/gradle/intellij.gradle.iml index e1e81e483058..92ca3282fa77 100644 --- a/plugins/gradle/intellij.gradle.iml +++ b/plugins/gradle/intellij.gradle.iml @@ -67,5 +67,6 @@ + \ No newline at end of file diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/completion/GradleDependencyCompletionMatcher.kt b/plugins/gradle/src/org/jetbrains/plugins/gradle/completion/GradleDependencyCompletionMatcher.kt index dde0f9c948c7..c291dcd8135f 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/completion/GradleDependencyCompletionMatcher.kt +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/completion/GradleDependencyCompletionMatcher.kt @@ -3,7 +3,7 @@ package org.jetbrains.plugins.gradle.completion import com.intellij.codeInsight.completion.PrefixMatcher import com.intellij.openapi.diagnostic.logger -import com.intellij.openapi.util.TextRange +import com.intellij.util.text.matching.MatchedFragment import org.jetbrains.annotations.ApiStatus private val log = logger() @@ -18,7 +18,7 @@ class GradleDependencyCompletionMatcher(prefix: String) : PrefixMatcher(prefix) return GradleDependencyCompletionMatcher(prefix) } - override fun getMatchingFragments(prefix: String, name: String): List? { + override fun getMatchingFragments(prefix: String, name: String): List { try { return tryGetMatchingFragments(prefix, name) } @@ -28,17 +28,17 @@ class GradleDependencyCompletionMatcher(prefix: String) : PrefixMatcher(prefix) } } - private fun tryGetMatchingFragments(prefix: String, name: String): List? { + private fun tryGetMatchingFragments(prefix: String, name: String): List { // handle top level completion case: // implementation("org.example:lib-implementation:1.0") - "implementation" in the artifact name should be matched val start = name.indexOf("(").coerceAtLeast(0) val prefixParts = prefix.split(":") val nameParts = name.substring(start).split(":") - val result = mutableListOf() + val result = mutableListOf() var offset = start var j = 0 for (i in 0 until prefixParts.size) { - var matchingFragment: TextRange? = null + var matchingFragment: MatchedFragment? = null while (j < nameParts.size && matchingFragment == null) { matchingFragment = getMatchingFragment(offset, prefixParts[i], nameParts[j]) offset += nameParts[j].length + 1 @@ -53,11 +53,11 @@ class GradleDependencyCompletionMatcher(prefix: String) : PrefixMatcher(prefix) return result } - private fun getMatchingFragment(offset: Int, prefixPart: String, name: String): TextRange? { + private fun getMatchingFragment(offset: Int, prefixPart: String, name: String): MatchedFragment? { val from = name.indexOf(prefixPart) if (from == -1) { return null } - return TextRange(from + offset, from + offset + prefixPart.length) + return MatchedFragment(from + offset, from + offset + prefixPart.length) } } \ No newline at end of file diff --git a/plugins/kotlin/gradle/gradle-java/tests.shared/BUILD.bazel b/plugins/kotlin/gradle/gradle-java/tests.shared/BUILD.bazel index 03b6ed1f5fc0..49e36e29350b 100644 --- a/plugins/kotlin/gradle/gradle-java/tests.shared/BUILD.bazel +++ b/plugins/kotlin/gradle/gradle-java/tests.shared/BUILD.bazel @@ -112,6 +112,8 @@ jvm_library( "//plugins/repository-search", "//plugins/repository-search:repository-search_test_lib", "//plugins/kotlin/gradle/scripting/kotlin.gradle.scripting.shared:kotlin-gradle-scripting-shared", + "//platform/util/text-matching", + "//platform/util/text-matching:text-matching_test_lib", ], exports = ["@lib//:kotlin-gradle-plugin-idea"], runtime_deps = [":tests.shared"] diff --git a/plugins/kotlin/gradle/gradle-java/tests.shared/kotlin.gradle.gradle-java.tests.shared.iml b/plugins/kotlin/gradle/gradle-java/tests.shared/kotlin.gradle.gradle-java.tests.shared.iml index fe037823e263..c8b08d028b80 100644 --- a/plugins/kotlin/gradle/gradle-java/tests.shared/kotlin.gradle.gradle-java.tests.shared.iml +++ b/plugins/kotlin/gradle/gradle-java/tests.shared/kotlin.gradle.gradle-java.tests.shared.iml @@ -82,5 +82,6 @@ + \ No newline at end of file diff --git a/plugins/kotlin/gradle/gradle-java/tests.shared/test/org/jetbrains/kotlin/idea/codeInsight/gradle/completion/GradleDependencyCompletionMatcherTest.kt b/plugins/kotlin/gradle/gradle-java/tests.shared/test/org/jetbrains/kotlin/idea/codeInsight/gradle/completion/GradleDependencyCompletionMatcherTest.kt index db837943ea1a..ce9df14e3d1f 100644 --- a/plugins/kotlin/gradle/gradle-java/tests.shared/test/org/jetbrains/kotlin/idea/codeInsight/gradle/completion/GradleDependencyCompletionMatcherTest.kt +++ b/plugins/kotlin/gradle/gradle-java/tests.shared/test/org/jetbrains/kotlin/idea/codeInsight/gradle/completion/GradleDependencyCompletionMatcherTest.kt @@ -1,7 +1,7 @@ // Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package org.jetbrains.kotlin.idea.codeInsight.gradle.completion -import com.intellij.openapi.util.TextRange +import com.intellij.util.text.matching.MatchedFragment import org.jetbrains.plugins.gradle.completion.GradleDependencyCompletionMatcher import org.junit.jupiter.api.Assertions.assertEquals import org.junit.jupiter.params.ParameterizedTest @@ -63,7 +63,7 @@ class GradleDependencyCompletionMatcherTest { } // Apply ranges as braces to the clean name to build an annotated string - fun annotate(name: String, ranges: List): String { + fun annotate(name: String, ranges: List): String { if (ranges.isEmpty()) return name val sorted = ranges.sortedBy { it.startOffset } val starts = sorted.groupBy { it.startOffset } @@ -85,8 +85,6 @@ class GradleDependencyCompletionMatcherTest { val matcher = GradleDependencyCompletionMatcher(prefix) val fragments = matcher.getMatchingFragments(prefix, name) - require(fragments != null) { "Expected non-null fragments" } - val actualAnnotated = annotate(name, fragments) val message = "getMatchingFragments: prefix='$prefix' expected $annotatedName but was $actualAnnotated" assertEquals(annotatedName, actualAnnotated, message)