Skip to content

Commit 4856fae

Browse files
committed
fix: compatibility errors caused by lookup matcher
1 parent 401d4fe commit 4856fae

6 files changed

Lines changed: 62 additions & 92 deletions

File tree

src/main/kotlin/ee/carlrobert/codegpt/codecompletions/DebouncedCodeCompletionProvider.kt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -121,8 +121,7 @@ class DebouncedCodeCompletionProvider : DebouncedInlineCompletionProvider() {
121121
return false
122122
}
123123

124-
return event is LookupInlineCompletionEvent
125-
|| event is InlineCompletionEvent.DirectCall
124+
return event is InlineCompletionEvent.DirectCall
126125
|| event is InlineCompletionEvent.DocumentChange
127126
}
128127
}

src/main/kotlin/ee/carlrobert/codegpt/codecompletions/LookupInlineCompletionEvent.kt

Lines changed: 0 additions & 54 deletions
This file was deleted.

src/main/kotlin/ee/carlrobert/codegpt/ui/textarea/lookup/AbstractLookupItem.kt

Lines changed: 0 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import com.intellij.codeInsight.lookup.LookupElement
66
import com.intellij.codeInsight.lookup.LookupElementBuilder
77
import com.intellij.codeInsight.lookup.LookupElementPresentation
88
import com.intellij.codeInsight.lookup.LookupElementRenderer
9-
import com.intellij.openapi.util.TextRange
109

