Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(219)

Unified Diff: pkg/polymer_expressions/lib/eval.dart

Issue 173003006: Use smoke in polymer and polymer_expressions. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 6 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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);

Powered by Google App Engine
This is Rietveld 408576698