Index: pkg/polymer_expressions/lib/eval.dart |
diff --git a/pkg/polymer_expressions/lib/eval.dart b/pkg/polymer_expressions/lib/eval.dart |
index 58a97603d69c5de74efb13725198d7e5f1a90c9d..625bca20353728c3c197a002ee27662087e845c2 100644 |
--- a/pkg/polymer_expressions/lib/eval.dart |
+++ b/pkg/polymer_expressions/lib/eval.dart |
@@ -81,10 +81,8 @@ Object update(ExpressionObserver expr, Scope scope) { |
* operators or function invocations, and any index operations must use a |
* literal index. |
*/ |
-Object assign(Expression expr, Object value, Scope scope) { |
- |
- notAssignable() => |
- throw new EvalException("Expression is not assignable: $expr"); |
+Object assign(Expression expr, Object value, Scope scope, |
+ {bool checkAssignability: true}) { |
Expression expression; |
var property; |
@@ -102,45 +100,43 @@ Object assign(Expression expr, Object value, Scope scope) { |
if (expr is Identifier) { |
expression = empty(); |
- Identifier ident = expr; |
- property = ident.value; |
+ property = expr.value; |
} else if (expr is Index) { |
- if (expr.argument is! Literal) notAssignable(); |
expression = expr.receiver; |
- Literal l = expr.argument; |
- property = l.value; |
+ property = expr.argument; |
isIndex = true; |
} else if (expr is Getter) { |
expression = expr.receiver; |
property = expr.name; |
- } else if (expr is Invoke) { |
- expression = expr.receiver; |
- if (expr.method != null) { |
- if (expr.arguments != null) notAssignable(); |
- property = expr.method; |
- } else { |
- notAssignable(); |
- } |
} else { |
- notAssignable(); |
+ if (checkAssignability) { |
+ throw new EvalException("Expression is not assignable: $expr"); |
+ } |
+ return null; |
} |
// transform the values backwards through the filters |
for (var filterExpr in filters) { |
var filter = eval(filterExpr, scope); |
if (filter is! Transformer) { |
- throw new EvalException("filter must implement Transformer: $filterExpr"); |
+ if (checkAssignability) { |
+ throw new EvalException("filter must implement Transformer to be " |
+ "assignable: $filterExpr"); |
+ } else { |
+ return null; |
+ } |
} |
value = filter.reverse(value); |
} |
- // make the assignment |
+ // evaluate the receiver |
var o = eval(expression, scope); |
// can't assign to a property on a null LHS object. Silently fail. |
if (o == null) return null; |
if (isIndex) { |
- o[property] = value; |
+ var index = eval(property, scope); |
+ o[index] = value; |
} else { |
smoke.write(o, smoke.nameToSymbol(property), value); |
} |