1110
abstract class AbstractLookupItem : LookupItem {
1211
override fun createLookupElement(
@@ -23,10 +22,6 @@ abstract class AbstractLookupItem : LookupItem {
2322
presentation: LookupElementPresentation
2423
) {
2524
setPresentation(element, presentation)
26-
emphasizeMatch(
27-
presentation,
28-
searchTextProvider?.invoke() ?: searchText
29-
)
3025
}
3126
})
3227
getAdditionalLookupStrings().forEach { lookupString ->
@@ -38,24 +33,6 @@ abstract class AbstractLookupItem : LookupItem {
3833
return PrioritizedLookupElement.withPriority(lookupElement, 1.0)
3934
}
4035

41-
private fun emphasizeMatch(
42-
presentation: LookupElementPresentation,
43-
searchText: String
44-
) {
45-
val normalizedSearchText = searchText.trim()
46-
if (normalizedSearchText.isEmpty()) {
47-
return
48-
}
49-
50-
val matcher = LookupMatchers.createMatcher(normalizedSearchText)
51-
matcher.match(displayName)?.forEach { fragment ->
52-
presentation.decorateItemTextRange(
53-
TextRange(fragment.startOffset, fragment.endOffset),
54-
LookupElementPresentation.LookupItemDecoration.HIGHLIGHT_MATCHED
55-
)
56-
}
57-
}
58-
5936
abstract fun getLookupString(): String
6037

6138
protected open fun getAdditionalLookupStrings(): Collection<String> = emptyList()
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package ee.carlrobert.codegpt.ui.textarea.lookup
2+
3+
import com.intellij.codeInsight.completion.PrefixMatcher
4+
import com.intellij.util.text.matching.MatchedFragment
5+
6+
class LookupItemKeepOpenPrefixMatcher(
7+
prefix: String,
8+
private val highlightText: String,
9+
private val highlightTextProvider: (() -> String)?
10+
) : PrefixMatcher(prefix) {
11+
12+
override fun prefixMatches(name: String): Boolean = true
13+
14+
override fun cloneWithPrefix(prefix: String): PrefixMatcher {
15+
return LookupItemKeepOpenPrefixMatcher(prefix, highlightText, highlightTextProvider)
16+
}
17+
18+
override fun matchingDegree(string: String): Int = 0
19+
20+
override fun getMatchingFragments(
21+
pattern: String,
22+
name: String
23+
): MutableList<MatchedFragment>? {
24+
val effectivePattern = (highlightTextProvider?.invoke() ?: highlightText).trim()
25+
if (effectivePattern.isEmpty()) {
26+
return null
27+
}
28+
29+
return LookupMatchers.createMatcher(effectivePattern).match(name)?.toMutableList()
30+
}
31+
}

src/main/kotlin/ee/carlrobert/codegpt/ui/textarea/lookup/LookupUtil.kt

Lines changed: 5 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,9 @@
11
package ee.carlrobert.codegpt.ui.textarea.lookup
22

3-
import com.intellij.codeInsight.completion.PrefixMatcher
43
import com.intellij.codeInsight.completion.PrioritizedLookupElement
54
import com.intellij.codeInsight.lookup.impl.LookupImpl
65

76
object LookupUtil {
8-
private fun keepLookupOpenMatcher(prefix: String): PrefixMatcher =
9-
object : PrefixMatcher(prefix) {
10-
override fun prefixMatches(name: String): Boolean = true
11-
12-
override fun cloneWithPrefix(prefix: String): PrefixMatcher {
13-
return keepLookupOpenMatcher(prefix)
14-
}
15-
16-
override fun matchingDegree(string: String): Int = 0
17-
}
18-
197
fun addLookupItems(
208
lookup: LookupImpl,
219
lookupItems: List<Pair<LookupItem, Double>>,
@@ -24,7 +12,11 @@ object LookupUtil {
2412
matcherPrefix: String = searchText
2513
) {
2614
if (!lookup.isLookupDisposed) {
27-
val prefixMatcher = keepLookupOpenMatcher(matcherPrefix)
15+
val prefixMatcher = LookupItemKeepOpenPrefixMatcher(
16+
matcherPrefix,
17+
searchText,
18+
searchTextProvider
19+
)
2820
lookupItems.forEach { (lookupItem, priority) ->
2921
lookup.addItem(
3022
PrioritizedLookupElement.withPriority(

src/test/kotlin/ee/carlrobert/codegpt/ui/textarea/PromptTextFieldLookupItemsTest.kt

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import com.intellij.codeInsight.lookup.LookupElement
44
import com.intellij.codeInsight.lookup.LookupElementPresentation
55
import com.intellij.openapi.project.Project
66
import ee.carlrobert.codegpt.ui.textarea.lookup.AbstractLookupItem
7+
import ee.carlrobert.codegpt.ui.textarea.lookup.LookupItemKeepOpenPrefixMatcher
78
import ee.carlrobert.codegpt.ui.textarea.lookup.LoadingLookupItem
89
import ee.carlrobert.codegpt.ui.textarea.lookup.LookupActionItem
910
import ee.carlrobert.codegpt.ui.textarea.lookup.StatusLookupItem
@@ -79,6 +80,30 @@ class PromptTextFieldLookupItemsTest {
7980
assertThat(items.last()).isInstanceOf(LoadingLookupItem::class.java)
8081
}
8182

83+
@Test
84+
fun `keep open matcher exposes matching fragments for lookup highlighting`() {
85+
val matcher = LookupItemKeepOpenPrefixMatcher("@files abc", "abc", null)
86+
87+
val fragments = matcher.getMatchingFragments("abc", "my-abc-file.kt")
88+
89+
assertThat(fragments).isNotNull
90+
assertThat(fragments!!.map { it.startOffset to it.endOffset })
91+
.contains(3 to 6)
92+
}
93+
94+
@Test
95+
fun `keep open matcher uses latest provided search text for lookup highlighting`() {
96+
var searchText = "abc"
97+
val matcher = LookupItemKeepOpenPrefixMatcher("@files abc", "ignored") { searchText }
98+
99+
searchText = "file"
100+
val fragments = matcher.getMatchingFragments("@files abc", "my-abc-file.kt")
101+
102+
assertThat(fragments).isNotNull
103+
assertThat(fragments!!.map { it.startOffset to it.endOffset })
104+
.contains(7 to 11)
105+
}
106+
82107
private class TestLookupActionItem(
83108
override val displayName: String
84109
) : AbstractLookupItem(), LookupActionItem {

0 commit comments

Comments
 (0)