| OLD | NEW |
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, 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 part of js_ast; | 5 part of js_ast; |
| 6 | 6 |
| 7 abstract class NodeVisitor<T> { | 7 abstract class NodeVisitor<T> { |
| 8 T visitProgram(Program node); | 8 T visitProgram(Program node); |
| 9 | 9 |
| 10 T visitBlock(Block node); | 10 T visitBlock(Block node); |
| (...skipping 940 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 951 | 951 |
| 952 Fun _clone() => new Fun(params, body, asyncModifier: asyncModifier); | 952 Fun _clone() => new Fun(params, body, asyncModifier: asyncModifier); |
| 953 | 953 |
| 954 int get precedenceLevel => CALL; | 954 int get precedenceLevel => CALL; |
| 955 } | 955 } |
| 956 | 956 |
| 957 class ArrowFun extends FunctionExpression { | 957 class ArrowFun extends FunctionExpression { |
| 958 final List<Identifier> params; | 958 final List<Identifier> params; |
| 959 final body; // Expression or Block | 959 final body; // Expression or Block |
| 960 | 960 |
| 961 bool _bindThisWorkaround; // lazy initialized | |
| 962 | |
| 963 ArrowFun(this.params, this.body); | 961 ArrowFun(this.params, this.body); |
| 964 | 962 |
| 965 accept(NodeVisitor visitor) => visitor.visitArrowFun(this); | 963 accept(NodeVisitor visitor) => visitor.visitArrowFun(this); |
| 966 | 964 |
| 967 void visitChildren(NodeVisitor visitor) { | 965 void visitChildren(NodeVisitor visitor) { |
| 968 for (Identifier param in params) param.accept(visitor); | 966 for (Identifier param in params) param.accept(visitor); |
| 969 body.accept(visitor); | 967 body.accept(visitor); |
| 970 } | 968 } |
| 971 | 969 |
| 972 ArrowFun _clone() => new ArrowFun(params, body); | 970 ArrowFun _clone() => new ArrowFun(params, body); |
| 973 | 971 |
| 974 /// This is a workaround for V8 arrow function bindings being not yet | |
| 975 /// implemented. See <https://code.google.com/p/v8/issues/detail?id=2700> | |
| 976 bool get bindThisWorkaround { | |
| 977 if (_bindThisWorkaround != null) return _bindThisWorkaround; | |
| 978 var visitor = new _ThisFinder(); | |
| 979 body.accept(visitor); | |
| 980 return _bindThisWorkaround = visitor.found; | |
| 981 } | |
| 982 | |
| 983 /// Ensure parens always get generated if necessary. | 972 /// Ensure parens always get generated if necessary. |
| 984 // TODO(jmesserly): I'm not sure the printer is handling this correctly for | 973 // TODO(jmesserly): I'm not sure the printer is handling this correctly for |
| 985 // function() { ... } either. | 974 // function() { ... } either. |
| 986 int get precedenceLevel => bindThisWorkaround ? CALL : ASSIGNMENT; | 975 int get precedenceLevel => ASSIGNMENT; |
| 987 } | |
| 988 | |
| 989 class _ThisFinder extends BaseVisitor { | |
| 990 bool found = false; | |
| 991 visitThis(This node) { | |
| 992 found = true; | |
| 993 } | |
| 994 visitNode(Node node) { | |
| 995 if (!found) super.visitNode(node); | |
| 996 } | |
| 997 } | 976 } |
| 998 | 977 |
| 999 class AsyncModifier { | 978 class AsyncModifier { |
| 1000 final bool isAsync; | 979 final bool isAsync; |
| 1001 final bool isYielding; | 980 final bool isYielding; |
| 1002 final String description; | 981 final String description; |
| 1003 | 982 |
| 1004 const AsyncModifier.sync() | 983 const AsyncModifier.sync() |
| 1005 : isAsync = false, | 984 : isAsync = false, |
| 1006 isYielding = false, | 985 isYielding = false, |
| (...skipping 442 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1449 final Expression expression; | 1428 final Expression expression; |
| 1450 | 1429 |
| 1451 CommentExpression(this.comment, this.expression); | 1430 CommentExpression(this.comment, this.expression); |
| 1452 | 1431 |
| 1453 int get precedenceLevel => PRIMARY; | 1432 int get precedenceLevel => PRIMARY; |
| 1454 accept(NodeVisitor visitor) => visitor.visitCommentExpression(this); | 1433 accept(NodeVisitor visitor) => visitor.visitCommentExpression(this); |
| 1455 CommentExpression _clone() => new CommentExpression(comment, expression); | 1434 CommentExpression _clone() => new CommentExpression(comment, expression); |
| 1456 | 1435 |
| 1457 void visitChildren(NodeVisitor visitor) => expression.accept(visitor); | 1436 void visitChildren(NodeVisitor visitor) => expression.accept(visitor); |
| 1458 } | 1437 } |
| OLD | NEW |