private class InlineVariables.InliningBehavior extends java.lang.Object implements ReferenceCollectingCallback.Behavior
Modifier and Type | Field and Description |
---|---|
(package private) java.util.Map<Node,InlineVariables.AliasCandidate> |
aliasCandidates
Stored possible aliases of variables that never change, with
all the reference info about those variables.
|
private java.util.Set<Var> |
staleVars
A list of variables that should not be inlined, because their
reference information is out of sync with the state of the AST.
|
Modifier | Constructor and Description |
---|---|
private |
InliningBehavior() |
Modifier and Type | Method and Description |
---|---|
void |
afterExitScope(NodeTraversal t,
ReferenceCollectingCallback.ReferenceMap referenceMap)
Called after we finish with a scope.
|
private void |
blacklistVarReferencesInTree(Node root,
Scope scope)
If there are any variable references in the given node tree, blacklist
them to prevent the pass from trying to inline the variable.
|
private boolean |
canInline(ReferenceCollectingCallback.Reference declaration,
ReferenceCollectingCallback.Reference initialization,
ReferenceCollectingCallback.Reference reference) |
private boolean |
canMoveAggressively(Node value)
If the value is a literal, we can cross more boundaries to inline it.
|
private boolean |
canMoveModerately(ReferenceCollectingCallback.Reference initialization,
ReferenceCollectingCallback.Reference reference)
If the value of a variable is not constant, then it may read or modify
state.
|
private void |
collectAliasCandidates(NodeTraversal t,
ReferenceCollectingCallback.ReferenceMap referenceMap)
If any of the variables are well-defined and alias other variables,
mark them as aliasing candidates.
|
private void |
doInlinesForScope(NodeTraversal t,
ReferenceCollectingCallback.ReferenceMap referenceMap)
For all variables in this scope, see if they are only used once.
|
private void |
inline(Var v,
ReferenceCollectingCallback.Reference decl,
ReferenceCollectingCallback.Reference init,
ReferenceCollectingCallback.Reference ref)
Do the actual work of inlining a single declaration into a single
reference.
|
private void |
inlineDeclaredConstant(Var v,
Node value,
java.util.List<ReferenceCollectingCallback.Reference> refSet)
Inline a declared constant.
|
private void |
inlineNonConstants(Var v,
ReferenceCollectingCallback.ReferenceCollection referenceInfo,
boolean maybeModifiedArguments) |
private void |
inlineValue(Var v,
ReferenceCollectingCallback.Reference ref,
Node value)
Replace the given reference with the given value node.
|
private void |
inlineWellDefinedVariable(Var v,
Node value,
java.util.List<ReferenceCollectingCallback.Reference> refSet)
Inline an immutable variable into all of its references.
|
private boolean |
isImmutableAndWellDefinedVariable(Var v,
ReferenceCollectingCallback.ReferenceCollection refInfo)
Determines whether the reference collection describes a variable that
is initialized to an immutable value, never modified, and defined before
every reference.
|
private boolean |
isInlineableDeclaredConstant(Var var,
ReferenceCollectingCallback.ReferenceCollection refInfo)
Determines whether the given variable is declared as a constant
and may be inlined.
|
private boolean |
isLValue(Node n) |
private boolean |
isStringWorthInlining(Var var,
java.util.List<ReferenceCollectingCallback.Reference> refs)
Compute whether the given string is worth inlining.
|
private boolean |
isValidDeclaration(ReferenceCollectingCallback.Reference declaration) |
private boolean |
isValidInitialization(ReferenceCollectingCallback.Reference initialization) |
private boolean |
isValidReference(ReferenceCollectingCallback.Reference reference) |
private boolean |
isVarInlineForbidden(Var var)
Whether the given variable is forbidden from being inlined.
|
private boolean |
maybeEscapedOrModifiedArguments(Scope scope,
ReferenceCollectingCallback.ReferenceMap referenceMap) |
private void |
removeDeclaration(ReferenceCollectingCallback.Reference decl)
Remove the given VAR declaration.
|
private final java.util.Set<Var> staleVars
final java.util.Map<Node,InlineVariables.AliasCandidate> aliasCandidates
public void afterExitScope(NodeTraversal t, ReferenceCollectingCallback.ReferenceMap referenceMap)
ReferenceCollectingCallback.Behavior
afterExitScope
in interface ReferenceCollectingCallback.Behavior
private void collectAliasCandidates(NodeTraversal t, ReferenceCollectingCallback.ReferenceMap referenceMap)
private void doInlinesForScope(NodeTraversal t, ReferenceCollectingCallback.ReferenceMap referenceMap)
private boolean maybeEscapedOrModifiedArguments(Scope scope, ReferenceCollectingCallback.ReferenceMap referenceMap)
private boolean isLValue(Node n)
private void inlineNonConstants(Var v, ReferenceCollectingCallback.ReferenceCollection referenceInfo, boolean maybeModifiedArguments)
private void blacklistVarReferencesInTree(Node root, Scope scope)
private boolean isVarInlineForbidden(Var var)
private void inline(Var v, ReferenceCollectingCallback.Reference decl, ReferenceCollectingCallback.Reference init, ReferenceCollectingCallback.Reference ref)
private void inlineWellDefinedVariable(Var v, Node value, java.util.List<ReferenceCollectingCallback.Reference> refSet)
private void inlineDeclaredConstant(Var v, Node value, java.util.List<ReferenceCollectingCallback.Reference> refSet)
private void removeDeclaration(ReferenceCollectingCallback.Reference decl)
private void inlineValue(Var v, ReferenceCollectingCallback.Reference ref, Node value)
v
- The variable that's referenced.ref
- The reference to replace.value
- The node tree to replace it with. This tree should be safe
to re-parent.private boolean isInlineableDeclaredConstant(Var var, ReferenceCollectingCallback.ReferenceCollection refInfo)
private boolean isStringWorthInlining(Var var, java.util.List<ReferenceCollectingCallback.Reference> refs)
private boolean canInline(ReferenceCollectingCallback.Reference declaration, ReferenceCollectingCallback.Reference initialization, ReferenceCollectingCallback.Reference reference)
private boolean canMoveAggressively(Node value)
private boolean canMoveModerately(ReferenceCollectingCallback.Reference initialization, ReferenceCollectingCallback.Reference reference)
private boolean isValidDeclaration(ReferenceCollectingCallback.Reference declaration)
private boolean isValidInitialization(ReferenceCollectingCallback.Reference initialization)
private boolean isValidReference(ReferenceCollectingCallback.Reference reference)
private boolean isImmutableAndWellDefinedVariable(Var v, ReferenceCollectingCallback.ReferenceCollection refInfo)