Chromium Code Reviews| Index: lib/src/codegen/js_codegen.dart |
| diff --git a/lib/src/codegen/js_codegen.dart b/lib/src/codegen/js_codegen.dart |
| index aa3bb2c53edd7c6b2d95275c59dedf8181b045c0..2e33c505095a90e1f6083ec190e36b4449ce38f5 100644 |
| --- a/lib/src/codegen/js_codegen.dart |
| +++ b/lib/src/codegen/js_codegen.dart |
| @@ -677,10 +677,28 @@ class JSCodegenVisitor extends GeneralizingAstVisitor with ConversionVisitor { |
| return result; |
| } |
| + JS.Node _generateDPutIfDynamic( |
| + Expression target, SimpleIdentifier id, Expression rhs) { |
| + if (rules.isDynamicTarget(target)) { |
| + return js.call('dart.dput(#, #, #)', [ |
| + target.accept(this), |
| + js.string(id.name, "'"), |
| + rhs.accept(this) |
| + ]); |
| + } else { |
| + return null; |
| + } |
| + } |
| + |
| @override |
| JS.Node visitAssignmentExpression(AssignmentExpression node) { |
| var lhs = node.leftHandSide; |
| var rhs = node.rightHandSide; |
| + return _generateAssignment(lhs, rhs, node.parent); |
| + } |
| + |
| + JS.Node _generateAssignment(Expression lhs, Expression rhs, |
|
Jennifer Messerly
2015/02/26 20:53:16
I've been using the "_emit" prefix. For better or
vsm
2015/03/03 21:06:12
Done.
|
| + [AstNode parent]) { |
| if (lhs is IndexExpression) { |
| String code; |
| var target = _getTarget(lhs); |
| @@ -697,17 +715,16 @@ class JSCodegenVisitor extends GeneralizingAstVisitor with ConversionVisitor { |
| } |
| if (lhs is PropertyAccess) { |
| - var target = _getTarget(lhs); |
| - if (rules.isDynamicTarget(target)) { |
| - return js.call('dart.dput(#, #, #)', [ |
| - target.accept(this), |
| - js.string(lhs.propertyName.name, "'"), |
| - rhs.accept(this) |
| - ]); |
| - } |
| + var result = |
| + _generateDPutIfDynamic(_getTarget(lhs), lhs.propertyName, rhs); |
| + if (result != null) return result; |
| + } else if (lhs is PrefixedIdentifier) { |
|
Jennifer Messerly
2015/02/26 20:53:16
how does a prefixed identifier end up as a dynamic
vsm
2015/03/03 21:06:12
In sunflower, notes.textContent shows up as a Pref
|
| + // TODO(vsm): Is this the right code if the prefix is a library? |
| + var result = _generateDPutIfDynamic(lhs.prefix, lhs.identifier, rhs); |
| + if (result != null) return result; |
| } |
| - if (node.parent is ExpressionStatement && |
| + if (parent is ExpressionStatement && |
| rhs is CascadeExpression && |
| _isStateless(lhs, rhs)) { |
| // Special case: cascade assignment to a variable in a statement. |
| @@ -1093,6 +1110,26 @@ class JSCodegenVisitor extends GeneralizingAstVisitor with ConversionVisitor { |
| bool _isNull(Expression expr) => expr is NullLiteral; |
| + JS.Expression _generateIncrement(Token op, Expression expr, bool prefix) { |
| + // TODO(vsm): Should we generate a runtime helper for this? |
|
Jennifer Messerly
2015/02/26 20:53:16
yeah, for now i think that's the pattern. this loo
vsm
2015/03/03 21:06:12
Note - there is a free expression in the closure,
|
| + var tmp = '_'; |
| + var applied = prefix ? '$tmp$op' : '$op$tmp'; |
| + var id = |
| + new SimpleIdentifier(new StringToken(TokenType.IDENTIFIER, tmp, 0)); |
| + id.staticElement = new LocalVariableElementImpl.forNode(id); |
| + id.staticType = expr.staticType; |
| + var assignment = _generateAssignment(expr, id); |
| + return js.call(''' |
| +(function () { |
| + var $tmp = #; |
| + if (typeof($tmp) != 'number') throw 'number expected'; |
| + var result = $applied; |
| + #; |
| + return result; |
| +})() |
| +''', [expr.accept(this), assignment]); |
| + } |
| + |
| @override |
| JS.Expression visitPostfixExpression(PostfixExpression node) { |
| var op = node.operator; |
| @@ -1103,8 +1140,8 @@ class JSCodegenVisitor extends GeneralizingAstVisitor with ConversionVisitor { |
| // TODO(vsm): When do Dart ops not map to JS? |
| return js.call('#$op', notNull(expr)); |
| } else { |
| - // TODO(vsm): Figure out operator calling convention / dispatch. |
| - return visitExpression(node); |
| + assert(op.lexeme == '++' || op.lexeme == '--'); |
| + return _generateIncrement(op, expr, false); |
|
Jennifer Messerly
2015/02/26 20:53:17
nit: use named arg `prefix: false`
vsm
2015/03/03 21:06:12
Done.
|
| } |
| } |
| @@ -1118,9 +1155,12 @@ class JSCodegenVisitor extends GeneralizingAstVisitor with ConversionVisitor { |
| // TODO(vsm): When do Dart ops not map to JS? |
| return js.call('$op#', notNull(expr)); |
| } else { |
| - // TODO(vsm): Figure out operator calling convention / dispatch. |
| - return visitExpression(node); |
| + if (op.lexeme == '++' || op.lexeme == '--') { |
| + return _generateIncrement(op, expr, true); |
| + } |
| } |
| + // TODO(vsm): Expand out. |
| + return visitExpression(node); |
|
vsm
2015/02/26 00:34:00
Should this just be:
x['-']()
? Or similar? T
Jennifer Messerly
2015/02/26 20:53:17
IMO, name should be "unary-" unless we find a good
|
| } |
| // Cascades can contain [IndexExpression], [MethodInvocation] and |