Skip to content

Commit 94f6bb1

Browse files
committed
Fix bug where autocompletion was off-by-one when atIndex was not specified
1 parent 61a04db commit 94f6bb1

2 files changed

Lines changed: 23 additions & 7 deletions

File tree

src/SQLAutocomplete.ts

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ export class SQLAutocomplete {
2929
const preferredRuleOptions = [preferredRulesTable, preferredRulesColumn];
3030
const ignoreTokens = this._getTokensToIgnore();
3131
core.ignoredTokens = new Set(ignoreTokens);
32-
let indexToAutocomplete = sqlScript.length - 1;
32+
let indexToAutocomplete = sqlScript.length;
3333
if (atIndex !== null && atIndex !== undefined) {
3434
indexToAutocomplete = atIndex;
3535
}
@@ -146,9 +146,6 @@ export class SQLAutocomplete {
146146
TSQLGrammar.TSqlParser.RULE_column_elem,
147147
TSQLGrammar.TSqlParser.RULE_column_alias,
148148
TSQLGrammar.TSqlParser.RULE_full_column_name,
149-
TSQLGrammar.TSqlParser.RULE_full_column_name_list,
150-
TSQLGrammar.TSqlParser.RULE_column_name_list,
151-
TSQLGrammar.TSqlParser.RULE_column_name_list_with_order,
152149
TSQLGrammar.TSqlParser.RULE_output_column_name,
153150
TSQLGrammar.TSqlParser.RULE_column_declaration
154151
];
@@ -247,8 +244,8 @@ export class SQLAutocomplete {
247244
_getTokenString(token: any, fullString: string, offset: number): string {
248245
if (token !== null && token.type !== Token.EOF) {
249246
let stop = token.stop;
250-
if (offset - 1 < stop) {
251-
stop = offset - 1;
247+
if (offset < stop) {
248+
stop = offset;
252249
}
253250
return fullString.substring(token.start, stop + 1);
254251
}

test/autocomplete.test.ts

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,5 +68,24 @@ test('autocomplete detects column location', () => {
6868
expect(containsOptionType(plpgsqlOptions, AutocompleteOptionType.TABLE)).toBeTruthy();
6969
expect(containsOptionType(plpgsqlOptions, AutocompleteOptionType.COLUMN)).toBeTruthy();
7070
expect(allKeywordsBeginWith(plpgsqlOptions, 'c')).toBeTruthy();
71-
71+
});
72+
73+
test('autocomplete when position is not provided', () => {
74+
const sql = 'SELECT * FR';
75+
const tsqlOptions = tsqlAutocomplete.autocomplete(sql);
76+
expect(containsOptionType(tsqlOptions, AutocompleteOptionType.TABLE)).toBeTruthy();
77+
expect(containsOptionType(tsqlOptions, AutocompleteOptionType.COLUMN)).toBeTruthy();
78+
expect(allKeywordsBeginWith(tsqlOptions, 'FR')).toBeTruthy();
79+
const mysqlOptions = mysqlAutocomplete.autocomplete(sql);
80+
expect(containsOptionType(mysqlOptions, AutocompleteOptionType.TABLE)).toBeFalsy();
81+
expect(containsOptionType(mysqlOptions, AutocompleteOptionType.COLUMN)).toBeFalsy();
82+
expect(allKeywordsBeginWith(mysqlOptions, 'FR')).toBeTruthy();
83+
const plsqlOptions = plsqlAutocomplete.autocomplete(sql);
84+
expect(containsOptionType(plsqlOptions, AutocompleteOptionType.TABLE)).toBeFalsy();
85+
expect(containsOptionType(plsqlOptions, AutocompleteOptionType.COLUMN)).toBeFalsy();
86+
expect(allKeywordsBeginWith(plsqlOptions, 'FR')).toBeTruthy();
87+
const plpgsqlOptions = plpgsqlAutocomplete.autocomplete(sql);
88+
expect(containsOptionType(plpgsqlOptions, AutocompleteOptionType.TABLE)).toBeFalsy();
89+
expect(containsOptionType(plpgsqlOptions, AutocompleteOptionType.COLUMN)).toBeFalsy();
90+
expect(allKeywordsBeginWith(plpgsqlOptions, 'FR')).toBeTruthy();
7291
});

0 commit comments

Comments
 (0)