Index: pkg/polymer_expressions/lib/eval.dart |
diff --git a/pkg/polymer_expressions/lib/eval.dart b/pkg/polymer_expressions/lib/eval.dart |
index ba336edb03c96f62c6720b342eb4ad9d1ed4c399..ba7b651ce24ee1ab4f819e70372e56829fa16bc4 100644 |
--- a/pkg/polymer_expressions/lib/eval.dart |
+++ b/pkg/polymer_expressions/lib/eval.dart |
@@ -60,7 +60,7 @@ Object eval(Expression expr, Scope scope) { |
* [ExpressionObsserver]. |
*/ |
ExpressionObserver observe(Expression expr, Scope scope) { |
- var observer = new ObserverBuilder(scope).visit(expr); |
+ var observer = new ObserverBuilder().visit(expr); |
return observer; |
} |
@@ -152,6 +152,9 @@ Object assign(Expression expr, Object value, Scope scope) { |
* and then finally looks up the name as a property in the model. |
*/ |
abstract class Scope implements Indexable<String, Object> { |
+ static int __seq = 1; |
+ final int _seq = __seq++; |
+ |
Scope._(); |
/** Create a scope containing a [model] and all of [variables]. */ |
@@ -185,6 +188,9 @@ abstract class Scope implements Indexable<String, Object> { |
/** Create a new scope extending this scope with an additional variable. */ |
Scope childScope(String name, Object value) => |
new _LocalVariableScope(name, value, this); |
+ |
+ String toString() => 'Scope(seq: $_seq model: $model)'; |
+ |
} |
/** |
@@ -329,18 +335,12 @@ class Updater extends RecursiveVisitor { |
visitExpression(ExpressionObserver e) { |
e._observe(scope); |
} |
- |
- visitInExpression(InObserver c) { |
- visit(c.right); |
- visitExpression(c); |
- } |
} |
class ObserverBuilder extends Visitor { |
- final Scope scope; |
final Queue parents = new Queue(); |
- ObserverBuilder(this.scope); |
+ ObserverBuilder(); |
visitEmptyExpression(EmptyExpression e) => new EmptyObserver(e); |
@@ -428,13 +428,11 @@ class ObserverBuilder extends Visitor { |
} |
visitInExpression(InExpression i) { |
- // don't visit the left. It's an identifier, but we don't want to evaluate |
- // it, we just want to add it to the comprehension object |
- var left = visit(i.left); |
- var right = visit(i.right); |
- var inexpr = new InObserver(i, left, right); |
- right._parent = inexpr; |
- return inexpr; |
+ throw new UnsupportedError("can't eval an 'in' expression"); |
+ } |
+ |
+ visitAsExpression(AsExpression i) { |
+ throw new UnsupportedError("can't eval an 'as' expression"); |
} |
} |
@@ -514,7 +512,6 @@ class IdentifierObserver extends ExpressionObserver<Identifier> |
_updateSelf(Scope scope) { |
_value = scope[value]; |
- |
if (!scope._isModelProperty(value)) return; |
var model = scope.model; |
if (model is! Observable) return; |
@@ -717,33 +714,6 @@ class InvokeObserver extends ExpressionObserver<Invoke> implements Invoke { |
accept(Visitor v) => v.visitInvoke(this); |
} |
-class InObserver extends ExpressionObserver<InExpression> |
- implements InExpression { |
- IdentifierObserver left; |
- ExpressionObserver right; |
- |
- InObserver(Expression expr, this.left, this.right) : super(expr); |
- |
- _updateSelf(Scope scope) { |
- Identifier identifier = left; |
- var iterable = right._value; |
- |
- if (iterable is! Iterable && iterable != null) { |
- throw new EvalException("right side of 'in' is not an iterator"); |
- } |
- |
- if (iterable is ObservableList) { |
- _subscription = iterable.listChanges.listen((_) => _invalidate(scope)); |
- } |
- |
- var name = identifier.value; |
- _value = iterable == null ? const [] : |
- iterable.map((i) => scope.childScope(name, i)).toList(growable: false); |
- } |
- |
- accept(Visitor v) => v.visitInExpression(this); |
-} |
- |
_toBool(v) => (v == null) ? false : v; |
class EvalException implements Exception { |