Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feat: Ability to filter comments and strings from text completer #5233

Open
wants to merge 5 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
1 change: 1 addition & 0 deletions ace.d.ts
Expand Up @@ -234,6 +234,7 @@ export namespace Ace {
relativeLineNumbers: boolean;
enableMultiselect: boolean;
enableKeyboardAccessibility: boolean;
filterStringsCompletions: boolean;
}

export interface SearchOptions {
Expand Down
26 changes: 25 additions & 1 deletion src/autocomplete/text_completer.js
@@ -1,6 +1,7 @@
var Range = require("../range").Range;

var splitRegex = /[^a-zA-Z_0-9\$\-\u00C0-\u1FFF\u2C00-\uD7FF\w]+/;
var identifierRe = /[a-zA-Z\$_\u00a1-\uffff][a-zA-Z\\d\\$_\u00a1-\uffff]*/;

function getWordIndex(doc, pos) {
var textBefore = doc.getTextRange(Range.fromPoints({
Expand Down Expand Up @@ -36,9 +37,32 @@ function wordDistance(doc, pos) {
return wordScores;
}

function getWordScoresForFilteredStrings(session, pos) {
var filterRegExp = /string|comment|^comment\.doc.*/;
var lines = session.bgTokenizer.lines;
var exclude = lines[pos.row] && lines[pos.row].find(el => el.start === pos.column - el.value.length);
var wordScores = Object.create(null);

var flatLines = lines.flat();
var linesLength = flatLines.length;
for (var i = 0; i < linesLength; i++) {
var token = flatLines[i];
if (!token || exclude && token.value === exclude.value) {
continue;
}
if (!filterRegExp.test(token.type) && identifierRe.test(token.value)) {
wordScores[token.value] = 0;
}
}

return wordScores;
}

exports.getCompletions = function (editor, session, pos, prefix, callback) {
var wordScore = wordDistance(session, pos);
var wordScore = editor.$filterStringsCompletions ? getWordScoresForFilteredStrings(session, pos) : wordDistance(
session, pos);
var wordList = Object.keys(wordScore);

callback(null, wordList.map(function (word) {
return {
caption: word,
Expand Down
27 changes: 25 additions & 2 deletions src/autocomplete_test.js
Expand Up @@ -5,16 +5,18 @@
"use strict";

var sendKey = require("./test/user").type;
var {buildDom} = require("./lib/dom");

Check warning on line 8 in src/autocomplete_test.js

View workflow job for this annotation

GitHub Actions / build (16.x)

'buildDom' is assigned a value but never used
var ace = require("./ace");
var assert = require("./test/assertions");
var user = require("./test/user");
var Range = require("./range").Range;
require("./ext/language_tools");
var Autocomplete = require("./autocomplete").Autocomplete;
var textCompleter = require("./autocomplete/text_completer");
var JavaScriptMode = require("./mode/javascript").Mode;

var editor;
function initEditor(value) {
function initEditor(value, mode) {
if (editor) {
editor.destroy();
editor.container.remove();
Expand All @@ -24,7 +26,8 @@
value: value,
maxLines: 10,
enableBasicAutocompletion: true,
enableLiveAutocompletion: true
enableLiveAutocompletion: true,
mode: mode
});
document.body.appendChild(editor.container);
editor.focus();
Expand Down Expand Up @@ -162,6 +165,26 @@
done();
});
},
"test: filter strings and comments from local completions list": function (done) {
var editor = initEditor("//comment here\n /**\n * doc comment\n**/'string'\nsomeIdentifier\n", new JavaScriptMode());
editor.completers = [textCompleter];
editor.moveCursorTo(3, 0);
editor.renderer.$loop._flush();

sendKey("o");
var popup = editor.completer.popup;
afterRenderCheck(popup, function () {
assert.equal(popup.data.length, 3);
editor.setOption("filterStringsCompletions", true);
editor.onCommandKey(null, 0, 13);
sendKey(" ");
sendKey("o");
afterRenderCheck(popup, function () {
assert.equal(popup.data.length, 1); //only identifier left
done();
});
});
},
"test: different completers tooltips": function (done) {
var editor = initEditor("");
var firstDoc = "<b>First</b>";
Expand Down
3 changes: 3 additions & 0 deletions src/ext/language_tools.js
Expand Up @@ -221,5 +221,8 @@ require("../config").defineOptions(Editor.prototype, "editor", {
}
},
value: false
},
filterStringsCompletions: {
initialValue: false
}
});
3 changes: 3 additions & 0 deletions src/ext/options.js
Expand Up @@ -192,6 +192,9 @@ var optionGroups = {
"Live Autocompletion": {
path: "enableLiveAutocompletion"
},
"Filter Comments and String Completions": {
path: "filterStringsCompletions"
},
"Custom scrollbar": {
path: "customScrollbar"
},
Expand Down