Index: lib/src/js/builder.dart |
diff --git a/lib/src/js/builder.dart b/lib/src/js/builder.dart |
index 93d5c67711641631f5b5a4fbdcf9e1d675ca7c59..60bf7f9984e8d8e2e437b2e5343f8b03a8f07c8c 100644 |
--- a/lib/src/js/builder.dart |
+++ b/lib/src/js/builder.dart |
@@ -811,6 +811,22 @@ class MiniJsParser { |
return expression; |
} |
+ InterpolatedIdentifier parseInterpolatedIdentifier() { |
+ var id = new InterpolatedIdentifier(parseHash()); |
+ interpolatedValues.add(id); |
+ return id; |
+ } |
+ |
+ Identifier parseIdentifier() { |
+ if (acceptCategory(HASH)) { |
+ return parseInterpolatedIdentifier(); |
+ } else { |
+ var id = new Identifier(lastToken); |
+ expectCategory(ALPHA); |
+ return id; |
+ } |
+ } |
+ |
/** |
* CoverParenthesizedExpressionAndArrowParameterList[Yield] : |
* ( Expression ) |
@@ -1136,45 +1152,95 @@ class MiniJsParser { |
} |
/** Parse a variable declaration list, with `var` or `let` [keyword] */ |
- VariableDeclarationList parseVariableDeclarationList(String keyword) { |
- // Supports one form for interpolated variable declaration: |
- // let # = ... |
- if (acceptCategory(HASH)) { |
- var name = new InterpolatedIdentifier(parseHash()); |
- interpolatedValues.add(name); |
+ VariableDeclarationList parseVariableDeclarationList(String keyword) => |
+ finishVariableDeclarationList(keyword); |
Jennifer Messerly
2015/12/01 02:10:27
why introduce this redirect? If they aren't differ
ochafik
2015/12/02 20:05:46
Done.
|
- Expression initializer = acceptString("=") ? parseAssignment() : null; |
- return new VariableDeclarationList(keyword, |
- [new VariableInitialization(name, initializer)]); |
- } |
- |
- String firstVariable = lastToken; |
- expectCategory(ALPHA); |
- return finishVariableDeclarationList(keyword, firstVariable); |
- } |
- |
- VariableDeclarationList finishVariableDeclarationList( |
- String keyword, String firstVariable) { |
+ VariableDeclarationList finishVariableDeclarationList(String keyword) { |
var initialization = []; |
- void declare(String variable) { |
+ do { |
+ var declarator; |
+ switch (lastCategory) { |
Jennifer Messerly
2015/12/01 02:10:27
this pattern occurs in a couple of places, pull it
ochafik
2015/12/02 20:05:46
+1, meet parseVariableBinding()
|
+ case ALPHA: |
+ case HASH: |
+ declarator = parseIdentifier(); |
+ break; |
+ case LBRACE: |
+ case LSQUARE: |
+ declarator = parseDestructuring(); |
+ break; |
+ default: |
+ throw new StateError('Unexpected token $lastToken: ${categoryToString(lastCategory)}'); |
Jennifer Messerly
2015/12/01 02:10:27
long line. FYI, to prevent large churn here we exc
ochafik
2015/12/02 20:05:46
Done.
|
+ } |
Expression initializer = null; |
if (acceptString("=")) { |
initializer = parseAssignment(); |
} |
- var declaration = new Identifier(variable); |
- initialization.add(new VariableInitialization(declaration, initializer)); |
- } |
+ initialization.add(new VariableInitialization(declarator, initializer)); |
+ } while (acceptCategory(COMMA)); |
- declare(firstVariable); |
- while (acceptCategory(COMMA)) { |
- String variable = lastToken; |
- expectCategory(ALPHA); |
- declare(variable); |
- } |
return new VariableDeclarationList(keyword, initialization); |
} |
+ Destructuring parseDestructuring() { |
Jennifer Messerly
2015/12/01 02:10:27
It'd be worth adding a link to where this is defin
ochafik
2015/12/02 20:05:46
Done.
|
+ if (acceptCategory(LBRACE)) { |
+ return parseObjectDestructuring(); |
+ } else { |
+ expectCategory(LSQUARE); |
+ return parseArrayDestructuring(); |
+ } |
+ } |
+ |
+ ArrayDestructuring parseArrayDestructuring() { |
+ var variables = <DestructuredVariable>[]; |
+ do { |
+ var name; |
+ var structure; |
+ var defaultValue; |
+ |
+ switch (lastCategory) { |
+ case ALPHA: |
+ case HASH: |
+ name = parseIdentifier(); |
+ break; |
+ case LBRACE: |
+ case LSQUARE: |
+ structure = parseDestructuring(); |
+ break; |
+ default: |
+ throw new StateError('Unexpected token $lastToken: ${categoryToString(lastCategory)}'); |
+ } |
+ if (acceptString("=")) { |
+ defaultValue = parseExpression(); |
+ } |
+ variables.add(new DestructuredVariable( |
+ name: name, structure: structure, defaultValue: defaultValue)); |
+ } while (acceptCategory(COMMA)); |
+ |
+ expectCategory(RSQUARE); |
+ return new ArrayDestructuring(variables); |
+ } |
+ |
+ ObjectDestructuring parseObjectDestructuring() { |
+ var variables = <DestructuredVariable>[]; |
+ do { |
+ var name = parseIdentifier(); |
+ var structure; |
+ var defaultValue; |
+ |
+ if (acceptCategory(COLON)) { |
Jennifer Messerly
2015/12/01 02:10:27
Hmmm, normally we'd do parseAssignment, like the o
ochafik
2015/12/02 20:05:46
Hehe, tried that, but... the grammar is a bit sens
|
+ structure = parseDestructuring(); |
+ } else if (acceptString("=")) { |
+ defaultValue = parseExpression(); |
+ } |
+ variables.add(new DestructuredVariable( |
+ name: name, structure: structure, defaultValue: defaultValue)); |
+ } while (acceptCategory(COMMA)); |
+ |
+ expectCategory(RBRACE); |
+ return new ObjectDestructuring(variables); |
+ } |
+ |
Expression parseVarDeclarationOrExpression() { |
var keyword = acceptVarOrLet(); |
if (keyword != null) { |
@@ -1394,7 +1460,7 @@ class MiniJsParser { |
iterableExpression, |
body); |
} |
- var declarations = finishVariableDeclarationList(keyword, identifier); |
+ var declarations = finishVariableDeclarationList(keyword); |
expectCategory(SEMICOLON); |
return finishFor(declarations); |
} |
@@ -1498,15 +1564,7 @@ class MiniJsParser { |
} |
ClassExpression parseClass() { |
- Identifier name; |
- if (acceptCategory(HASH)) { |
- var interpolatedName = new InterpolatedIdentifier(parseHash()); |
- interpolatedValues.add(interpolatedName); |
- name = interpolatedName; |
- } else { |
- name = new Identifier(lastToken); |
- expectCategory(ALPHA); |
- } |
+ Identifier name = parseIdentifier(); |
Expression heritage = null; |
if (acceptString('extends')) { |
heritage = parseLeftHandSide(); |