| Index: third_party/WebKit/Source/devtools/front_end/cm_modes/coffeescript.js
|
| diff --git a/third_party/WebKit/Source/devtools/front_end/cm_modes/coffeescript.js b/third_party/WebKit/Source/devtools/front_end/cm_modes/coffeescript.js
|
| index 16956501262839daf9bdfc57f32dcbbda64c60f0..adf2184fd7da5cc8463cfecb0843ce245f0e89bf 100644
|
| --- a/third_party/WebKit/Source/devtools/front_end/cm_modes/coffeescript.js
|
| +++ b/third_party/WebKit/Source/devtools/front_end/cm_modes/coffeescript.js
|
| @@ -15,17 +15,17 @@
|
| })(function(CodeMirror) {
|
| "use strict";
|
|
|
| -CodeMirror.defineMode("coffeescript", function(conf) {
|
| +CodeMirror.defineMode("coffeescript", function(conf, parserConf) {
|
| var ERRORCLASS = "error";
|
|
|
| function wordRegexp(words) {
|
| return new RegExp("^((" + words.join(")|(") + "))\\b");
|
| }
|
|
|
| - var operators = /^(?:->|=>|\+[+=]?|-[\-=]?|\*[\*=]?|\/[\/=]?|[=!]=|<[><]?=?|>>?=?|%=?|&=?|\|=?|\^=?|\~|!|\?)/;
|
| + var operators = /^(?:->|=>|\+[+=]?|-[\-=]?|\*[\*=]?|\/[\/=]?|[=!]=|<[><]?=?|>>?=?|%=?|&=?|\|=?|\^=?|\~|!|\?|(or|and|\|\||&&|\?)=)/;
|
| var delimiters = /^(?:[()\[\]{},:`=;]|\.\.?\.?)/;
|
| var identifiers = /^[_A-Za-z$][_A-Za-z$0-9]*/;
|
| - var properties = /^(@|this\.)[_A-Za-z$][_A-Za-z$0-9]*/;
|
| + var atProp = /^@[_A-Za-z$][_A-Za-z$0-9]*/;
|
|
|
| var wordOperators = wordRegexp(["and", "or", "not",
|
| "is", "isnt", "in",
|
| @@ -34,7 +34,7 @@ CodeMirror.defineMode("coffeescript", function(conf) {
|
| "switch", "try", "catch", "finally", "class"];
|
| var commonKeywords = ["break", "by", "continue", "debugger", "delete",
|
| "do", "in", "of", "new", "return", "then",
|
| - "this", "throw", "when", "until"];
|
| + "this", "@", "throw", "when", "until", "extends"];
|
|
|
| var keywords = wordRegexp(indentKeywords.concat(commonKeywords));
|
|
|
| @@ -145,6 +145,8 @@ CodeMirror.defineMode("coffeescript", function(conf) {
|
| }
|
| }
|
|
|
| +
|
| +
|
| // Handle operators and delimiters
|
| if (stream.match(operators) || stream.match(wordOperators)) {
|
| return "operator";
|
| @@ -157,6 +159,10 @@ CodeMirror.defineMode("coffeescript", function(conf) {
|
| return "atom";
|
| }
|
|
|
| + if (stream.match(atProp) || state.prop && stream.match(identifiers)) {
|
| + return "property";
|
| + }
|
| +
|
| if (stream.match(keywords)) {
|
| return "keyword";
|
| }
|
| @@ -165,10 +171,6 @@ CodeMirror.defineMode("coffeescript", function(conf) {
|
| return "variable";
|
| }
|
|
|
| - if (stream.match(properties)) {
|
| - return "property";
|
| - }
|
| -
|
| // Handle non-detected items
|
| stream.next();
|
| return ERRORCLASS;
|
| @@ -191,7 +193,7 @@ CodeMirror.defineMode("coffeescript", function(conf) {
|
| }
|
| }
|
| if (singleline) {
|
| - if (conf.mode.singleLineStringErrors) {
|
| + if (parserConf.singleLineStringErrors) {
|
| outclass = ERRORCLASS;
|
| } else {
|
| state.tokenize = tokenBase;
|
| @@ -217,7 +219,7 @@ CodeMirror.defineMode("coffeescript", function(conf) {
|
| type = type || "coffee";
|
| var offset = 0, align = false, alignOffset = null;
|
| for (var scope = state.scope; scope; scope = scope.prev) {
|
| - if (scope.type === "coffee") {
|
| + if (scope.type === "coffee" || scope.type == "}") {
|
| offset = scope.offset + conf.indentUnit;
|
| break;
|
| }
|
| @@ -265,24 +267,11 @@ CodeMirror.defineMode("coffeescript", function(conf) {
|
| var style = state.tokenize(stream, state);
|
| var current = stream.current();
|
|
|
| - // Handle "." connected identifiers
|
| - if (current === ".") {
|
| - style = state.tokenize(stream, state);
|
| - current = stream.current();
|
| - if (/^\.[\w$]+$/.test(current)) {
|
| - return "variable";
|
| - } else {
|
| - return ERRORCLASS;
|
| - }
|
| - }
|
| -
|
| // Handle scope changes.
|
| if (current === "return") {
|
| - state.dedent += 1;
|
| + state.dedent = true;
|
| }
|
| - if (((current === "->" || current === "=>") &&
|
| - !state.lambda &&
|
| - !stream.peek())
|
| + if (((current === "->" || current === "=>") && stream.eol())
|
| || style === "indent") {
|
| indent(stream, state);
|
| }
|
| @@ -310,9 +299,10 @@ CodeMirror.defineMode("coffeescript", function(conf) {
|
| if (state.scope.type == current)
|
| state.scope = state.scope.prev;
|
| }
|
| - if (state.dedent > 0 && stream.eol() && state.scope.type == "coffee") {
|
| - if (state.scope.prev) state.scope = state.scope.prev;
|
| - state.dedent -= 1;
|
| + if (state.dedent && stream.eol()) {
|
| + if (state.scope.type == "coffee" && state.scope.prev)
|
| + state.scope = state.scope.prev;
|
| + state.dedent = false;
|
| }
|
|
|
| return style;
|
| @@ -323,8 +313,7 @@ CodeMirror.defineMode("coffeescript", function(conf) {
|
| return {
|
| tokenize: tokenBase,
|
| scope: {offset:basecolumn || 0, type:"coffee", prev: null, align: false},
|
| - lastToken: null,
|
| - lambda: false,
|
| + prop: false,
|
| dedent: 0
|
| };
|
| },
|
| @@ -334,12 +323,9 @@ CodeMirror.defineMode("coffeescript", function(conf) {
|
| if (fillAlign && stream.sol()) fillAlign.align = false;
|
|
|
| var style = tokenLexer(stream, state);
|
| - if (fillAlign && style && style != "comment") fillAlign.align = true;
|
| -
|
| - state.lastToken = {style:style, content: stream.current()};
|
| -
|
| - if (stream.eol() && stream.lambda) {
|
| - state.lambda = false;
|
| + if (style && style != "comment") {
|
| + if (fillAlign) fillAlign.align = true;
|
| + state.prop = style == "punctuation" && stream.current() == "."
|
| }
|
|
|
| return style;
|
| @@ -364,5 +350,6 @@ CodeMirror.defineMode("coffeescript", function(conf) {
|
| });
|
|
|
| CodeMirror.defineMIME("text/x-coffeescript", "coffeescript");
|
| +CodeMirror.defineMIME("text/coffeescript", "coffeescript");
|
|
|
| });
|
|
|