diff --git a/ace.d.ts b/ace.d.ts index 81ab5adb784..c1dfce7d6a0 100644 --- a/ace.d.ts +++ b/ace.d.ts @@ -234,6 +234,7 @@ export namespace Ace { relativeLineNumbers: boolean; enableMultiselect: boolean; enableKeyboardAccessibility: boolean; + filterStringsCompletions: boolean; } export interface SearchOptions { diff --git a/src/autocomplete/text_completer.js b/src/autocomplete/text_completer.js index 59791376dc4..a090974db82 100644 --- a/src/autocomplete/text_completer.js +++ b/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({ @@ -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, diff --git a/src/autocomplete_test.js b/src/autocomplete_test.js index 34a1e479e00..3b8ff27335a 100644 --- a/src/autocomplete_test.js +++ b/src/autocomplete_test.js @@ -12,9 +12,11 @@ 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(); @@ -24,7 +26,8 @@ function initEditor(value) { value: value, maxLines: 10, enableBasicAutocompletion: true, - enableLiveAutocompletion: true + enableLiveAutocompletion: true, + mode: mode }); document.body.appendChild(editor.container); editor.focus(); @@ -162,6 +165,26 @@ module.exports = { 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 = "First"; diff --git a/src/ext/language_tools.js b/src/ext/language_tools.js index 0f6b9941b5e..d5384f366c5 100644 --- a/src/ext/language_tools.js +++ b/src/ext/language_tools.js @@ -221,5 +221,8 @@ require("../config").defineOptions(Editor.prototype, "editor", { } }, value: false + }, + filterStringsCompletions: { + initialValue: false } }); diff --git a/src/ext/options.js b/src/ext/options.js index f82b82dcc5e..75c774c9a44 100644 --- a/src/ext/options.js +++ b/src/ext/options.js @@ -192,6 +192,9 @@ var optionGroups = { "Live Autocompletion": { path: "enableLiveAutocompletion" }, + "Filter Comments and String Completions": { + path: "filterStringsCompletions" + }, "Custom scrollbar": { path: "customScrollbar" },