Add autocompletion for language keywords

Conflicts:

	lib/ace/edit_session.js
This commit is contained in:
Garen Torikian 2012-12-27 01:51:11 -08:00 committed by nightwing
commit 69e41521e6
33 changed files with 182 additions and 90 deletions

View file

@ -243,7 +243,7 @@ var Autocomplete = function() {
editor.on("changeSelection", this.$changeListener);
editor.on("blur", this.$blurListener);
worker.attachToDocument(editor.session.getDocument(), {cursor: editor.getCursorPosition()}, true);
worker.attachToDocument(editor.session.getDocument(), {cursor: editor.getCursorPosition(), keywords: editor.session.getMode().$keywordList}, true);
worker.on("complete", function(data) {
var matches = data.data.matches;

View file

@ -74,14 +74,14 @@ oop.inherits(AutocompleteWorker, Mirror);
var doc = this.doc.getValue();
var pos = this.data.cursor;
var part = SyntaxDetector.getContextSyntaxPart(this.doc, this.data.cursor, "javascript");
var part = SyntaxDetector.getContextSyntaxPart(this.doc, this.data.cursor);
var language = part.language;
var currentPos = { line: pos.row, col: pos.column };
var currentNode = null;
var matches = [], ast = null;
completer.complete(_self.doc, ast, this.data.cursor, currentNode, function(identifier, completions) {
completer.complete(_self.doc, ast, this.data.cursor, this.data.keywords, currentNode, function(identifier, completions) {
if (completions)
matches = matches.concat(completions);
removeDuplicateMatches(matches);

View file

@ -1,6 +1,7 @@
define(function(require, exports, module) {
var completeUtil = require("./complete_util");
var SPLIT_REGEX = /[^a-zA-Z_0-9\$]+/;
var MAX_SCORE = 1000000;
var completer = module.exports;
@ -9,7 +10,7 @@ define(function(require, exports, module) {
};
// For the current document, gives scores to identifiers not on frequency, but on distance from the current prefix
function wordDistanceAnalyzer(doc, pos, prefix) {
function wordDistanceAnalyzer(doc, pos, prefix, keywords) {
var text = doc.getValue().trim();
// Determine cursor's word index
@ -32,24 +33,28 @@ define(function(require, exports, module) {
var distance = Math.max(prefixPosition, i) - Math.min(prefixPosition, i);
// Score substracted from 100000 to force descending ordering
if (Object.prototype.hasOwnProperty.call(identDict, ident))
identDict[ident] = Math.max(1000000-distance, identDict[ident]);
identDict[ident] = Math.max(MAX_SCORE-distance, identDict[ident]);
else
identDict[ident] = 1000000-distance;
identDict[ident] = MAX_SCORE-distance;
}
for (var k = 0, l = keywords.length; k < l; k++) {
identDict[keywords[k]] = MAX_SCORE;
}
return identDict;
}
function analyze(doc, pos) {
function analyze(doc, pos, keywords) {
var line = doc.getLine(pos.row);
var identifier = completeUtil.retrievePrecedingIdentifier(line, pos.column);
var analysisCache = wordDistanceAnalyzer(doc, pos, identifier);
var analysisCache = wordDistanceAnalyzer(doc, pos, identifier, keywords);
return analysisCache;
}
completer.complete = function(doc, fullAst, pos, currentNode, callback) {
var identDict = analyze(doc, pos);
completer.complete = function(doc, fullAst, pos, keywords, currentNode, callback) {
var identDict = analyze(doc, pos, keywords);
var line = doc.getLine(pos.row);
var identifier = completeUtil.retrievePrecedingIdentifier(line, pos.column);

View file

@ -39,7 +39,9 @@ var TextMode = require("./text").Mode;
var oop = require("../lib/oop");
function Mode() {
this.$tokenizer = new Tokenizer(new Rules().getRules());
var highlighter = new Rules();
this.$tokenizer = new Tokenizer(highlighter.getRules());
this.$keywordList = new Rules(rules.$keywordList);
this.foldingRules = new FoldMode();
}

View file

@ -41,9 +41,13 @@ var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour;
var CStyleFoldMode = require("./folding/cstyle").FoldMode;
var Mode = function() {
this.$tokenizer = new Tokenizer(new c_cppHighlightRules().getRules());
var highlighter = new c_cppHighlightRules();
this.$tokenizer = new Tokenizer(highlighter.getRules());
this.$outdent = new MatchingBraceOutdent();
this.$behaviour = new CstyleBehaviour();
this.$keywordList = highlighter.$keywordList;
this.foldingRules = new CStyleFoldMode();
};
oop.inherits(Mode, TextMode);

View file

@ -39,7 +39,9 @@ var MatchingParensOutdent = require("./matching_parens_outdent").MatchingParensO
var Range = require("../range").Range;
var Mode = function() {
this.$tokenizer = new Tokenizer(new ClojureHighlightRules().getRules());
var highlighter = new ClojureHighlightRules();
this.$tokenizer = new Tokenizer(highlighter.getRules());
this.$keywordList = new Rules(rules.$keywordList);
this.$outdent = new MatchingParensOutdent();
};
oop.inherits(Mode, TextMode);

View file

@ -41,8 +41,10 @@ var WorkerClient = require("../worker/worker_client").WorkerClient;
var oop = require("../lib/oop");
function Mode() {
this.$tokenizer = new Tokenizer(new Rules().getRules());
var highlighter = new Rules();
this.$tokenizer = new Tokenizer(highlighter.getRules());
this.$outdent = new Outdent();
this.$keywordList = new Rules(rules.$keywordList);
this.foldingRules = new FoldMode();
}

View file

@ -10,9 +10,11 @@ var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour;
var CStyleFoldMode = require("./folding/cstyle").FoldMode;
var Mode = function() {
this.$tokenizer = new Tokenizer(new CSharpHighlightRules().getRules());
var highlighter = new CSharpHighlightRules();
this.$tokenizer = new Tokenizer(highlighter.getRules());
this.$outdent = new MatchingBraceOutdent();
this.$behaviour = new CstyleBehaviour();
this.$keywordList = highlighter.$keywordList;
this.foldingRules = new CStyleFoldMode();
};
oop.inherits(Mode, TextMode);

View file

@ -41,9 +41,11 @@ var CssBehaviour = require("./behaviour/css").CssBehaviour;
var CStyleFoldMode = require("./folding/cstyle").FoldMode;
var Mode = function() {
this.$tokenizer = new Tokenizer(new CssHighlightRules().getRules());
var highlighter = new CssHighlightRules();
this.$tokenizer = new Tokenizer(highlighter.getRules());
this.$outdent = new MatchingBraceOutdent();
this.$behaviour = new CssBehaviour();
this.$keywordList = highlighter.$keywordList;
this.foldingRules = new CStyleFoldMode();
};
oop.inherits(Mode, TextMode);

View file

@ -52,6 +52,7 @@ var Mode = function() {
this.foldingRules = new CStyleFoldMode();
this.$tokenizer = new Tokenizer(highlighter.getRules());
this.$keywordList = highlighter.$keywordList;
};
oop.inherits(Mode, CMode);

View file

@ -41,9 +41,12 @@ var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour;
var CStyleFoldMode = require("./folding/cstyle").FoldMode;
var Mode = function() {
this.$tokenizer = new Tokenizer(new glslHighlightRules().getRules());
var highlighter = new glslHighlightRules();
this.$tokenizer = new Tokenizer(highlighter.getRules());
this.$outdent = new MatchingBraceOutdent();
this.$behaviour = new CstyleBehaviour();
this.$keywordList = highlighter.$keywordList;
this.foldingRules = new CStyleFoldMode();
};
oop.inherits(Mode, CMode);

View file

@ -1,55 +1,58 @@
define(function(require, exports, module) {
var oop = require("../lib/oop");
var TextMode = require("./text").Mode;
var Tokenizer = require("../tokenizer").Tokenizer;
var GolangHighlightRules = require("./golang_highlight_rules").GolangHighlightRules;
var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent;
var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour;
var CStyleFoldMode = require("./folding/cstyle").FoldMode;
var Mode = function() {
this.$tokenizer = new Tokenizer(new GolangHighlightRules().getRules());
this.$outdent = new MatchingBraceOutdent();
this.foldingRules = new CStyleFoldMode();
};
oop.inherits(Mode, TextMode);
(function() {
var oop = require("../lib/oop");
var TextMode = require("./text").Mode;
var Tokenizer = require("../tokenizer").Tokenizer;
var GolangHighlightRules = require("./golang_highlight_rules").GolangHighlightRules;
var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent;
var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour;
var CStyleFoldMode = require("./folding/cstyle").FoldMode;
var Mode = function() {
var highlighter = new GolangHighlightRules();
this.$tokenizer = new Tokenizer(highlighter.getRules());
this.$keywordList = highlighter.$keywordList;
this.$outdent = new MatchingBraceOutdent();
this.foldingRules = new CStyleFoldMode();
};
oop.inherits(Mode, TextMode);
(function() {
this.lineCommentStart = "//";
this.blockComment = {start: "/*", end: "*/"};
this.getNextLineIndent = function(state, line, tab) {
var indent = this.$getIndent(line);
this.getNextLineIndent = function(state, line, tab) {
var indent = this.$getIndent(line);
var tokenizedLine = this.$tokenizer.getLineTokens(line, state);
var tokens = tokenizedLine.tokens;
var endState = tokenizedLine.state;
var tokenizedLine = this.$tokenizer.getLineTokens(line, state);
var tokens = tokenizedLine.tokens;
var endState = tokenizedLine.state;
if (tokens.length && tokens[tokens.length-1].type == "comment") {
return indent;
}
if (state == "start") {
var match = line.match(/^.*[\{\(\[]\s*$/);
if (match) {
indent += tab;
if (tokens.length && tokens[tokens.length-1].type == "comment") {
return indent;
}
if (state == "start") {
var match = line.match(/^.*[\{\(\[]\s*$/);
if (match) {
indent += tab;
}
}
}
return indent;
};//end getNextLineIndent
return indent;
};//end getNextLineIndent
this.checkOutdent = function(state, line, input) {
return this.$outdent.checkOutdent(line, input);
};
this.checkOutdent = function(state, line, input) {
return this.$outdent.checkOutdent(line, input);
};
this.autoOutdent = function(state, doc, row) {
this.$outdent.autoOutdent(doc, row);
};
this.autoOutdent = function(state, doc, row) {
this.$outdent.autoOutdent(doc, row);
};
}).call(Mode.prototype);
}).call(Mode.prototype);
exports.Mode = Mode;
exports.Mode = Mode;
});

View file

@ -8,7 +8,9 @@ var GroovyHighlightRules = require("./groovy_highlight_rules").GroovyHighlightRu
var Mode = function() {
JavaScriptMode.call(this);
this.$tokenizer = new Tokenizer(new GroovyHighlightRules().getRules());
var highlighter = new GroovyHighlightRules();
this.$tokenizer = new Tokenizer(highlighter.getRules());
this.$keywordList = highlighter.$keywordList;
};
oop.inherits(Mode, JavaScriptMode);

View file

@ -10,9 +10,12 @@ var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour;
var CStyleFoldMode = require("./folding/cstyle").FoldMode;
var Mode = function() {
this.$tokenizer = new Tokenizer(new HaxeHighlightRules().getRules());
var highlighter = new HaxeHighlightRules();
this.$tokenizer = new Tokenizer(highlighter.getRules());
this.$outdent = new MatchingBraceOutdent();
this.$behaviour = new CstyleBehaviour();
this.$keywordList = highlighter.$keywordList;
this.foldingRules = new CStyleFoldMode();
};
oop.inherits(Mode, TextMode);

View file

@ -8,8 +8,10 @@ var JavaHighlightRules = require("./java_highlight_rules").JavaHighlightRules;
var Mode = function() {
JavaScriptMode.call(this);
var highlighter = new JavaHighlightRules();
this.$tokenizer = new Tokenizer(new JavaHighlightRules().getRules());
this.$tokenizer = new Tokenizer(highlighter.getRules());
this.$keywordList = highlighter.$keywordList;
};
oop.inherits(Mode, JavaScriptMode);

View file

@ -42,9 +42,12 @@ var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour;
var CStyleFoldMode = require("./folding/cstyle").FoldMode;
var Mode = function() {
this.$tokenizer = new Tokenizer(new JavaScriptHighlightRules().getRules());
var highlighter = new JavaScriptHighlightRules();
this.$tokenizer = new Tokenizer(highlighter.getRules());
this.$outdent = new MatchingBraceOutdent();
this.$behaviour = new CstyleBehaviour();
this.$keywordList = highlighter.$keywordList;
this.foldingRules = new CStyleFoldMode();
};
oop.inherits(Mode, TextMode);

View file

@ -38,7 +38,10 @@ var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutd
var Range = require("../range").Range;
var Mode = function() {
this.$tokenizer = new Tokenizer(new LiquidHighlightRules().getRules());
var highlighter = new LiquidHighlightRules();
this.$tokenizer = new Tokenizer(highlighter.getRules());
this.$keywordList = highlighter.$keywordList;
this.$outdent = new MatchingBraceOutdent();
};
oop.inherits(Mode, TextMode);

View file

@ -45,6 +45,7 @@ var Mode = function() {
var highlighter = new LispHighlightRules();
this.$tokenizer = new Tokenizer(highlighter.getRules());
this.$keywordList = highlighter.$keywordList;
};
oop.inherits(Mode, TextMode);

View file

@ -40,8 +40,11 @@ var Range = require("../range").Range;
var WorkerClient = require("../worker/worker_client").WorkerClient;
var Mode = function() {
this.$tokenizer = new Tokenizer(new LuaHighlightRules().getRules());
var highlighter = new LuaHighlightRules();
this.$tokenizer = new Tokenizer(highlighter.getRules());
this.foldingRules = new LuaFoldMode();
this.$keywordList = highlighter.$keywordList;
};
oop.inherits(Mode, TextMode);

View file

@ -51,6 +51,7 @@ var Mode = function() {
this.foldingRules = new FoldMode();
this.$tokenizer = new Tokenizer(highlighter.getRules());
this.$keywordList = highlighter.$keywordList;
};
oop.inherits(Mode, TextMode);

View file

@ -39,8 +39,11 @@ var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutd
var Range = require("../range").Range;
var Mode = function() {
this.$tokenizer = new Tokenizer(new OcamlHighlightRules().getRules());
var highlighter = new OcamlHighlightRules();
this.$tokenizer = new Tokenizer(highlighter.getRules());
this.$outdent = new MatchingBraceOutdent();
this.$keywordList = highlighter.$keywordList;
};
oop.inherits(Mode, TextMode);

View file

@ -40,9 +40,12 @@ var Range = require("../range").Range;
var CStyleFoldMode = require("./folding/cstyle").FoldMode;
var Mode = function() {
this.$tokenizer = new Tokenizer(new PerlHighlightRules().getRules());
var highlighter = new PerlHighlightRules();
this.$tokenizer = new Tokenizer(highlighter.getRules());
this.$outdent = new MatchingBraceOutdent();
this.foldingRules = new CStyleFoldMode({start: "^=(begin|item)\\b", end: "^=(cut)\\b"});
this.$keywordList = highlighter.$keywordList;
};
oop.inherits(Mode, TextMode);

View file

@ -30,30 +30,33 @@
define(function(require, exports, module) {
var oop = require("../lib/oop");
var TextMode = require("../mode/text").Mode;
var Tokenizer = require("../tokenizer").Tokenizer;
var PgsqlHighlightRules = require("./pgsql_highlight_rules").PgsqlHighlightRules;
var Range = require("../range").Range;
var oop = require("../lib/oop");
var TextMode = require("../mode/text").Mode;
var Tokenizer = require("../tokenizer").Tokenizer;
var PgsqlHighlightRules = require("./pgsql_highlight_rules").PgsqlHighlightRules;
var Range = require("../range").Range;
var Mode = function() {
this.$tokenizer = new Tokenizer(new PgsqlHighlightRules().getRules());
};
oop.inherits(Mode, TextMode);
var Mode = function() {
var highlighter = new PgsqlHighlightRules();
this.$tokenizer = new Tokenizer(highlighter.getRules());
this.$keywordList = highlighter.$keywordList;
};
oop.inherits(Mode, TextMode);
(function() {
(function() {
this.lineCommentStart = "--";
this.blockComment = {start: "/*", end: "*/"};
this.getNextLineIndent = function(state, line, tab) {
if (state == "start" || state == "keyword.statementEnd") {
return "";
} else {
return this.$getIndent(line); // Keep whatever indent the previous line has
this.getNextLineIndent = function(state, line, tab) {
if (state == "start" || state == "keyword.statementEnd") {
return "";
} else {
return this.$getIndent(line); // Keep whatever indent the previous line has
}
}
}
}).call(Mode.prototype);
}).call(Mode.prototype);
exports.Mode = Mode;
exports.Mode = Mode;
});

View file

@ -10,7 +10,10 @@ var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour;
var CStyleFoldMode = require("./folding/cstyle").FoldMode;
var Mode = function() {
this.$tokenizer = new Tokenizer(new PowershellHighlightRules().getRules());
var highlighter = new PowershellHighlightRules();
this.$tokenizer = new Tokenizer(highlighter.getRules());
this.$keywordList = highlighter.$keywordList;
this.$outdent = new MatchingBraceOutdent();
this.$behaviour = new CstyleBehaviour();
this.foldingRules = new CStyleFoldMode({start: "^\\s*(<#)", end: "^[#\\s]>\\s*$"});

View file

@ -39,7 +39,9 @@ var PythonFoldMode = require("./folding/pythonic").FoldMode;
var Range = require("../range").Range;
var Mode = function() {
this.$tokenizer = new Tokenizer(new PythonHighlightRules().getRules());
var highlighter = new PythonHighlightRules();
this.$tokenizer = new Tokenizer(highlighter.getRules());
this.$keywordList = highlighter.$keywordList;
this.foldingRules = new PythonFoldMode("\\:");
};
oop.inherits(Mode, TextMode);

View file

@ -40,7 +40,10 @@ var Range = require("../range").Range;
var FoldMode = require("./folding/coffee").FoldMode;
var Mode = function() {
this.$tokenizer = new Tokenizer(new RubyHighlightRules().getRules());
var highlighter = new RubyHighlightRules();
this.$tokenizer = new Tokenizer(highlighter.getRules());
this.$keywordList = highlighter.$keywordList;
this.$outdent = new MatchingBraceOutdent();
this.foldingRules = new FoldMode();
};

View file

@ -41,7 +41,10 @@ var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour;
var CStyleFoldMode = require("./folding/cstyle").FoldMode;
var Mode = function() {
this.$tokenizer = new Tokenizer(new scadHighlightRules().getRules());
var highlighter = new scadHighlightRules();
this.$tokenizer = new Tokenizer(highlighter.getRules());
this.$keywordList = highlighter.$keywordList;
this.$outdent = new MatchingBraceOutdent();
this.$behaviour = new CstyleBehaviour();
this.foldingRules = new CStyleFoldMode();

View file

@ -9,7 +9,9 @@ var ScalaHighlightRules = require("./scala_highlight_rules").ScalaHighlightRules
var Mode = function() {
JavaScriptMode.call(this);
this.$tokenizer = new Tokenizer(new ScalaHighlightRules().getRules());
var highlighter = new ScalaHighlightRules();
this.$tokenizer = new Tokenizer(highlighter.getRules());
this.$keywordList = highlighter.$keywordList;
};
oop.inherits(Mode, JavaScriptMode);

View file

@ -38,7 +38,10 @@ var ShHighlightRules = require("./sh_highlight_rules").ShHighlightRules;
var Range = require("../range").Range;
var Mode = function() {
this.$tokenizer = new Tokenizer(new ShHighlightRules().getRules());
var highlighter = new ShHighlightRules();
this.$tokenizer = new Tokenizer(highlighter.getRules());
this.$keywordList = highlighter.$keywordList;
};
oop.inherits(Mode, TextMode);

View file

@ -38,7 +38,10 @@ var SqlHighlightRules = require("./sql_highlight_rules").SqlHighlightRules;
var Range = require("../range").Range;
var Mode = function() {
this.$tokenizer = new Tokenizer(new SqlHighlightRules().getRules());
var highlighter = new SqlHighlightRules();
this.$tokenizer = new Tokenizer(highlighter.getRules());
this.$keywordList = highlighter.$keywordList;
};
oop.inherits(Mode, TextMode);

View file

@ -51,6 +51,7 @@ var Mode = function() {
this.foldingRules = new FoldMode();
this.$tokenizer = new Tokenizer(highlighter.getRules());
this.$keywordList = highlighter.$keywordList;
};
oop.inherits(Mode, TextMode);

View file

@ -325,7 +325,25 @@ var Mode = function() {
}
}
};
this.getKeywords = function() {
var rules = this.$tokenizer.rules;
var keywords = [];
for (var rule in rules) {
var ruleItr = rules[rule];
for (var r = 0, l = ruleItr.length; r < l; r++) {
if (typeof ruleItr[r].token === "string") {
if (/keyword/.test(ruleItr[r].token))
keywords.push(ruleItr[r].regex);
else if (/support/.test(ruleItr[r].token))
keywords.push(ruleItr[r].regex);
}
}
}
return keywords.concat(this.$keywordList || []);
};
}).call(Mode.prototype);
exports.Mode = Mode;

View file

@ -204,6 +204,7 @@ var TextHighlightRules = function() {
for (var i = list.length; i--; )
keywords[list[i]] = className;
});
this.$keywordList = Object.keys(keywords);
map = null;
return ignoreCase
? function(value) {return keywords[value.toLowerCase()] || defaultToken }