Skip to content

Commit ed90389

Browse files
committed
feat: filter comment and strings completions option
1 parent 30979cb commit ed90389

File tree

6 files changed

+41
-11
lines changed

6 files changed

+41
-11
lines changed

ace.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -234,6 +234,7 @@ export namespace Ace {
234234
relativeLineNumbers: boolean;
235235
enableMultiselect: boolean;
236236
enableKeyboardAccessibility: boolean;
237+
filterStringsCompletions: boolean;
237238
}
238239

239240
export interface SearchOptions {

src/autocomplete/text_completer.js

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -37,20 +37,20 @@ function wordDistance(doc, pos) {
3737
return wordScores;
3838
}
3939

40-
function completionsFromMode(session, pos) {
41-
var completerTokens = session.$mode.$completerTokens;
40+
function filterStringsFromCompletions(session, pos) {
41+
var filterRegExp = /string|comment|^comment\.doc.*/;
4242
var lines = session.bgTokenizer.lines;
43-
var exclude = lines[pos.row].find(el => el.start === pos.column - el.value.length);
43+
var exclude = lines[pos.row] && lines[pos.row].find(el => el.start === pos.column - el.value.length);
4444
var wordScores = Object.create(null);
4545

46-
lines = lines.flat();
47-
var linesLength = lines.length;
46+
var flatLines = lines.flat();
47+
var linesLength = flatLines.length;
4848
for (var i = 0; i < linesLength; i++) {
49-
var token = lines[i];
49+
var token = flatLines[i];
5050
if (!token || exclude && token.value === exclude.value) {
5151
continue;
5252
}
53-
if (completerTokens.includes(token.type) && identifierRe.test(token.value)) {
53+
if (!filterRegExp.test(token.type) && identifierRe.test(token.value)) {
5454
wordScores[token.value] = 0;
5555
}
5656
}
@@ -59,7 +59,8 @@ function completionsFromMode(session, pos) {
5959
}
6060

6161
exports.getCompletions = function (editor, session, pos, prefix, callback) {
62-
var wordScore = session.$mode.$completerTokens ? completionsFromMode(session, pos) : wordDistance(session, pos);
62+
var wordScore = editor.$filterStringsCompletions ? filterStringsFromCompletions(session, pos) : wordDistance(
63+
session, pos);
6364
var wordList = Object.keys(wordScore);
6465

6566
callback(null, wordList.map(function (word) {

src/autocomplete_test.js

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,11 @@ var user = require("./test/user");
1212
var Range = require("./range").Range;
1313
require("./ext/language_tools");
1414
var Autocomplete = require("./autocomplete").Autocomplete;
15+
var textCompleter = require("./autocomplete/text_completer");
16+
var JavaScriptMode = require("./mode/javascript").Mode;
1517

1618
var editor;
17-
function initEditor(value) {
19+
function initEditor(value, mode) {
1820
if (editor) {
1921
editor.destroy();
2022
editor.container.remove();
@@ -24,7 +26,8 @@ function initEditor(value) {
2426
value: value,
2527
maxLines: 10,
2628
enableBasicAutocompletion: true,
27-
enableLiveAutocompletion: true
29+
enableLiveAutocompletion: true,
30+
mode: mode
2831
});
2932
document.body.appendChild(editor.container);
3033
editor.focus();
@@ -162,6 +165,26 @@ module.exports = {
162165
done();
163166
});
164167
},
168+
"test: filter strings and comments from local completions list": function (done) {
169+
var editor = initEditor("//comment here\n /**\n * doc comment\n**/'string'\nsomeIdentifier\n", new JavaScriptMode());
170+
editor.completers = [textCompleter];
171+
editor.moveCursorTo(3, 0);
172+
editor.renderer.$loop._flush();
173+
174+
sendKey("o");
175+
var popup = editor.completer.popup;
176+
afterRenderCheck(popup, function () {
177+
assert.equal(popup.data.length, 3);
178+
editor.setOption("filterStringsCompletions", true);
179+
editor.onCommandKey(null, 0, 13);
180+
sendKey(" ");
181+
sendKey("o");
182+
afterRenderCheck(popup, function () {
183+
assert.equal(popup.data.length, 1); //only identifier left
184+
done();
185+
});
186+
});
187+
},
165188
"test: different completers tooltips": function (done) {
166189
var editor = initEditor("");
167190
var firstDoc = "<b>First</b>";

src/ext/language_tools.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -221,5 +221,8 @@ require("../config").defineOptions(Editor.prototype, "editor", {
221221
}
222222
},
223223
value: false
224+
},
225+
filterStringsCompletions: {
226+
initialValue: false
224227
}
225228
});

src/ext/options.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,9 @@ var optionGroups = {
192192
"Live Autocompletion": {
193193
path: "enableLiveAutocompletion"
194194
},
195+
"Filter Comments and String Completions": {
196+
path: "filterStringsCompletions"
197+
},
195198
"Custom scrollbar": {
196199
path: "customScrollbar"
197200
},

src/mode/javascript.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ oop.inherits(Mode, TextMode);
2525
this.$pairQuotesAfter = {
2626
"`": /\w/
2727
};
28-
this.$completerTokens = ["identifier", "entity.name.function", "storage.type", "variable.parameter"];
2928

3029
this.getNextLineIndent = function(state, line, tab) {
3130
var indent = this.$getIndent(line);

0 commit comments

Comments
 (0)