12
12
13
13
import ts .TypeScriptException ;
14
14
import ts .client .ITypeScriptServiceClient ;
15
+ import ts .internal .matcher .LCSS ;
16
+ import ts .utils .StringUtils ;
15
17
16
18
public class CompletionEntry implements ICompletionEntry , ITypeScriptCompletionEntryDetailsCollector {
17
19
20
+ // Negative value ensures subsequence matches have a lower relevance than
21
+ // standard JDT or template proposals
22
+ private static final int SUBWORDS_RANGE_START = -9000 ;
23
+
24
+ private static final int minPrefixLengthForTypes = 1 ;
25
+
18
26
private final String name ;
19
27
private final String kind ;
20
28
private final String kindModifiers ;
@@ -23,21 +31,22 @@ public class CompletionEntry implements ICompletionEntry, ITypeScriptCompletionE
23
31
private final String fileName ;
24
32
private final int line ;
25
33
private final int offset ;
26
- private final ITypeScriptServiceClient client ;
27
34
private CompletionEntryDetails entryDetails ;
28
- private ICompletionEntryMatcher matcher ;
35
+ private final ICompletionEntryMatcher matcher ;
36
+ private int relevance ;
37
+ private final ITypeScriptServiceClient client ;
29
38
30
39
public CompletionEntry (String name , String kind , String kindModifiers , String sortText , String fileName , int line ,
31
- int offset , ITypeScriptServiceClient client , ICompletionEntryMatcher matcher ) {
40
+ int offset , ICompletionEntryMatcher matcher , ITypeScriptServiceClient client ) {
32
41
this .name = name ;
33
42
this .kind = kind ;
34
43
this .kindModifiers = kindModifiers ;
35
44
this .sortText = sortText ;
36
45
this .fileName = fileName ;
37
46
this .line = line ;
38
47
this .offset = offset ;
39
- this .client = client ;
40
48
this .matcher = matcher ;
49
+ this .client = client ;
41
50
}
42
51
43
52
@ Override
@@ -86,4 +95,47 @@ public void addDocumentation(String text, String kind) {
86
95
public ICompletionEntryMatcher getMatcher () {
87
96
return matcher ;
88
97
}
98
+
99
+ @ Override
100
+ public int getRelevance () {
101
+ return relevance ;
102
+ }
103
+
104
+ @ Override
105
+ public boolean updatePrefix (String prefix ) {
106
+ Integer relevanceBoost = null ;
107
+ int [] bestSequence = null ;
108
+ if (StringUtils .isEmpty (prefix )) {
109
+ relevanceBoost = 0 ;
110
+ } else {
111
+ bestSequence = matcher .bestSubsequence (name , prefix );
112
+ if ((bestSequence != null && bestSequence .length > 0 )) {
113
+ relevanceBoost = 0 ;
114
+ if (name .equals (prefix )) {
115
+ if (minPrefixLengthForTypes < prefix .length ()) {
116
+ relevanceBoost = 16 * (RelevanceConstants .R_EXACT_NAME + RelevanceConstants .R_CASE );
117
+ }
118
+ } else if (name .equalsIgnoreCase (prefix )) {
119
+ if (minPrefixLengthForTypes < prefix .length ()) {
120
+ relevanceBoost = 16 * RelevanceConstants .R_EXACT_NAME ;
121
+ }
122
+ } else if (startsWithIgnoreCase (prefix , name )) {
123
+ // Don't adjust score
124
+ } else {
125
+ int score = LCSS .scoreSubsequence (bestSequence );
126
+ relevanceBoost = SUBWORDS_RANGE_START + score ;
127
+ }
128
+
129
+ }
130
+ }
131
+ if (relevanceBoost != null ) {
132
+ relevance = relevanceBoost ;
133
+ return true ;
134
+ }
135
+ return false ;
136
+ }
137
+
138
+ private boolean startsWithIgnoreCase (String prefix , String name ) {
139
+ return prefix .toUpperCase ().startsWith (name .toUpperCase ());
140
+ }
89
141
}
0 commit comments