private static class RuntimeTypeCheck.AddMarkers extends NodeTraversal.AbstractPostOrderCallback
For example, for a class C, we add
C.prototype['instance_of__C']
, and for each interface I it
implements , we add C.prototype['implements__I']
.
Since interfaces are not a run-time JS concept, we use these markers to recognize an interface implementation at runtime. We also use markers for user-defined classes, so that we can easily recognize them independently of which module they are defined in and whether the module is loaded.
Modifier and Type | Field and Description |
---|---|
private AbstractCompiler |
compiler |
Modifier | Constructor and Description |
---|---|
private |
AddMarkers(AbstractCompiler compiler) |
Modifier and Type | Method and Description |
---|---|
private Node |
addMarker(FunctionType funType,
Node nodeToInsertAfter,
ObjectType interfaceType) |
private static Node |
findEnclosingConstructorDeclaration(Node n) |
private Node |
findNodeToInsertAfter(Node n)
Find the node to insert the markers after.
|
private boolean |
isClassDefiningCall(Node next) |
void |
visit(NodeTraversal t,
Node n,
Node parent)
Visits a node in postorder (after its children have been visited).
|
private void |
visitFunction(Node n) |
shouldTraverse
private final AbstractCompiler compiler
private AddMarkers(AbstractCompiler compiler)
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).
private void visitFunction(Node n)
private Node addMarker(FunctionType funType, Node nodeToInsertAfter, @Nullable ObjectType interfaceType)
private Node findNodeToInsertAfter(Node n)
n
- the constructor function nodeprivate boolean isClassDefiningCall(Node next)