public final class DartSuperAccessorsPass extends java.lang.Object implements NodeTraversal.Callback, HotSwapCompilerPass
super
getter and setter calls in order to support the output
of the Dart Dev Compiler (https://github.com/dart-lang/dev_compiler). This has
to run before the Es6ConvertSuper
pass.
Note that the approach taken here doesn't lend itself to good optimizations of getters and setters. An alternative approach is needed to generate fully optimizable output before general ES6→ES5 lowering of super accessor expressions can be rolled out.
TODO(ochafik): Add support for `super.x++` (and --, pre/post variants).
Modifier and Type | Field and Description |
---|---|
(package private) static java.lang.String |
CALL_SUPER_GET |
(package private) static java.lang.String |
CALL_SUPER_SET |
private AbstractCompiler |
compiler |
private boolean |
renameProperties
Whether JSCompiler_renameProperty can and should be used (i.e.
|
Constructor and Description |
---|
DartSuperAccessorsPass(AbstractCompiler compiler) |
Modifier and Type | Method and Description |
---|---|
void |
hotSwapScript(Node scriptRoot,
Node originalRoot)
Process the JS with root node root.
|
private static boolean |
isCalled(Node n) |
private static boolean |
isInsideInstanceMember(Node n)
Returns true if this node is or is enclosed by an instance member definition
(non-static method, getter or setter).
|
private boolean |
isSuperGet(Node n) |
private boolean |
isSuperSet(Node n) |
private static Node |
normalizeAssignmentOp(Node n)
Transforms `a += b` to `a = a + b`.
|
void |
process(Node externs,
Node root)
Process the JS with root node root.
|
private Node |
renameProperty(Node propertyName)
Wraps a property string in a JSCompiler_renameProperty call.
|
private static Node |
replace(Node original,
Node replacement) |
private void |
reportEs6Change() |
boolean |
shouldTraverse(NodeTraversal t,
Node n,
Node parent)
Visits a node in pre order (before visiting its children) and decides
whether this node's children should be traversed.
|
void |
visit(NodeTraversal t,
Node n,
Node parent)
Visits a node in postorder (after its children have been visited).
|
private void |
visitSuperGet(Node superGet) |
private void |
visitSuperSet(Node superSet) |
static final java.lang.String CALL_SUPER_GET
static final java.lang.String CALL_SUPER_SET
private final AbstractCompiler compiler
private final boolean renameProperties
public DartSuperAccessorsPass(AbstractCompiler compiler)
public boolean shouldTraverse(NodeTraversal t, Node n, Node parent)
NodeTraversal.Callback
Visits a node in pre order (before visiting its children) and decides
whether this node's children should be traversed. If children are
traversed, they will be visited by
NodeTraversal.Callback.visit(NodeTraversal, Node, Node)
in postorder.
Implementations can have side effects (e.g. modifying the parse tree).
shouldTraverse
in interface NodeTraversal.Callback
private static boolean isCalled(Node n)
private static Node normalizeAssignmentOp(Node n)
public void visit(NodeTraversal t, Node n, Node parent)
NodeTraversal.Callback
Visits a node in postorder (after its children have been visited).
A node is visited only if all its parents should be traversed
(NodeTraversal.Callback.shouldTraverse(NodeTraversal, Node, Node)
).
Implementations can have side effects (e.g. modifying the parse tree).
visit
in interface NodeTraversal.Callback
private boolean isSuperGet(Node n)
private boolean isSuperSet(Node n)
private static boolean isInsideInstanceMember(Node n)
private void visitSuperGet(Node superGet)
private void visitSuperSet(Node superSet)
private void reportEs6Change()
private Node renameProperty(Node propertyName)
Should only be called in phases running before RenameProperties
,
if such a pass is even used (see renameProperties
).
public void process(Node externs, Node root)
CompilerPass
process
in interface CompilerPass
externs
- Top of external JS treeroot
- Top of JS treepublic void hotSwapScript(Node scriptRoot, Node originalRoot)
HotSwapCompilerPass
hotSwapScript
in interface HotSwapCompilerPass
scriptRoot
- Root node corresponding to the file that is modified,
should be of type Token.SCRIPT
.originalRoot
- Root node corresponding to the original version of the
file that is modified. Should be of type token.SCRIPT
.