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

Unified Diff: lib/src/js/nodes.dart

Issue 1263593003: restore arrow function bind this workaround (Closed) Base URL: git@github.com:dart-lang/dev_compiler.git@master
Patch Set: Created 5 years, 5 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
« no previous file with comments | « lib/src/codegen/js_printer.dart ('k') | lib/src/js/precedence.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: lib/src/js/nodes.dart
diff --git a/lib/src/js/nodes.dart b/lib/src/js/nodes.dart
index 63274a65672bcbe1b7a89123368fc709563f3c9d..7cff60c69151aeac024e38d60521fac762d789c4 100644
--- a/lib/src/js/nodes.dart
+++ b/lib/src/js/nodes.dart
@@ -943,8 +943,26 @@ class This extends Expression {
This _clone() => new This();
int get precedenceLevel => PRIMARY;
void visitChildren(NodeVisitor visitor) {}
+
+ static bool foundIn(Node node) {
+ _thisFinder.found = false;
+ node.accept(_thisFinder);
+ return _thisFinder.found;
+ }
+}
+
+final _thisFinder = new _ThisFinder();
+class _ThisFinder extends BaseVisitor {
+ bool found = false;
+ visitThis(This node) {
+ found = true;
+ }
+ visitNode(Node node) {
+ if (!found) super.visitNode(node);
+ }
}
+
// `super` is more restricted in the ES6 spec, but for simplicity we accept
// it anywhere that `this` is accepted.
class Super extends Expression {
@@ -968,7 +986,7 @@ class NamedFunction extends Expression {
}
NamedFunction _clone() => new NamedFunction(name, function);
- int get precedenceLevel => CALL;
+ int get precedenceLevel => PRIMARY_LOW_PRECEDENCE;
}
abstract class FunctionExpression extends Expression {
@@ -997,13 +1015,15 @@ class Fun extends FunctionExpression {
Fun _clone() => new Fun(params, body,
isGenerator: isGenerator, asyncModifier: asyncModifier);
- int get precedenceLevel => ASSIGNMENT;
+ int get precedenceLevel => PRIMARY_LOW_PRECEDENCE;
}
class ArrowFun extends FunctionExpression {
final List<Parameter> params;
final body; // Expression or Block
+ bool _closesOverThis; // lazy initialized
+
ArrowFun(this.params, this.body);
accept(NodeVisitor visitor) => visitor.visitArrowFun(this);
@@ -1012,13 +1032,16 @@ class ArrowFun extends FunctionExpression {
for (Parameter param in params) param.accept(visitor);
body.accept(visitor);
}
+ /// True if this function actually closes of `this`. We use this in some
+ /// situations to generate different code.
+ bool get closesOverThis {
+ if (_closesOverThis == null) _closesOverThis = This.foundIn(this);
+ return _closesOverThis;
+ }
- ArrowFun _clone() => new ArrowFun(params, body);
+ int get precedenceLevel => PRIMARY_LOW_PRECEDENCE;
- /// Ensure parens always get generated if necessary.
- // TODO(jmesserly): I'm not sure the printer is handling this correctly for
- // function() { ... } either.
- int get precedenceLevel => ASSIGNMENT;
+ ArrowFun _clone() => new ArrowFun(params, body);
}
/**
@@ -1307,7 +1330,7 @@ class ClassExpression extends Expression {
ClassExpression _clone() => new ClassExpression(name, heritage, methods);
- int get precedenceLevel => PRIMARY;
+ int get precedenceLevel => PRIMARY_LOW_PRECEDENCE;
}
class Method extends Property {
« no previous file with comments | « lib/src/codegen/js_printer.dart ('k') | lib/src/js/precedence.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698