| Index: pkg/polymer_expressions/lib/eval.dart
|
| diff --git a/pkg/polymer_expressions/lib/eval.dart b/pkg/polymer_expressions/lib/eval.dart
|
| index 22851e60aae733184eea8b6c79ab4541ee1569a7..7b925a724cac8f21b9c04427bfc9def3fa3466cd 100644
|
| --- a/pkg/polymer_expressions/lib/eval.dart
|
| +++ b/pkg/polymer_expressions/lib/eval.dart
|
| @@ -7,17 +7,18 @@ library polymer_expressions.eval;
|
| import 'dart:async';
|
| import 'dart:collection';
|
|
|
| -@MirrorsUsed(metaTargets: const [Reflectable, ObservableProperty],
|
| - override: 'polymer_expressions.eval')
|
| -import 'dart:mirrors';
|
| +@MirrorsUsed(
|
| + metaTargets: const [Reflectable, ObservableProperty],
|
| + override: 'smoke.mirrors')
|
| +import 'dart:mirrors' show MirrorsUsed;
|
|
|
| import 'package:observe/observe.dart';
|
| +import 'package:smoke/smoke.dart' as smoke;
|
|
|
| import 'async.dart';
|
| import 'expression.dart';
|
| import 'filter.dart';
|
| import 'visitor.dart';
|
| -import 'src/mirrors.dart';
|
|
|
| final _BINARY_OPERATORS = {
|
| '+': (a, b) => a + b,
|
| @@ -142,7 +143,7 @@ void assign(Expression expr, Object value, Scope scope) {
|
| if (isIndex) {
|
| o[property] = value;
|
| } else {
|
| - reflect(o).setField(new Symbol(property), value);
|
| + smoke.write(o, smoke.nameToSymbol(property), value);
|
| }
|
| }
|
|
|
| @@ -159,33 +160,19 @@ class Scope {
|
| final Object model;
|
| // TODO(justinfagnani): disallow adding/removing names
|
| final ObservableMap<String, Object> _variables;
|
| - InstanceMirror __modelMirror;
|
|
|
| Scope({this.model, Map<String, Object> variables, this.parent})
|
| : _variables = new ObservableMap.from(variables == null ? {} : variables);
|
|
|
| - InstanceMirror get _modelMirror {
|
| - if (__modelMirror != null) return __modelMirror;
|
| - __modelMirror = reflect(model);
|
| - return __modelMirror;
|
| - }
|
| -
|
| Object operator[](String name) {
|
| if (name == 'this') {
|
| return model;
|
| } else if (_variables.containsKey(name)) {
|
| return _convert(_variables[name]);
|
| - } else if (model != null) {
|
| - var symbol = new Symbol(name);
|
| - var classMirror = _modelMirror.type;
|
| - var memberMirror = getMemberMirror(classMirror, symbol);
|
| - // TODO(jmesserly): simplify once dartbug.com/13002 is fixed.
|
| - // This can just be "if memberMirror != null" and delete the Method class.
|
| - if (memberMirror is VariableMirror ||
|
| - (memberMirror is MethodMirror && memberMirror.isGetter)) {
|
| - return _convert(_modelMirror.getField(symbol).reflectee);
|
| - } else if (memberMirror is MethodMirror) {
|
| - return new Method(_modelMirror, symbol);
|
| + } else {
|
| + var symbol = smoke.nameToSymbol(name);
|
| + if (model != null && smoke.hasGetter(model.runtimeType, symbol)) {
|
| + return _convert(smoke.read(model, symbol));
|
| }
|
| }
|
| if (parent != null) {
|
| @@ -203,12 +190,8 @@ class Scope {
|
| return null;
|
| } else if (_variables.containsKey(name)) {
|
| return _variables;
|
| - } else {
|
| - var symbol = new Symbol(name);
|
| - var classMirror = _modelMirror.type;
|
| - if (getMemberMirror(classMirror, symbol) != null) {
|
| - return model;
|
| - }
|
| + } else if (smoke.hasGetter(model.runtimeType, smoke.nameToSymbol(name))) {
|
| + return model;
|
| }
|
| if (parent != null) {
|
| return parent.ownerOf(name);
|
| @@ -216,14 +199,9 @@ class Scope {
|
| }
|
|
|
| bool contains(String name) {
|
| - if (_variables.containsKey(name)) {
|
| + if (_variables.containsKey(name) ||
|
| + smoke.hasGetter(model.runtimeType, smoke.nameToSymbol(name))) {
|
| return true;
|
| - } else {
|
| - var symbol = new Symbol(name);
|
| - var classMirror = _modelMirror.type;
|
| - if (getMemberMirror(classMirror, symbol) != null) {
|
| - return true;
|
| - }
|
| }
|
| if (parent != null) {
|
| return parent.contains(name);
|
| @@ -480,7 +458,7 @@ class IdentifierObserver extends ExpressionObserver<Identifier>
|
|
|
| var owner = scope.ownerOf(value);
|
| if (owner is Observable) {
|
| - var symbol = new Symbol(value);
|
| + var symbol = smoke.nameToSymbol(value);
|
| _subscription = (owner as Observable).changes.listen((changes) {
|
| if (changes.any(
|
| (c) => c is PropertyChangeRecord && c.name == symbol)) {
|
| @@ -590,9 +568,8 @@ class GetterObserver extends ExpressionObserver<Getter> implements Getter {
|
| _value = null;
|
| return;
|
| }
|
| - var mirror = reflect(receiverValue);
|
| - var symbol = new Symbol(_expr.name);
|
| - _value = mirror.getField(symbol).reflectee;
|
| + var symbol = smoke.nameToSymbol(_expr.name);
|
| + _value = smoke.read(receiverValue, symbol);
|
|
|
| if (receiverValue is Observable) {
|
| _subscription = (receiverValue as Observable).changes.listen((changes) {
|
| @@ -657,11 +634,10 @@ class InvokeObserver extends ExpressionObserver<Invoke> implements Invoke {
|
| // changed? listen to the scope to see if the top-level method has
|
| // changed?
|
| assert(receiverValue is Function);
|
| - _value = call(receiverValue, args);
|
| + _value = _convert(Function.apply(receiverValue, args));
|
| } else {
|
| - var mirror = reflect(receiverValue);
|
| - var symbol = new Symbol(_expr.method);
|
| - _value = mirror.invoke(symbol, args, null).reflectee;
|
| + var symbol = smoke.nameToSymbol(_expr.method);
|
| + _value = smoke.invoke(receiverValue, symbol, args);
|
|
|
| if (receiverValue is Observable) {
|
| _subscription = (receiverValue as Observable).changes.listen(
|
| @@ -706,20 +682,6 @@ class InObserver extends ExpressionObserver<InExpression>
|
|
|
| _toBool(v) => (v == null) ? false : v;
|
|
|
| -/** Call a [Function] or a [Method]. */
|
| -// TODO(jmesserly): remove this once dartbug.com/13002 is fixed.
|
| -// Just inline `_convert(Function.apply(...))` to the call site.
|
| -Object call(Object receiver, List args) {
|
| - var result;
|
| - if (receiver is Method) {
|
| - Method method = receiver;
|
| - result = method.mirror.invoke(method.symbol, args, null).reflectee;
|
| - } else {
|
| - result = Function.apply(receiver, args, null);
|
| - }
|
| - return _convert(result);
|
| -}
|
| -
|
| /**
|
| * A comprehension declaration ("a in b"). [identifier] is the loop variable
|
| * that's added to the scope during iteration. [iterable] is the set of
|
| @@ -733,20 +695,6 @@ class Comprehension {
|
| : iterable = (iterable != null) ? iterable : const [];
|
| }
|
|
|
| -/** A method on a model object in a [Scope]. */
|
| -class Method {
|
| - final InstanceMirror mirror;
|
| - final Symbol symbol;
|
| -
|
| - Method(this.mirror, this.symbol);
|
| -
|
| - /**
|
| - * Support for calling single argument methods like [Filter]s.
|
| - * This does not work for calls that need to pass more than one argument.
|
| - */
|
| - call(arg0) => mirror.invoke(symbol, [arg0], null).reflectee;
|
| -}
|
| -
|
| class EvalException implements Exception {
|
| final String message;
|
| EvalException(this.message);
|
|
|