Index: pkg/js_ast/lib/src/builder.dart |
diff --git a/pkg/js_ast/lib/src/builder.dart b/pkg/js_ast/lib/src/builder.dart |
index 5d680f5c9ecb97db7557d8de0417161922e31cb2..ff294470abe5f45ce57f93b01a0bd5024a977eed 100644 |
--- a/pkg/js_ast/lib/src/builder.dart |
+++ b/pkg/js_ast/lib/src/builder.dart |
@@ -7,7 +7,6 @@ |
part of js_ast; |
- |
/** |
* Global template manager. We should aim to have a fixed number of |
* templates. This implies that we do not use js('xxx') to parse text that is |
@@ -18,7 +17,6 @@ part of js_ast; |
*/ |
TemplateManager templateManager = new TemplateManager(); |
- |
/** |
[js] is a singleton instace of JsBuilder. JsBuilder is a set of conveniences |
@@ -187,7 +185,6 @@ What is not implemented: |
*/ |
const JsBuilder js = const JsBuilder(); |
- |
class JsBuilder { |
const JsBuilder(); |
@@ -271,8 +268,8 @@ class JsBuilder { |
Template uncachedExpressionTemplate(String source) { |
MiniJsParser parser = new MiniJsParser(source); |
Expression expression = parser.expression(); |
- return new Template( |
- source, expression, isExpression: true, forceCopy: false); |
+ return new Template(source, expression, |
+ isExpression: true, forceCopy: false); |
} |
/** |
@@ -281,8 +278,8 @@ class JsBuilder { |
Template uncachedStatementTemplate(String source) { |
MiniJsParser parser = new MiniJsParser(source); |
Statement statement = parser.statement(); |
- return new Template( |
- source, statement, isExpression: false, forceCopy: false); |
+ return new Template(source, statement, |
+ isExpression: false, forceCopy: false); |
} |
/** |
@@ -300,19 +297,26 @@ class JsBuilder { |
/// Creates a literal js string from [value]. |
LiteralString _legacyEscapedString(String value) { |
- // Start by escaping the backslashes. |
+ // Start by escaping the backslashes. |
String escaped = value.replaceAll('\\', '\\\\'); |
// Do not escape unicode characters and ' because they are allowed in the |
// string literal anyway. |
escaped = escaped.replaceAllMapped(new RegExp('\n|"|\b|\t|\v|\r'), (match) { |
switch (match.group(0)) { |
- case "\n" : return r"\n"; |
- case "\"" : return r'\"'; |
- case "\b" : return r"\b"; |
- case "\t" : return r"\t"; |
- case "\f" : return r"\f"; |
- case "\r" : return r"\r"; |
- case "\v" : return r"\v"; |
+ case "\n": |
+ return r"\n"; |
+ case "\"": |
+ return r'\"'; |
+ case "\b": |
+ return r"\b"; |
+ case "\t": |
+ return r"\t"; |
+ case "\f": |
+ return r"\f"; |
+ case "\r": |
+ return r"\r"; |
+ case "\v": |
+ return r"\v"; |
} |
}); |
LiteralString result = string(escaped); |
@@ -324,7 +328,7 @@ class JsBuilder { |
/// Creates a literal js string from [value]. |
LiteralString escapedString(String value, |
- {bool utf8: false, bool ascii: false}) { |
+ {bool utf8: false, bool ascii: false}) { |
if (utf8 == false && ascii == false) return _legacyEscapedString(value); |
if (utf8 && ascii) throw new ArgumentError('Cannot be both UTF8 and ASCII'); |
@@ -340,12 +344,16 @@ class JsBuilder { |
++singleQuotes; |
} else if (rune == charCodes.$DQ) { |
++doubleQuotes; |
- } else if (rune == charCodes.$LF || rune == charCodes.$CR || |
- rune == charCodes.$LS || rune == charCodes.$PS) { |
+ } else if (rune == charCodes.$LF || |
+ rune == charCodes.$CR || |
+ rune == charCodes.$LS || |
+ rune == charCodes.$PS) { |
// Line terminators. |
++otherEscapes; |
- } else if (rune == charCodes.$BS || rune == charCodes.$TAB || |
- rune == charCodes.$VTAB || rune == charCodes.$FF) { |
+ } else if (rune == charCodes.$BS || |
+ rune == charCodes.$TAB || |
+ rune == charCodes.$VTAB || |
+ rune == charCodes.$FF) { |
++otherEscapes; |
} else if (_isUnpairedSurrogate(rune)) { |
++unpairedSurrogates; |
@@ -408,15 +416,24 @@ class JsBuilder { |
static String _irregularEscape(int code, bool useSingleQuotes) { |
switch (code) { |
- case charCodes.$SQ: return useSingleQuotes ? r"\'" : r"'"; |
- case charCodes.$DQ: return useSingleQuotes ? r'"' : r'\"'; |
- case charCodes.$BACKSLASH: return r'\\'; |
- case charCodes.$BS: return r'\b'; |
- case charCodes.$TAB: return r'\t'; |
- case charCodes.$LF: return r'\n'; |
- case charCodes.$VTAB: return r'\v'; |
- case charCodes.$FF: return r'\f'; |
- case charCodes.$CR: return r'\r'; |
+ case charCodes.$SQ: |
+ return useSingleQuotes ? r"\'" : r"'"; |
+ case charCodes.$DQ: |
+ return useSingleQuotes ? r'"' : r'\"'; |
+ case charCodes.$BACKSLASH: |
+ return r'\\'; |
+ case charCodes.$BS: |
+ return r'\b'; |
+ case charCodes.$TAB: |
+ return r'\t'; |
+ case charCodes.$LF: |
+ return r'\n'; |
+ case charCodes.$VTAB: |
+ return r'\v'; |
+ case charCodes.$FF: |
+ return r'\f'; |
+ case charCodes.$CR: |
+ return r'\r'; |
} |
return null; |
} |
@@ -435,13 +452,13 @@ class JsBuilder { |
LiteralString stringPart(String value) => new LiteralString(value); |
StringConcatenation concatenateStrings(Iterable<Literal> parts, |
- {addQuotes: false}) { |
+ {addQuotes: false}) { |
List<Literal> _parts; |
if (addQuotes) { |
Literal quote = stringPart('"'); |
_parts = <Literal>[quote] |
- ..addAll(parts) |
- ..add(quote); |
+ ..addAll(parts) |
+ ..add(quote); |
} else { |
_parts = new List.from(parts, growable: false); |
} |
@@ -472,9 +489,8 @@ class JsBuilder { |
Comment comment(String text) => new Comment(text); |
- Call propertyCall(Expression receiver, |
- Expression fieldName, |
- List<Expression> arguments) { |
+ Call propertyCall( |
+ Expression receiver, Expression fieldName, List<Expression> arguments) { |
return new Call(new PropertyAccess(receiver, fieldName), arguments); |
} |
@@ -491,29 +507,31 @@ LiteralString string(String value) => js.string(value); |
LiteralString quoteName(Name name, {allowNull: false}) { |
return js.quoteName(name, allowNull: allowNull); |
} |
+ |
LiteralString stringPart(String value) => js.stringPart(value); |
Iterable<Literal> joinLiterals(Iterable<Literal> list, Literal separator) { |
return js.joinLiterals(list, separator); |
} |
+ |
StringConcatenation concatenateStrings(Iterable<Literal> parts, |
- {addQuotes: false}) { |
+ {addQuotes: false}) { |
return js.concatenateStrings(parts, addQuotes: addQuotes); |
} |
LiteralNumber number(num value) => js.number(value); |
ArrayInitializer numArray(Iterable<int> list) => js.numArray(list); |
ArrayInitializer stringArray(Iterable<String> list) => js.stringArray(list); |
-Call propertyCall(Expression receiver, |
- Expression fieldName, |
- List<Expression> arguments) { |
+Call propertyCall( |
+ Expression receiver, Expression fieldName, List<Expression> arguments) { |
return js.propertyCall(receiver, fieldName, arguments); |
} |
+ |
ObjectInitializer objectLiteral(Map<String, Expression> map) { |
return js.objectLiteral(map); |
} |
class MiniJsParserError { |
- MiniJsParserError(this.parser, this.message) { } |
+ MiniJsParserError(this.parser, this.message) {} |
final MiniJsParser parser; |
final String message; |
@@ -575,7 +593,7 @@ class MiniJsParser { |
String lastToken = null; |
int lastPosition = 0; |
int position = 0; |
- bool skippedNewline = false; // skipped newline in last getToken? |
+ bool skippedNewline = false; // skipped newline in last getToken? |
final String src; |
final List<InterpolatedNode> interpolatedValues = <InterpolatedNode>[]; |
@@ -610,49 +628,70 @@ class MiniJsParser { |
static String categoryToString(int cat) { |
switch (cat) { |
- case NONE: return "NONE"; |
- case ALPHA: return "ALPHA"; |
- case NUMERIC: return "NUMERIC"; |
- case SYMBOL: return "SYMBOL"; |
- case ASSIGNMENT: return "ASSIGNMENT"; |
- case DOT: return "DOT"; |
- case LPAREN: return "LPAREN"; |
- case RPAREN: return "RPAREN"; |
- case LBRACE: return "LBRACE"; |
- case RBRACE: return "RBRACE"; |
- case LSQUARE: return "LSQUARE"; |
- case RSQUARE: return "RSQUARE"; |
- case STRING: return "STRING"; |
- case COMMA: return "COMMA"; |
- case QUERY: return "QUERY"; |
- case COLON: return "COLON"; |
- case SEMICOLON: return "SEMICOLON"; |
- case HASH: return "HASH"; |
- case WHITESPACE: return "WHITESPACE"; |
- case OTHER: return "OTHER"; |
+ case NONE: |
+ return "NONE"; |
+ case ALPHA: |
+ return "ALPHA"; |
+ case NUMERIC: |
+ return "NUMERIC"; |
+ case SYMBOL: |
+ return "SYMBOL"; |
+ case ASSIGNMENT: |
+ return "ASSIGNMENT"; |
+ case DOT: |
+ return "DOT"; |
+ case LPAREN: |
+ return "LPAREN"; |
+ case RPAREN: |
+ return "RPAREN"; |
+ case LBRACE: |
+ return "LBRACE"; |
+ case RBRACE: |
+ return "RBRACE"; |
+ case LSQUARE: |
+ return "LSQUARE"; |
+ case RSQUARE: |
+ return "RSQUARE"; |
+ case STRING: |
+ return "STRING"; |
+ case COMMA: |
+ return "COMMA"; |
+ case QUERY: |
+ return "QUERY"; |
+ case COLON: |
+ return "COLON"; |
+ case SEMICOLON: |
+ return "SEMICOLON"; |
+ case HASH: |
+ return "HASH"; |
+ case WHITESPACE: |
+ return "WHITESPACE"; |
+ case OTHER: |
+ return "OTHER"; |
} |
return "Unknown: $cat"; |
} |
static const CATEGORIES = const <int>[ |
- OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, // 0-7 |
- OTHER, WHITESPACE, WHITESPACE, OTHER, OTHER, WHITESPACE, // 8-13 |
- OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, // 14-21 |
- OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, // 22-29 |
- OTHER, OTHER, WHITESPACE, // 30-32 |
- SYMBOL, OTHER, HASH, ALPHA, SYMBOL, SYMBOL, OTHER, // !"#$%&´ |
- LPAREN, RPAREN, SYMBOL, SYMBOL, COMMA, SYMBOL, DOT, SYMBOL, // ()*+,-./ |
- NUMERIC, NUMERIC, NUMERIC, NUMERIC, NUMERIC, // 01234 |
- NUMERIC, NUMERIC, NUMERIC, NUMERIC, NUMERIC, // 56789 |
- COLON, SEMICOLON, SYMBOL, SYMBOL, SYMBOL, QUERY, OTHER, // :;<=>?@ |
- ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, // ABCDEFGH |
- ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, // IJKLMNOP |
- ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, // QRSTUVWX |
- ALPHA, ALPHA, LSQUARE, OTHER, RSQUARE, SYMBOL, ALPHA, OTHER, // YZ[\]^_' |
- ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, // abcdefgh |
- ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, // ijklmnop |
- ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, // qrstuvwx |
- ALPHA, ALPHA, LBRACE, SYMBOL, RBRACE, SYMBOL]; // yz{|}~ |
+ OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, // 0-7 |
+ OTHER, WHITESPACE, WHITESPACE, OTHER, OTHER, WHITESPACE, // 8-13 |
+ OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, // 14-21 |
+ OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, // 22-29 |
+ OTHER, OTHER, WHITESPACE, // 30-32 |
+ SYMBOL, OTHER, HASH, ALPHA, SYMBOL, SYMBOL, OTHER, // !"#$%&´ |
+ LPAREN, RPAREN, SYMBOL, SYMBOL, COMMA, SYMBOL, DOT, SYMBOL, // ()*+,-./ |
+ NUMERIC, NUMERIC, NUMERIC, NUMERIC, NUMERIC, // 01234 |
+ NUMERIC, NUMERIC, NUMERIC, NUMERIC, NUMERIC, // 56789 |
+ COLON, SEMICOLON, SYMBOL, SYMBOL, SYMBOL, QUERY, OTHER, // :;<=>?@ |
+ ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, // ABCDEFGH |
+ ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, // IJKLMNOP |
+ ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, // QRSTUVWX |
+ ALPHA, ALPHA, LSQUARE, OTHER, RSQUARE, SYMBOL, ALPHA, OTHER, // YZ[\]^_' |
+ ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, // abcdefgh |
+ ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, // ijklmnop |
+ ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, // qrstuvwx |
+ ALPHA, ALPHA, LBRACE, SYMBOL, RBRACE, SYMBOL |
+ ]; // yz{|}~ |
// This must be a >= the highest precedence number handled by parseBinary. |
static var HIGHEST_PARSE_BINARY_PRECEDENCE = 16; |
@@ -660,22 +699,54 @@ class MiniJsParser { |
// From https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/Operator_Precedence |
static final BINARY_PRECEDENCE = { |
- '+=': 17, '-=': 17, '*=': 17, '/=': 17, '%=': 17, '^=': 17, '|=': 17, |
- '&=': 17, '<<=': 17, '>>=': 17, '>>>=': 17, '=': 17, |
- '||': 14, |
- '&&': 13, |
- '|': 12, |
- '^': 11, |
- '&': 10, |
- '!=': 9, '==': 9, '!==': 9, '===': 9, |
- '<': 8, '<=': 8, '>=': 8, '>': 8, 'in': 8, 'instanceof': 8, |
- '<<': 7, '>>': 7, '>>>': 7, |
- '+': 6, '-': 6, |
- '*': 5, '/': 5, '%': 5 |
+ '+=': 17, |
+ '-=': 17, |
+ '*=': 17, |
+ '/=': 17, |
+ '%=': 17, |
+ '^=': 17, |
+ '|=': 17, |
+ '&=': 17, |
+ '<<=': 17, |
+ '>>=': 17, |
+ '>>>=': 17, |
+ '=': 17, |
+ '||': 14, |
+ '&&': 13, |
+ '|': 12, |
+ '^': 11, |
+ '&': 10, |
+ '!=': 9, |
+ '==': 9, |
+ '!==': 9, |
+ '===': 9, |
+ '<': 8, |
+ '<=': 8, |
+ '>=': 8, |
+ '>': 8, |
+ 'in': 8, |
+ 'instanceof': 8, |
+ '<<': 7, |
+ '>>': 7, |
+ '>>>': 7, |
+ '+': 6, |
+ '-': 6, |
+ '*': 5, |
+ '/': 5, |
+ '%': 5 |
}; |
- static final UNARY_OPERATORS = |
- ['++', '--', '+', '-', '~', '!', 'typeof', 'void', 'delete', 'await'] |
- .toSet(); |
+ static final UNARY_OPERATORS = [ |
+ '++', |
+ '--', |
+ '+', |
+ '-', |
+ '~', |
+ '!', |
+ 'typeof', |
+ 'void', |
+ 'delete', |
+ 'await' |
+ ].toSet(); |
static final OPERATORS_THAT_LOOK_LIKE_IDENTIFIERS = |
['typeof', 'void', 'delete', 'in', 'instanceof', 'await'].toSet(); |
@@ -697,8 +768,10 @@ class MiniJsParser { |
if (currentCode == charCodes.$BACKSLASH) { |
if (++position >= src.length) error("Unterminated literal"); |
int escaped = src.codeUnitAt(position); |
- if (escaped == charCodes.$x || escaped == charCodes.$X || |
- escaped == charCodes.$u || escaped == charCodes.$U || |
+ if (escaped == charCodes.$x || |
+ escaped == charCodes.$X || |
+ escaped == charCodes.$u || |
+ escaped == charCodes.$U || |
category(escaped) == NUMERIC) { |
error('Numeric and hex escapes are not allowed in literals'); |
} |
@@ -714,8 +787,7 @@ class MiniJsParser { |
if (position >= src.length) break; |
int code = src.codeUnitAt(position); |
// Skip '//' and '/*' style comments. |
- if (code == charCodes.$SLASH && |
- position + 1 < src.length) { |
+ if (code == charCodes.$SLASH && position + 1 < src.length) { |
if (src.codeUnitAt(position + 1) == charCodes.$SLASH) { |
int nextPosition = src.indexOf('\n', position); |
if (nextPosition == -1) nextPosition = src.length; |
@@ -746,8 +818,8 @@ class MiniJsParser { |
lastCategory = STRING; |
lastToken = getDelimited(position); |
} else if (code == charCodes.$0 && |
- position + 2 < src.length && |
- src.codeUnitAt(position + 1) == charCodes.$x) { |
+ position + 2 < src.length && |
+ src.codeUnitAt(position + 1) == charCodes.$x) { |
// Hex literal. |
for (position += 2; position < src.length; position++) { |
int cat = category(src.codeUnitAt(position)); |
@@ -777,16 +849,15 @@ class MiniJsParser { |
// Special code to disallow !, ~ and / in non-first position in token, |
// so that !! and ~~ parse as two tokens and != parses as one, while =/ |
// parses as a an equals token followed by a regexp literal start. |
- newCat = |
- (code == charCodes.$BANG || |
- code == charCodes.$SLASH || |
- code == charCodes.$TILDE) |
+ newCat = (code == charCodes.$BANG || |
+ code == charCodes.$SLASH || |
+ code == charCodes.$TILDE) |
? NONE |
: category(code); |
} while (!singleCharCategory(cat) && |
- (cat == newCat || |
- (cat == ALPHA && newCat == NUMERIC) || // eg. level42. |
- (cat == NUMERIC && newCat == DOT))); // eg. 3.1415 |
+ (cat == newCat || |
+ (cat == ALPHA && newCat == NUMERIC) || // eg. level42. |
+ (cat == NUMERIC && newCat == DOT))); // eg. 3.1415 |
lastCategory = cat; |
lastToken = src.substring(lastPosition, position); |
if (cat == NUMERIC) { |
@@ -829,7 +900,7 @@ class MiniJsParser { |
// Accept semicolon or automatically inserted semicolon before close brace. |
// Miniparser forbids other kinds of semicolon insertion. |
if (RBRACE == lastCategory) return true; |
- if (NONE == lastCategory) return true; // end of input |
+ if (NONE == lastCategory) return true; // end of input |
if (skippedNewline) { |
error('No automatic semicolon insertion at preceding newline'); |
} |
@@ -984,7 +1055,8 @@ class MiniJsParser { |
propertyName = new LiteralString('"$identifier"'); |
} else if (acceptCategory(STRING)) { |
propertyName = new LiteralString(identifier); |
- } else if (acceptCategory(SYMBOL)) { // e.g. void |
+ } else if (acceptCategory(SYMBOL)) { |
+ // e.g. void |
propertyName = new LiteralString('"$identifier"'); |
} else if (acceptCategory(HASH)) { |
var nameOrPosition = parseHash(); |
@@ -1034,9 +1106,9 @@ class MiniJsParser { |
expectCategory(COMMA); |
} |
} |
- receiver = constructor ? |
- new New(receiver, arguments) : |
- new Call(receiver, arguments); |
+ receiver = constructor |
+ ? new New(receiver, arguments) |
+ : new Call(receiver, arguments); |
constructor = false; |
} else if (!constructor && acceptCategory(LSQUARE)) { |
Expression inBraces = parseExpression(); |
@@ -1091,7 +1163,8 @@ class MiniJsParser { |
Expression parseUnaryHigh() { |
String operator = lastToken; |
- if (lastCategory == SYMBOL && UNARY_OPERATORS.contains(operator) && |
+ if (lastCategory == SYMBOL && |
+ UNARY_OPERATORS.contains(operator) && |
(acceptString("++") || acceptString("--") || acceptString('await'))) { |
if (operator == "await") return new Await(parsePostfix()); |
return new Prefix(operator, parsePostfix()); |
@@ -1101,8 +1174,10 @@ class MiniJsParser { |
Expression parseUnaryLow() { |
String operator = lastToken; |
- if (lastCategory == SYMBOL && UNARY_OPERATORS.contains(operator) && |
- operator != "++" && operator != "--") { |
+ if (lastCategory == SYMBOL && |
+ UNARY_OPERATORS.contains(operator) && |
+ operator != "++" && |
+ operator != "--") { |
expectCategory(SYMBOL); |
if (operator == "await") return new Await(parsePostfix()); |
return new Prefix(operator, parseUnaryLow()); |
@@ -1114,7 +1189,7 @@ class MiniJsParser { |
Expression lhs = parseUnaryLow(); |
int minPrecedence; |
String lastSymbol; |
- Expression rhs; // This is null first time around. |
+ Expression rhs; // This is null first time around. |
while (true) { |
String symbol = lastToken; |
if (lastCategory != SYMBOL || |
@@ -1146,7 +1221,6 @@ class MiniJsParser { |
return new Conditional(lhs, ifTrue, ifFalse); |
} |
- |
Expression parseAssignment() { |
Expression lhs = parseConditional(); |
String assignmentOperator = lastToken; |
@@ -1154,7 +1228,7 @@ class MiniJsParser { |
Expression rhs = parseAssignment(); |
if (assignmentOperator == "=") { |
return new Assignment(lhs, rhs); |
- } else { |
+ } else { |
// Handle +=, -=, etc. |
String operator = |
assignmentOperator.substring(0, assignmentOperator.length - 1); |
@@ -1280,7 +1354,6 @@ class MiniJsParser { |
if (lastToken == 'with') { |
error('Not implemented in mini parser'); |
} |
- |
} |
bool checkForInterpolatedStatement = lastCategory == HASH; |
@@ -1387,8 +1460,8 @@ class MiniJsParser { |
expectCategory(RPAREN); |
Statement body = parseStatement(); |
return new ForIn( |
- new VariableDeclarationList([ |
- new VariableInitialization(declaration, null)]), |
+ new VariableDeclarationList( |
+ [new VariableInitialization(declaration, null)]), |
objectExpression, |
body); |
} |
@@ -1450,8 +1523,8 @@ class MiniJsParser { |
} |
List statements = new List<Statement>(); |
while (lastCategory != RBRACE && |
- lastToken != 'case' && |
- lastToken != 'default') { |
+ lastToken != 'case' && |
+ lastToken != 'default') { |
statements.add(parseStatement()); |
} |
return expression == null |
@@ -1484,7 +1557,7 @@ class MiniJsParser { |
expectCategory(RPAREN); |
expectCategory(LBRACE); |
List<SwitchClause> clauses = new List<SwitchClause>(); |
- while(lastCategory != RBRACE) { |
+ while (lastCategory != RBRACE) { |
clauses.add(parseSwitchClause()); |
} |
expectCategory(RBRACE); |