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

Side by Side Diff: pkg/polymer_expressions/lib/expression.dart

Issue 141703024: Refactor of PolymerExpressions. Adds "as" expressions. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: syntax, bindings, and globals tests now passing in Safari Created 6 years, 6 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « pkg/polymer_expressions/lib/eval.dart ('k') | pkg/polymer_expressions/lib/parser.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 library polymer_expressions.expression; 5 library polymer_expressions.expression;
6 6
7 import 'visitor.dart'; 7 import 'visitor.dart';
8 8
9 // Helper functions for building expression trees programmatically 9 // Helper functions for building expression trees programmatically
10 10
11 EmptyExpression empty() => const EmptyExpression(); 11 EmptyExpression empty() => const EmptyExpression();
12 Literal literal(v) => new Literal(v); 12 Literal literal(v) => new Literal(v);
13 ListLiteral listLiteral(List<Expression> items) => new ListLiteral(items); 13 ListLiteral listLiteral(List<Expression> items) => new ListLiteral(items);
14 MapLiteral mapLiteral(List<MapLiteralEntry> entries) => new MapLiteral(entries); 14 MapLiteral mapLiteral(List<MapLiteralEntry> entries) => new MapLiteral(entries);
15 MapLiteralEntry mapLiteralEntry(Literal key, Expression value) => 15 MapLiteralEntry mapLiteralEntry(Literal key, Expression value) =>
16 new MapLiteralEntry(key, value); 16 new MapLiteralEntry(key, value);
17 Identifier ident(String v) => new Identifier(v); 17 Identifier ident(String v) => new Identifier(v);
18 ParenthesizedExpression paren(Expression e) => new ParenthesizedExpression(e); 18 ParenthesizedExpression paren(Expression e) => new ParenthesizedExpression(e);
19 UnaryOperator unary(String op, Expression e) => new UnaryOperator(op, e); 19 UnaryOperator unary(String op, Expression e) => new UnaryOperator(op, e);
20 BinaryOperator binary(Expression l, String op, Expression r) => 20 BinaryOperator binary(Expression l, String op, Expression r) =>
21 new BinaryOperator(l, op, r); 21 new BinaryOperator(l, op, r);
22 Getter getter(Expression e, String m) => new Getter(e, m); 22 Getter getter(Expression e, String m) => new Getter(e, m);
23 Index index(Expression e, Expression a) => new Index(e, a); 23 Index index(Expression e, Expression a) => new Index(e, a);
24 Invoke invoke(Expression e, String m, List<Expression> a) => 24 Invoke invoke(Expression e, String m, List<Expression> a) =>
25 new Invoke(e, m, a); 25 new Invoke(e, m, a);
26 InExpression inExpr(Expression l, Expression r) => new InExpression(l, r); 26 InExpression inExpr(Expression l, Expression r) => new InExpression(l, r);
27 AsExpression asExpr(Expression l, Expression r) => new AsExpression(l, r);
27 TernaryOperator ternary(Expression c, Expression t, Expression f) => 28 TernaryOperator ternary(Expression c, Expression t, Expression f) =>
28 new TernaryOperator(c, t, f); 29 new TernaryOperator(c, t, f);
29 30
30 class AstFactory { 31 class AstFactory {
31 EmptyExpression empty() => const EmptyExpression(); 32 EmptyExpression empty() => const EmptyExpression();
32 33
33 Literal literal(v) => new Literal(v); 34 Literal literal(v) => new Literal(v);
34 35
35 MapLiteral mapLiteral(List<MapLiteralEntry> entries) => 36 MapLiteral mapLiteral(List<MapLiteralEntry> entries) =>
36 new MapLiteral(entries); 37 new MapLiteral(entries);
(...skipping 15 matching lines...) Expand all
52 new TernaryOperator(c, t, f); 53 new TernaryOperator(c, t, f);
53 54
54 Getter getter(Expression g, String n) => new Getter(g, n); 55 Getter getter(Expression g, String n) => new Getter(g, n);
55 56
56 Index index(Expression e, Expression a) => new Index(e, a); 57 Index index(Expression e, Expression a) => new Index(e, a);
57 58
58 Invoke invoke(Expression e, String m, List<Expression> a) => 59 Invoke invoke(Expression e, String m, List<Expression> a) =>
59 new Invoke(e, m, a); 60 new Invoke(e, m, a);
60 61
61 InExpression inExpr(Expression l, Expression r) => new InExpression(l, r); 62 InExpression inExpr(Expression l, Expression r) => new InExpression(l, r);
63
64 AsExpression asExpr(Expression l, Expression r) => new AsExpression(l, r);
62 } 65 }
63 66
64 /// Base class for all expressions 67 /// Base class for all expressions
65 abstract class Expression { 68 abstract class Expression {
66 const Expression(); 69 const Expression();
67 accept(Visitor v); 70 accept(Visitor v);
68 } 71 }
69 72
73 abstract class HasIdentifier {
74 String get identifier;
75 Expression get expr;
76 }
77
70 class EmptyExpression extends Expression { 78 class EmptyExpression extends Expression {
71 const EmptyExpression(); 79 const EmptyExpression();
72 accept(Visitor v) => v.visitEmptyExpression(this); 80 accept(Visitor v) => v.visitEmptyExpression(this);
73 } 81 }
74 82
75 class Literal<T> extends Expression { 83 class Literal<T> extends Expression {
76 final T value; 84 final T value;
77 85
78 Literal(this.value); 86 Literal(this.value);
79 87
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after
205 213
206 bool operator ==(o) => o is TernaryOperator 214 bool operator ==(o) => o is TernaryOperator
207 && o.condition == condition 215 && o.condition == condition
208 && o.trueExpr == trueExpr 216 && o.trueExpr == trueExpr
209 && o.falseExpr == falseExpr; 217 && o.falseExpr == falseExpr;
210 218
211 int get hashCode => _JenkinsSmiHash.hash3(condition.hashCode, 219 int get hashCode => _JenkinsSmiHash.hash3(condition.hashCode,
212 trueExpr.hashCode, falseExpr.hashCode); 220 trueExpr.hashCode, falseExpr.hashCode);
213 } 221 }
214 222
215 class InExpression extends Expression { 223 class InExpression extends Expression implements HasIdentifier {
216 final Expression left; 224 final Identifier left;
217 final Expression right; 225 final Expression right;
218 226
219 InExpression(this.left, this.right); 227 InExpression(this.left, this.right);
220 228
221 accept(Visitor v) => v.visitInExpression(this); 229 accept(Visitor v) => v.visitInExpression(this);
222 230
231 String get identifier => left.value;
232
233 Expression get expr => right;
234
223 String toString() => '($left in $right)'; 235 String toString() => '($left in $right)';
224 236
225 bool operator ==(o) => o is InExpression && o.left == left 237 bool operator ==(o) => o is InExpression && o.left == left
226 && o.right == right; 238 && o.right == right;
227 239
228 int get hashCode => _JenkinsSmiHash.hash2(left.hashCode, right.hashCode); 240 int get hashCode => _JenkinsSmiHash.hash2(left.hashCode, right.hashCode);
229 } 241 }
230 242
243 class AsExpression extends Expression implements HasIdentifier {
244 final Expression left;
245 final Identifier right;
246
247 AsExpression(this.left, this.right);
248
249 accept(Visitor v) => v.visitAsExpression(this);
250
251 String get identifier => right.value;
252
253 Expression get expr => left;
254
255 String toString() => '($left as $right)';
256
257 bool operator ==(o) => o is AsExpression && o.left == left
258 && o.right == right;
259
260 int get hashCode => _JenkinsSmiHash.hash2(left.hashCode, right.hashCode);
261 }
262
231 class Index extends Expression { 263 class Index extends Expression {
232 final Expression receiver; 264 final Expression receiver;
233 final Expression argument; 265 final Expression argument;
234 266
235 Index(this.receiver, this.argument); 267 Index(this.receiver, this.argument);
236 268
237 accept(Visitor v) => v.visitIndex(this); 269 accept(Visitor v) => v.visitIndex(this);
238 270
239 String toString() => '$receiver[$argument]'; 271 String toString() => '$receiver[$argument]';
240 272
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
327 } 359 }
328 360
329 static int hash2(int a, int b) => finish(combine(combine(0, a), b)); 361 static int hash2(int a, int b) => finish(combine(combine(0, a), b));
330 362
331 static int hash3(int a, int b, int c) => 363 static int hash3(int a, int b, int c) =>
332 finish(combine(combine(combine(0, a), b), c)); 364 finish(combine(combine(combine(0, a), b), c));
333 365
334 static int hash4(int a, int b, int c, int d) => 366 static int hash4(int a, int b, int c, int d) =>
335 finish(combine(combine(combine(combine(0, a), b), c), d)); 367 finish(combine(combine(combine(combine(0, a), b), c), d));
336 } 368 }
OLDNEW
« no previous file with comments | « pkg/polymer_expressions/lib/eval.dart ('k') | pkg/polymer_expressions/lib/parser.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698