Vergleich admin/jscripts/codemirror/mode/javascript/javascript.js - 1.8.5 - 1.8.26

  Keine Änderungen   Hinzugefügt   Modifiziert   Entfernt
Zeile 2Zeile 2
// Distributed under an MIT license: http://codemirror.net/LICENSE

// Distributed under an MIT license: http://codemirror.net/LICENSE


// TODO actually recognize syntax of TypeScript constructs

 

(function(mod) {
if (typeof exports == "object" && typeof module == "object") // CommonJS


(function(mod) {
if (typeof exports == "object" && typeof module == "object") // CommonJS

Zeile 30Zeile 28

var jsKeywords = {
"if": kw("if"), "while": A, "with": A, "else": B, "do": B, "try": B, "finally": B,


var jsKeywords = {
"if": kw("if"), "while": A, "with": A, "else": B, "do": B, "try": B, "finally": B,

      "return": C, "break": C, "continue": C, "new": C, "delete": C, "throw": C, "debugger": C,

      "return": C, "break": C, "continue": C, "new": kw("new"), "delete": C, "void": C, "throw": C, "debugger": C,

      "var": kw("var"), "const": kw("var"), "let": kw("var"),
"function": kw("function"), "catch": kw("catch"),
"for": kw("for"), "switch": kw("switch"), "case": kw("case"), "default": kw("default"),
"in": operator, "typeof": operator, "instanceof": operator,
"true": atom, "false": atom, "null": atom, "undefined": atom, "NaN": atom, "Infinity": atom,

      "var": kw("var"), "const": kw("var"), "let": kw("var"),
"function": kw("function"), "catch": kw("catch"),
"for": kw("for"), "switch": kw("switch"), "case": kw("case"), "default": kw("default"),
"in": operator, "typeof": operator, "instanceof": operator,
"true": atom, "false": atom, "null": atom, "undefined": atom, "NaN": atom, "Infinity": atom,

      "this": kw("this"), "module": kw("module"), "class": kw("class"), "super": kw("atom"),
"yield": C, "export": kw("export"), "import": kw("import"), "extends": C


      "this": kw("this"), "class": kw("class"), "super": kw("atom"),
"yield": C, "export": kw("export"), "import": kw("import"), "extends": C,
"await": C

    };

// Extend the 'normal' keywords with the TypeScript language extensions
if (isTS) {

    };

// Extend the 'normal' keywords with the TypeScript language extensions
if (isTS) {

      var type = {type: "variable", style: "variable-3"};

      var type = {type: "variable", style: "type"};

      var tsKeywords = {
// object-like things

      var tsKeywords = {
// object-like things

        "interface": kw("interface"),
"extends": kw("extends"),
"constructor": kw("constructor"),



        "interface": kw("class"),
"implements": C,
"namespace": C,
"module": kw("module"),
"enum": kw("module"),


// scope modifiers


// scope modifiers

        "public": kw("public"),
"private": kw("private"),
"protected": kw("protected"),
"static": kw("static"),


        "public": kw("modifier"),
"private": kw("modifier"),
"protected": kw("modifier"),
"abstract": kw("modifier"),
"readonly": kw("modifier"),


// types


// types

        "string": type, "number": type, "bool": type, "any": type

        "string": type, "number": type, "boolean": type, "any": type

      };

for (var attr in tsKeywords) {

      };

for (var attr in tsKeywords) {

Zeile 67Zeile 69
    return jsKeywords;
}();


    return jsKeywords;
}();


  var isOperatorChar = /[+\-*&%=<>!?|~^]/;

  var isOperatorChar = /[+\-*&%=<>!?|~^@]/;

  var isJsonldKeyword = /^@(context|id|value|language|type|container|list|set|reverse|index|base|vocab|graph)"/;

function readRegexp(stream) {

  var isJsonldKeyword = /^@(context|id|value|language|type|container|list|set|reverse|index|base|vocab|graph)"/;

function readRegexp(stream) {

Zeile 104Zeile 106
      return ret("=>", "operator");
} else if (ch == "0" && stream.eat(/x/i)) {
stream.eatWhile(/[\da-f]/i);

      return ret("=>", "operator");
} else if (ch == "0" && stream.eat(/x/i)) {
stream.eatWhile(/[\da-f]/i);

 
      return ret("number", "number");
} else if (ch == "0" && stream.eat(/o/i)) {
stream.eatWhile(/[0-7]/i);
return ret("number", "number");
} else if (ch == "0" && stream.eat(/b/i)) {
stream.eatWhile(/[01]/i);

      return ret("number", "number");
} else if (/\d/.test(ch)) {
stream.match(/^\d*(?:\.\d*)?(?:[eE][+\-]?\d+)?/);

      return ret("number", "number");
} else if (/\d/.test(ch)) {
stream.match(/^\d*(?:\.\d*)?(?:[eE][+\-]?\d+)?/);

Zeile 115Zeile 123
      } else if (stream.eat("/")) {
stream.skipToEnd();
return ret("comment", "comment");

      } else if (stream.eat("/")) {
stream.skipToEnd();
return ret("comment", "comment");

      } else if (state.lastType == "operator" || state.lastType == "keyword c" ||
state.lastType == "sof" || /^[\[{}\(,;:]$/.test(state.lastType)) {

      } else if (expressionAllowed(stream, state, 1)) {


        readRegexp(stream);

        readRegexp(stream);

        stream.eatWhile(/[gimy]/); // 'y' is "sticky" option in Mozilla

        stream.match(/^\b(([gimyu])(?![gimyu]*\2))+\b/);

        return ret("regexp", "string-2");
} else {
stream.eatWhile(isOperatorChar);

        return ret("regexp", "string-2");
} else {
stream.eatWhile(isOperatorChar);

Zeile 131Zeile 138
      stream.skipToEnd();
return ret("error", "error");
} else if (isOperatorChar.test(ch)) {

      stream.skipToEnd();
return ret("error", "error");
} else if (isOperatorChar.test(ch)) {

      stream.eatWhile(isOperatorChar);


      if (ch != ">" || !state.lexical || state.lexical.type != ">")
stream.eatWhile(isOperatorChar);

      return ret("operator", "operator", stream.current());
} else if (wordRE.test(ch)) {
stream.eatWhile(wordRE);

      return ret("operator", "operator", stream.current());
} else if (wordRE.test(ch)) {
stream.eatWhile(wordRE);

      var word = stream.current(), known = keywords.propertyIsEnumerable(word) && keywords[word];
return (known && state.lastType != ".") ? ret(known.type, known.style, word) :
ret("variable", "variable", word);








      var word = stream.current()
if (state.lastType != ".") {
if (keywords.propertyIsEnumerable(word)) {
var kw = keywords[word]
return ret(kw.type, kw.style, word)
}
if (word == "async" && stream.match(/^\s*[\(\w]/, false))
return ret("async", "keyword", word)
}
return ret("variable", "variable", word)

    }
}


    }
}


Zeile 193Zeile 208
    if (state.fatArrowAt) state.fatArrowAt = null;
var arrow = stream.string.indexOf("=>", stream.start);
if (arrow < 0) return;

    if (state.fatArrowAt) state.fatArrowAt = null;
var arrow = stream.string.indexOf("=>", stream.start);
if (arrow < 0) return;

 

if (isTS) { // Try to skip TypeScript return type declarations after the arguments
var m = /:\s*(?:\w+(?:<[^>]*>|\[\])?|\{[^}]*\})\s*$/.exec(stream.string.slice(stream.start, arrow))
if (m) arrow = m.index
}


var depth = 0, sawSomething = false;
for (var pos = arrow - 1; pos >= 0; --pos) {


var depth = 0, sawSomething = false;
for (var pos = arrow - 1; pos >= 0; --pos) {

Zeile 200Zeile 220
      var bracket = brackets.indexOf(ch);
if (bracket >= 0 && bracket < 3) {
if (!depth) { ++pos; break; }

      var bracket = brackets.indexOf(ch);
if (bracket >= 0 && bracket < 3) {
if (!depth) { ++pos; break; }

        if (--depth == 0) break;

        if (--depth == 0) { if (ch == "(") sawSomething = true; break; }

      } else if (bracket >= 3 && bracket < 6) {
++depth;
} else if (wordRE.test(ch)) {

      } else if (bracket >= 3 && bracket < 6) {
++depth;
} else if (wordRE.test(ch)) {

Zeile 275Zeile 295
      return false;
}
var state = cx.state;

      return false;
}
var state = cx.state;

 
    cx.marked = "def";

    if (state.context) {

    if (state.context) {

      cx.marked = "def";

 
      if (inList(state.localVars)) return;
state.localVars = {name: varname, next: state.localVars};
} else {

      if (inList(state.localVars)) return;
state.localVars = {name: varname, next: state.localVars};
} else {

Zeile 329Zeile 349

function statement(type, value) {
if (type == "var") return cont(pushlex("vardef", value.length), vardef, expect(";"), poplex);


function statement(type, value) {
if (type == "var") return cont(pushlex("vardef", value.length), vardef, expect(";"), poplex);

    if (type == "keyword a") return cont(pushlex("form"), expression, statement, poplex);

    if (type == "keyword a") return cont(pushlex("form"), parenExpr, statement, poplex);

    if (type == "keyword b") return cont(pushlex("form"), statement, poplex);
if (type == "{") return cont(pushlex("}"), block, poplex);
if (type == ";") return cont();
if (type == "if") {
if (cx.state.lexical.info == "else" && cx.state.cc[cx.state.cc.length - 1] == poplex)
cx.state.cc.pop()();

    if (type == "keyword b") return cont(pushlex("form"), statement, poplex);
if (type == "{") return cont(pushlex("}"), block, poplex);
if (type == ";") return cont();
if (type == "if") {
if (cx.state.lexical.info == "else" && cx.state.cc[cx.state.cc.length - 1] == poplex)
cx.state.cc.pop()();

      return cont(pushlex("form"), expression, statement, poplex, maybeelse);

      return cont(pushlex("form"), parenExpr, statement, poplex, maybeelse);

    }
if (type == "function") return cont(functiondef);
if (type == "for") return cont(pushlex("form"), forspec, statement, poplex);

    }
if (type == "function") return cont(functiondef);
if (type == "for") return cont(pushlex("form"), forspec, statement, poplex);

    if (type == "variable") return cont(pushlex("stat"), maybelabel);
if (type == "switch") return cont(pushlex("form"), expression, pushlex("}", "switch"), expect("{"),











    if (type == "variable") {
if (isTS && value == "type") {
cx.marked = "keyword"
return cont(typeexpr, expect("operator"), typeexpr, expect(";"));
} if (isTS && value == "declare") {
cx.marked = "keyword"
return cont(statement)
} else {
return cont(pushlex("stat"), maybelabel);
}
}
if (type == "switch") return cont(pushlex("form"), parenExpr, expect("{"), pushlex("}", "switch"),

                                      block, poplex, poplex);
if (type == "case") return cont(expression, expect(":"));
if (type == "default") return cont(expect(":"));
if (type == "catch") return cont(pushlex("form"), pushcontext, expect("("), funarg, expect(")"),
statement, poplex, popcontext);

                                      block, poplex, poplex);
if (type == "case") return cont(expression, expect(":"));
if (type == "default") return cont(expect(":"));
if (type == "catch") return cont(pushlex("form"), pushcontext, expect("("), funarg, expect(")"),
statement, poplex, popcontext);

    if (type == "module") return cont(pushlex("form"), pushcontext, afterModule, popcontext, poplex);

 
    if (type == "class") return cont(pushlex("form"), className, poplex);

    if (type == "class") return cont(pushlex("form"), className, poplex);

    if (type == "export") return cont(pushlex("form"), afterExport, poplex);
if (type == "import") return cont(pushlex("form"), afterImport, poplex);




    if (type == "export") return cont(pushlex("stat"), afterExport, poplex);
if (type == "import") return cont(pushlex("stat"), afterImport, poplex);
if (type == "module") return cont(pushlex("form"), pattern, expect("{"), pushlex("}"), block, poplex, poplex)
if (type == "async") return cont(statement)
if (value == "@") return cont(expression, statement)

    return pass(pushlex("stat"), expression, expect(";"), poplex);
}
function expression(type) {

    return pass(pushlex("stat"), expression, expect(";"), poplex);
}
function expression(type) {

Zeile 358Zeile 390
  }
function expressionNoComma(type) {
return expressionInner(type, true);

  }
function expressionNoComma(type) {
return expressionInner(type, true);

  }





  }
function parenExpr(type) {
if (type != "(") return pass()
return cont(pushlex(")"), expression, expect(")"), poplex)
}

  function expressionInner(type, noComma) {
if (cx.state.fatArrowAt == cx.stream.start) {
var body = noComma ? arrowBodyNoComma : arrowBody;

  function expressionInner(type, noComma) {
if (cx.state.fatArrowAt == cx.stream.start) {
var body = noComma ? arrowBodyNoComma : arrowBody;

      if (type == "(") return cont(pushcontext, pushlex(")"), commasep(pattern, ")"), poplex, expect("=>"), body, popcontext);

      if (type == "(") return cont(pushcontext, pushlex(")"), commasep(funarg, ")"), poplex, expect("=>"), body, popcontext);

      else if (type == "variable") return pass(pushcontext, pattern, expect("=>"), body, popcontext);
}

var maybeop = noComma ? maybeoperatorNoComma : maybeoperatorComma;
if (atomicTypes.hasOwnProperty(type)) return cont(maybeop);
if (type == "function") return cont(functiondef, maybeop);

      else if (type == "variable") return pass(pushcontext, pattern, expect("=>"), body, popcontext);
}

var maybeop = noComma ? maybeoperatorNoComma : maybeoperatorComma;
if (atomicTypes.hasOwnProperty(type)) return cont(maybeop);
if (type == "function") return cont(functiondef, maybeop);

    if (type == "keyword c") return cont(noComma ? maybeexpressionNoComma : maybeexpression);
if (type == "(") return cont(pushlex(")"), maybeexpression, comprehension, expect(")"), poplex, maybeop);


    if (type == "class") return cont(pushlex("form"), classExpression, poplex);
if (type == "keyword c" || type == "async") return cont(noComma ? maybeexpressionNoComma : maybeexpression);
if (type == "(") return cont(pushlex(")"), maybeexpression, expect(")"), poplex, maybeop);

    if (type == "operator" || type == "spread") return cont(noComma ? expressionNoComma : expression);
if (type == "[") return cont(pushlex("]"), arrayLiteral, poplex, maybeop);
if (type == "{") return contCommasep(objprop, "}", null, maybeop);

    if (type == "operator" || type == "spread") return cont(noComma ? expressionNoComma : expression);
if (type == "[") return cont(pushlex("]"), arrayLiteral, poplex, maybeop);
if (type == "{") return contCommasep(objprop, "}", null, maybeop);

    if (type == "quasi") { return pass(quasi, maybeop); }


    if (type == "quasi") return pass(quasi, maybeop);
if (type == "new") return cont(maybeTarget(noComma));

    return cont();
}
function maybeexpression(type) {

    return cont();
}
function maybeexpression(type) {

Zeile 395Zeile 433
    var expr = noComma == false ? expression : expressionNoComma;
if (type == "=>") return cont(pushcontext, noComma ? arrowBodyNoComma : arrowBody, popcontext);
if (type == "operator") {

    var expr = noComma == false ? expression : expressionNoComma;
if (type == "=>") return cont(pushcontext, noComma ? arrowBodyNoComma : arrowBody, popcontext);
if (type == "operator") {

      if (/\+\+|--/.test(value)) return cont(me);

      if (/\+\+|--/.test(value) || isTS && value == "!") return cont(me);

      if (value == "?") return cont(expression, expect(":"), expr);
return cont(expr);
}

      if (value == "?") return cont(expression, expect(":"), expr);
return cont(expr);
}

Zeile 404Zeile 442
    if (type == "(") return contCommasep(expressionNoComma, ")", "call", me);
if (type == ".") return cont(property, me);
if (type == "[") return cont(pushlex("]"), maybeexpression, expect("]"), poplex, me);

    if (type == "(") return contCommasep(expressionNoComma, ")", "call", me);
if (type == ".") return cont(property, me);
if (type == "[") return cont(pushlex("]"), maybeexpression, expect("]"), poplex, me);

 
    if (isTS && value == "as") { cx.marked = "keyword"; return cont(typeexpr, me) }
if (type == "regexp") {
cx.state.lastType = cx.marked = "operator"
cx.stream.backUp(cx.stream.pos - cx.stream.start - 1)
return cont(expr)
}

  }
function quasi(type, value) {
if (type != "quasi") return pass();

  }
function quasi(type, value) {
if (type != "quasi") return pass();

Zeile 424Zeile 468
  function arrowBodyNoComma(type) {
findFatArrow(cx.stream, cx.state);
return pass(type == "{" ? statement : expressionNoComma);

  function arrowBodyNoComma(type) {
findFatArrow(cx.stream, cx.state);
return pass(type == "{" ? statement : expressionNoComma);

 
  }
function maybeTarget(noComma) {
return function(type) {
if (type == ".") return cont(noComma ? targetNoComma : target);
else if (type == "variable" && isTS) return cont(maybeTypeArgs, noComma ? maybeoperatorNoComma : maybeoperatorComma)
else return pass(noComma ? expressionNoComma : expression);
};
}
function target(_, value) {
if (value == "target") { cx.marked = "keyword"; return cont(maybeoperatorComma); }
}
function targetNoComma(_, value) {
if (value == "target") { cx.marked = "keyword"; return cont(maybeoperatorNoComma); }

  }
function maybelabel(type) {
if (type == ":") return cont(poplex, statement);

  }
function maybelabel(type) {
if (type == ":") return cont(poplex, statement);

Zeile 433Zeile 490
    if (type == "variable") {cx.marked = "property"; return cont();}
}
function objprop(type, value) {

    if (type == "variable") {cx.marked = "property"; return cont();}
}
function objprop(type, value) {

    if (type == "variable" || cx.style == "keyword") {




    if (type == "async") {
cx.marked = "property";
return cont(objprop);
} else if (type == "variable" || cx.style == "keyword") {

      cx.marked = "property";
if (value == "get" || value == "set") return cont(getterSetter);

      cx.marked = "property";
if (value == "get" || value == "set") return cont(getterSetter);

 
      var m // Work around fat-arrow-detection complication for detecting typescript typed arrow params
if (isTS && cx.state.fatArrowAt == cx.stream.start && (m = cx.stream.match(/^\s*:\s*/, false)))
cx.state.fatArrowAt = cx.stream.pos + m[0].length

      return cont(afterprop);
} else if (type == "number" || type == "string") {
cx.marked = jsonldMode ? "property" : (cx.style + " property");
return cont(afterprop);
} else if (type == "jsonld-keyword") {
return cont(afterprop);

      return cont(afterprop);
} else if (type == "number" || type == "string") {
cx.marked = jsonldMode ? "property" : (cx.style + " property");
return cont(afterprop);
} else if (type == "jsonld-keyword") {
return cont(afterprop);

 
    } else if (type == "modifier") {
return cont(objprop)

    } else if (type == "[") {
return cont(expression, expect("]"), afterprop);

    } else if (type == "[") {
return cont(expression, expect("]"), afterprop);

 
    } else if (type == "spread") {
return cont(expression, afterprop);
} else if (type == ":") {
return pass(afterprop)

    }
}
function getterSetter(type) {

    }
}
function getterSetter(type) {

Zeile 455Zeile 524
    if (type == ":") return cont(expressionNoComma);
if (type == "(") return pass(functiondef);
}

    if (type == ":") return cont(expressionNoComma);
if (type == "(") return pass(functiondef);
}

  function commasep(what, end) {
function proceed(type) {
if (type == ",") {

  function commasep(what, end, sep) {
function proceed(type, value) {
if (sep ? sep.indexOf(type) > -1 : type == ",") {

        var lex = cx.state.lexical;
if (lex.info == "call") lex.pos = (lex.pos || 0) + 1;

        var lex = cx.state.lexical;
if (lex.info == "call") lex.pos = (lex.pos || 0) + 1;

        return cont(what, proceed);




        return cont(function(type, value) {
if (type == end || value == end) return pass()
return pass(what)
}, proceed);

      }

      }

      if (type == end) return cont();

      if (type == end || value == end) return cont();

      return cont(expect(end));
}

      return cont(expect(end));
}

    return function(type) {
if (type == end) return cont();

    return function(type, value) {
if (type == end || value == end) return cont();

      return pass(what, proceed);
};
}

      return pass(what, proceed);
};
}

Zeile 479Zeile 551
    if (type == "}") return cont();
return pass(statement, block);
}

    if (type == "}") return cont();
return pass(statement, block);
}

  function maybetype(type) {
if (isTS && type == ":") return cont(typedef);
}
function typedef(type) {
if (type == "variable"){cx.marked = "variable-3"; return cont();}












































  function maybetype(type, value) {
if (isTS) {
if (type == ":") return cont(typeexpr);
if (value == "?") return cont(maybetype);
}
}
function typeexpr(type, value) {
if (type == "variable") {
if (value == "keyof") {
cx.marked = "keyword"
return cont(typeexpr)
} else {
cx.marked = "type"
return cont(afterType)
}
}
if (type == "string" || type == "number" || type == "atom") return cont(afterType);
if (type == "[") return cont(pushlex("]"), commasep(typeexpr, "]", ","), poplex, afterType)
if (type == "{") return cont(pushlex("}"), commasep(typeprop, "}", ",;"), poplex, afterType)
if (type == "(") return cont(commasep(typearg, ")"), maybeReturnType)
}
function maybeReturnType(type) {
if (type == "=>") return cont(typeexpr)
}
function typeprop(type, value) {
if (type == "variable" || cx.style == "keyword") {
cx.marked = "property"
return cont(typeprop)
} else if (value == "?") {
return cont(typeprop)
} else if (type == ":") {
return cont(typeexpr)
} else if (type == "[") {
return cont(expression, maybetype, expect("]"), typeprop)
}
}
function typearg(type) {
if (type == "variable") return cont(typearg)
else if (type == ":") return cont(typeexpr)
}
function afterType(type, value) {
if (value == "<") return cont(pushlex(">"), commasep(typeexpr, ">"), poplex, afterType)
if (value == "|" || type == ".") return cont(typeexpr)
if (type == "[") return cont(expect("]"), afterType)
if (value == "extends") return cont(typeexpr)
}
function maybeTypeArgs(_, value) {
if (value == "<") return cont(pushlex(">"), commasep(typeexpr, ">"), poplex, afterType)

  }
function vardef() {
return pass(pattern, maybetype, maybeAssign, vardefCont);
}
function pattern(type, value) {

  }
function vardef() {
return pass(pattern, maybetype, maybeAssign, vardefCont);
}
function pattern(type, value) {

 
    if (type == "modifier") return cont(pattern)

    if (type == "variable") { register(value); return cont(); }

    if (type == "variable") { register(value); return cont(); }

 
    if (type == "spread") return cont(pattern);

    if (type == "[") return contCommasep(pattern, "]");
if (type == "{") return contCommasep(proppattern, "}");
}

    if (type == "[") return contCommasep(pattern, "]");
if (type == "{") return contCommasep(proppattern, "}");
}

Zeile 497Zeile 614
    if (type == "variable" && !cx.stream.match(/^\s*:/, false)) {
register(value);
return cont(maybeAssign);

    if (type == "variable" && !cx.stream.match(/^\s*:/, false)) {
register(value);
return cont(maybeAssign);

    }

    }

    if (type == "variable") cx.marked = "property";

    if (type == "variable") cx.marked = "property";

 
    if (type == "spread") return cont(pattern);
if (type == "}") return pass();

    return cont(expect(":"), pattern, maybeAssign);

    return cont(expect(":"), pattern, maybeAssign);

  }

  }

  function maybeAssign(_type, value) {
if (value == "=") return cont(expressionNoComma);
}
function vardefCont(type) {
if (type == ",") return cont(vardef);

  function maybeAssign(_type, value) {
if (value == "=") return cont(expressionNoComma);
}
function vardefCont(type) {
if (type == ",") return cont(vardef);

  }

  }

  function maybeelse(type, value) {
if (type == "keyword b" && value == "else") return cont(pushlex("form", "else"), statement, poplex);
}

  function maybeelse(type, value) {
if (type == "keyword b" && value == "else") return cont(pushlex("form", "else"), statement, poplex);
}

Zeile 534Zeile 653
  function functiondef(type, value) {
if (value == "*") {cx.marked = "keyword"; return cont(functiondef);}
if (type == "variable") {register(value); return cont(functiondef);}

  function functiondef(type, value) {
if (value == "*") {cx.marked = "keyword"; return cont(functiondef);}
if (type == "variable") {register(value); return cont(functiondef);}

    if (type == "(") return cont(pushcontext, pushlex(")"), commasep(funarg, ")"), poplex, statement, popcontext);


    if (type == "(") return cont(pushcontext, pushlex(")"), commasep(funarg, ")"), poplex, maybetype, statement, popcontext);
if (isTS && value == "<") return cont(pushlex(">"), commasep(typeexpr, ">"), poplex, functiondef)

  }

  }

  function funarg(type) {
if (type == "spread") return cont(funarg);
return pass(pattern, maybetype);







  function funarg(type, value) {
if (value == "@") cont(expression, funarg)
if (type == "spread" || type == "modifier") return cont(funarg);
return pass(pattern, maybetype, maybeAssign);
}
function classExpression(type, value) {
// Class expressions may have an optional name.
if (type == "variable") return className(type, value);
return classNameAfter(type, value);

  }
function className(type, value) {
if (type == "variable") {register(value); return cont(classNameAfter);}
}
function classNameAfter(type, value) {

  }
function className(type, value) {
if (type == "variable") {register(value); return cont(classNameAfter);}
}
function classNameAfter(type, value) {

    if (value == "extends") return cont(expression, classNameAfter);



    if (value == "<") return cont(pushlex(">"), commasep(typeexpr, ">"), poplex, classNameAfter)
if (value == "extends" || value == "implements" || (isTS && type == ","))
return cont(isTS ? typeexpr : expression, classNameAfter);

    if (type == "{") return cont(pushlex("}"), classBody, poplex);

    if (type == "{") return cont(pushlex("}"), classBody, poplex);

  }

  }

  function classBody(type, value) {

  function classBody(type, value) {

 
    if (type == "modifier" || type == "async" ||
(type == "variable" &&
(value == "static" || value == "get" || value == "set") &&
cx.stream.match(/^\s+[\w$\xa1-\uffff]/, false))) {
cx.marked = "keyword";
return cont(classBody);
}

    if (type == "variable" || cx.style == "keyword") {
cx.marked = "property";

    if (type == "variable" || cx.style == "keyword") {
cx.marked = "property";

      if (value == "get" || value == "set") return cont(classGetterSetter, functiondef, classBody);
return cont(functiondef, classBody);

      return cont(isTS ? classfield : functiondef, classBody);


    }

    }

 
    if (type == "[")
return cont(expression, expect("]"), isTS ? classfield : functiondef, classBody)

    if (value == "*") {
cx.marked = "keyword";
return cont(classBody);
}
if (type == ";") return cont(classBody);
if (type == "}") return cont();

    if (value == "*") {
cx.marked = "keyword";
return cont(classBody);
}
if (type == ";") return cont(classBody);
if (type == "}") return cont();

 
    if (value == "@") return cont(expression, classBody)

  }

  }

  function classGetterSetter(type) {
if (type != "variable") return pass();
cx.marked = "property";
return cont();
}
function afterModule(type, value) {
if (type == "string") return cont(statement);
if (type == "variable") { register(value); return cont(maybeFrom); }

  function classfield(type, value) {
if (value == "?") return cont(classfield)
if (type == ":") return cont(typeexpr, maybeAssign)
if (value == "=") return cont(expressionNoComma)
return pass(functiondef)




  }

  }

  function afterExport(_type, value) {

  function afterExport(type, value) {

    if (value == "*") { cx.marked = "keyword"; return cont(maybeFrom, expect(";")); }
if (value == "default") { cx.marked = "keyword"; return cont(expression, expect(";")); }

    if (value == "*") { cx.marked = "keyword"; return cont(maybeFrom, expect(";")); }
if (value == "default") { cx.marked = "keyword"; return cont(expression, expect(";")); }

 
    if (type == "{") return cont(commasep(exportField, "}"), maybeFrom, expect(";"));

    return pass(statement);

    return pass(statement);

 
  }
function exportField(type, value) {
if (value == "as") { cx.marked = "keyword"; return cont(expect("variable")); }
if (type == "variable") return pass(expressionNoComma, exportField);

  }
function afterImport(type) {
if (type == "string") return cont();

  }
function afterImport(type) {
if (type == "string") return cont();

    return pass(importSpec, maybeFrom);
}

    return pass(importSpec, maybeMoreImports, maybeFrom);
}

  function importSpec(type, value) {
if (type == "{") return contCommasep(importSpec, "}");
if (type == "variable") register(value);

  function importSpec(type, value) {
if (type == "{") return contCommasep(importSpec, "}");
if (type == "variable") register(value);

    return cont();








    if (value == "*") cx.marked = "keyword";
return cont(maybeAs);
}
function maybeMoreImports(type) {
if (type == ",") return cont(importSpec, maybeMoreImports)
}
function maybeAs(_type, value) {
if (value == "as") { cx.marked = "keyword"; return cont(importSpec); }

  }
function maybeFrom(_type, value) {
if (value == "from") { cx.marked = "keyword"; return cont(expression); }
}
function arrayLiteral(type) {
if (type == "]") return cont();

  }
function maybeFrom(_type, value) {
if (value == "from") { cx.marked = "keyword"; return cont(expression); }
}
function arrayLiteral(type) {
if (type == "]") return cont();

    return pass(expressionNoComma, maybeArrayComprehension);
}
function maybeArrayComprehension(type) {
if (type == "for") return pass(comprehension, expect("]"));
if (type == ",") return cont(commasep(maybeexpressionNoComma, "]"));

 
    return pass(commasep(expressionNoComma, "]"));
}

    return pass(commasep(expressionNoComma, "]"));
}

  function comprehension(type) {
if (type == "for") return cont(forspec, comprehension);
if (type == "if") return cont(expression, comprehension);
}








  function isContinuedStatement(state, textAfter) {
return state.lastType == "operator" || state.lastType == "," ||
isOperatorChar.test(textAfter.charAt(0)) ||
/[,.]/.test(textAfter.charAt(0));

  function isContinuedStatement(state, textAfter) {
return state.lastType == "operator" || state.lastType == "," ||
isOperatorChar.test(textAfter.charAt(0)) ||
/[,.]/.test(textAfter.charAt(0));

 
  }

function expressionAllowed(stream, state, backUp) {
return state.tokenize == tokenBase &&
/^(?:operator|sof|keyword [bc]|case|new|export|default|spread|[\[{}\(,;:]|=>)$/.test(state.lastType) ||
(state.lastType == "quasi" && /\{\s*$/.test(stream.string.slice(0, stream.pos - (backUp || 0))))

  }

// Interface

  }

// Interface

Zeile 617Zeile 760
        lexical: new JSLexical((basecolumn || 0) - indentUnit, 0, "block", false),
localVars: parserConfig.localVars,
context: parserConfig.localVars && {vars: parserConfig.localVars},

        lexical: new JSLexical((basecolumn || 0) - indentUnit, 0, "block", false),
localVars: parserConfig.localVars,
context: parserConfig.localVars && {vars: parserConfig.localVars},

        indented: 0

        indented: basecolumn || 0

      };
if (parserConfig.globalVars && typeof parserConfig.globalVars == "object")
state.globalVars = parserConfig.globalVars;
return state;

      };
if (parserConfig.globalVars && typeof parserConfig.globalVars == "object")
state.globalVars = parserConfig.globalVars;
return state;

    },


    },


    token: function(stream, state) {
if (stream.sol()) {
if (!state.lexical.hasOwnProperty("align"))

    token: function(stream, state) {
if (stream.sol()) {
if (!state.lexical.hasOwnProperty("align"))

Zeile 641Zeile 784
    indent: function(state, textAfter) {
if (state.tokenize == tokenComment) return CodeMirror.Pass;
if (state.tokenize != tokenBase) return 0;

    indent: function(state, textAfter) {
if (state.tokenize == tokenComment) return CodeMirror.Pass;
if (state.tokenize != tokenBase) return 0;

      var firstChar = textAfter && textAfter.charAt(0), lexical = state.lexical;

      var firstChar = textAfter && textAfter.charAt(0), lexical = state.lexical, top

      // Kludge to prevent 'maybelse' from blocking lexical scope pops
if (!/^\s*else\b/.test(textAfter)) for (var i = state.cc.length - 1; i >= 0; --i) {
var c = state.cc[i];
if (c == poplex) lexical = lexical.prev;
else if (c != maybeelse) break;
}

      // Kludge to prevent 'maybelse' from blocking lexical scope pops
if (!/^\s*else\b/.test(textAfter)) for (var i = state.cc.length - 1; i >= 0; --i) {
var c = state.cc[i];
if (c == poplex) lexical = lexical.prev;
else if (c != maybeelse) break;
}

      if (lexical.type == "stat" && firstChar == "}") lexical = lexical.prev;





      while ((lexical.type == "stat" || lexical.type == "form") &&
(firstChar == "}" || ((top = state.cc[state.cc.length - 1]) &&
(top == maybeoperatorComma || top == maybeoperatorNoComma) &&
!/^[,\.=+\-*:?[\(]/.test(textAfter))))
lexical = lexical.prev;

      if (statementIndent && lexical.type == ")" && lexical.prev.type == "stat")
lexical = lexical.prev;
var type = lexical.type, closing = firstChar == type;

      if (statementIndent && lexical.type == ")" && lexical.prev.type == "stat")
lexical = lexical.prev;
var type = lexical.type, closing = firstChar == type;

Zeile 669Zeile 816
    blockCommentEnd: jsonMode ? null : "*/",
lineComment: jsonMode ? null : "//",
fold: "brace",

    blockCommentEnd: jsonMode ? null : "*/",
lineComment: jsonMode ? null : "//",
fold: "brace",

 
    closeBrackets: "()[]{}''\"\"``",


helperType: jsonMode ? "json" : "javascript",
jsonldMode: jsonldMode,


helperType: jsonMode ? "json" : "javascript",
jsonldMode: jsonldMode,

    jsonMode: jsonMode








    jsonMode: jsonMode,

expressionAllowed: expressionAllowed,

skipExpression: function(state) {
var top = state.cc[state.cc.length - 1]
if (top == expression || top == expressionNoComma) state.cc.pop()
}

  };
});


  };
});