class CodeGenerator
extends java.lang.Object
Modifier and Type | Class and Description |
---|---|
(package private) static class |
CodeGenerator.Context |
Modifier and Type | Field and Description |
---|---|
private CodeConsumer |
cc |
private java.util.Map<java.lang.String,java.lang.String> |
escapedJsStrings |
private static java.lang.String |
GT_ESCAPED |
private CompilerOptions.LanguageMode |
languageMode |
private static java.lang.String |
LT_ESCAPED |
private OutputCharsetEncoder |
outputCharsetEncoder |
private boolean |
preferSingleQuotes |
private boolean |
preserveTypeAnnotations |
private boolean |
trustedStrings |
Modifier | Constructor and Description |
---|---|
private |
CodeGenerator(CodeConsumer consumer) |
(package private) |
CodeGenerator(CodeConsumer consumer,
CompilerOptions options) |
Modifier and Type | Method and Description |
---|---|
(package private) void |
add(Node n) |
(package private) void |
add(Node n,
CodeGenerator.Context context) |
(package private) void |
add(java.lang.String str) |
(package private) void |
addAllSiblings(Node n) |
(package private) void |
addArrayList(Node firstInList)
This function adds a comma-separated list as is specified by an ARRAYLIT
node with the associated skipIndexes array.
|
(package private) void |
addArrayPattern(Node n) |
private void |
addArrowFunction(Node n,
Node first,
Node last,
CodeGenerator.Context context) |
(package private) void |
addCaseBody(Node caseBody) |
private void |
addExpr(Node n,
int minPrecedence,
CodeGenerator.Context context) |
private void |
addFunction(Node n,
Node first,
Node last,
CodeGenerator.Context context) |
private void |
addIdentifier(java.lang.String identifier) |
private void |
addJsString(Node n)
Outputs a JS string, using the optimal (single/double) quote character
|
(package private) void |
addList(Node firstInList) |
(package private) void |
addList(Node firstInList,
boolean isArrayOrFunctionArgument,
CodeGenerator.Context lhsContext,
java.lang.String separator) |
(package private) void |
addList(Node firstInList,
java.lang.String separator) |
private void |
addNonEmptyStatement(Node n,
CodeGenerator.Context context,
boolean allowNonBlockChild)
Adds a block or expression, substituting a VOID with an empty statement.
|
(package private) void |
addObjectPattern(Node n) |
(package private) void |
addStringKey(Node n) |
private boolean |
arrowFunctionNeedsParens(Node parent,
CodeGenerator.Context context) |
(package private) static CodeGenerator |
forCostEstimation(CodeConsumer consumer) |
private static CodeGenerator.Context |
getContextForNoInOperator(CodeGenerator.Context context)
If we're in a IN_FOR_INIT_CLAUSE, we can't permit in operators in the
expression.
|
private static CodeGenerator.Context |
getContextForNonEmptyExpression(CodeGenerator.Context currentContext) |
private static Node |
getFirstNonEmptyChild(Node n)
Gets the first non-empty child of the given node.
|
private static int |
getNonEmptyChildCount(Node n,
int maxCount) |
(package private) static double |
getSimpleNumber(java.lang.String s) |
(package private) static java.lang.String |
identifierEscape(java.lang.String s) |
private static boolean |
isBlockDeclOrDo(Node n) |
private static boolean |
isIndirectEval(Node n) |
private boolean |
isPatternInitializer(Node n)
Determines whether the given child of a destructuring pattern is the initializer for
that pattern.
|
(package private) static boolean |
isSimpleNumber(java.lang.String s) |
private java.lang.String |
jsString(java.lang.String s,
boolean useSlashV) |
private void |
maybeAddAccessibilityModifier(Node n) |
private void |
maybeAddGenericTypes(Node n) |
private void |
maybeAddOptional(Node n) |
private void |
maybeAddTypeDecl(Node n) |
private void |
processEnd(Node n,
CodeGenerator.Context context) |
(package private) java.lang.String |
regexpEscape(java.lang.String s) |
(package private) java.lang.String |
regexpEscape(java.lang.String s,
OutputCharsetEncoder outputCharsetEncoder)
Escapes regular expression
|
private java.lang.String |
strEscape(java.lang.String s,
char quote,
java.lang.String doublequoteEscape,
java.lang.String singlequoteEscape,
java.lang.String backslashEscape,
OutputCharsetEncoder outputCharsetEncoder,
boolean useSlashV,
boolean isRegexp)
Helper to escape JavaScript string as well as regular expression
|
void |
tagAsStrict()
Insert a ECMASCRIPT 5 strict annotation.
|
private void |
unrollBinaryOperator(Node n,
int op,
java.lang.String opStr,
CodeGenerator.Context context,
CodeGenerator.Context rhsContext,
int leftPrecedence,
int rightPrecedence)
We could use addList recursively here, but sometimes we produce
very deeply nested operators and run out of stack space, so we
just unroll the recursion when possible.
|
private static final java.lang.String LT_ESCAPED
private static final java.lang.String GT_ESCAPED
private final java.util.Map<java.lang.String,java.lang.String> escapedJsStrings
private final CodeConsumer cc
private final OutputCharsetEncoder outputCharsetEncoder
private final boolean preferSingleQuotes
private final boolean preserveTypeAnnotations
private final boolean trustedStrings
private final CompilerOptions.LanguageMode languageMode
private CodeGenerator(CodeConsumer consumer)
CodeGenerator(CodeConsumer consumer, CompilerOptions options)
static CodeGenerator forCostEstimation(CodeConsumer consumer)
public void tagAsStrict()
void add(java.lang.String str)
private void addIdentifier(java.lang.String identifier)
void add(Node n)
void add(Node n, CodeGenerator.Context context)
private boolean arrowFunctionNeedsParens(Node parent, CodeGenerator.Context context)
private void addArrowFunction(Node n, Node first, Node last, CodeGenerator.Context context)
private void addFunction(Node n, Node first, Node last, CodeGenerator.Context context)
private void maybeAddAccessibilityModifier(Node n)
private void maybeAddTypeDecl(Node n)
private void maybeAddGenericTypes(Node n)
private void maybeAddOptional(Node n)
private void unrollBinaryOperator(Node n, int op, java.lang.String opStr, CodeGenerator.Context context, CodeGenerator.Context rhsContext, int leftPrecedence, int rightPrecedence)
static boolean isSimpleNumber(java.lang.String s)
static double getSimpleNumber(java.lang.String s)
private static boolean isIndirectEval(Node n)
private void addNonEmptyStatement(Node n, CodeGenerator.Context context, boolean allowNonBlockChild)
n
- The node to print.context
- The context to determine how the node should be printed.private static boolean isBlockDeclOrDo(Node n)
private void addExpr(Node n, int minPrecedence, CodeGenerator.Context context)
void addList(Node firstInList)
void addList(Node firstInList, java.lang.String separator)
void addList(Node firstInList, boolean isArrayOrFunctionArgument, CodeGenerator.Context lhsContext, java.lang.String separator)
void addStringKey(Node n)
private boolean isPatternInitializer(Node n)
var {x:y} = z
looks like:
VAR OBJECT_PATTERN STRING_KEY x NAME y NAME zThe exception is when the var/let/const is the first child of a for-in or for-of loop, in which case all the children belong to the pattern itself, e.g. the VAR node in
for (var {x: y, z} of []);
looks like
VAR OBJECT_PATTERN STRING_KEY x NAME y STRING_KEY zand the "z" node is *not* an initializer.
void addArrayPattern(Node n)
void addObjectPattern(Node n)
void addArrayList(Node firstInList)
firstInList
- The first in the node list (chained through the next
property).void addCaseBody(Node caseBody)
void addAllSiblings(Node n)
private void addJsString(Node n)
private java.lang.String jsString(java.lang.String s, boolean useSlashV)
java.lang.String regexpEscape(java.lang.String s, OutputCharsetEncoder outputCharsetEncoder)
java.lang.String regexpEscape(java.lang.String s)
private java.lang.String strEscape(java.lang.String s, char quote, java.lang.String doublequoteEscape, java.lang.String singlequoteEscape, java.lang.String backslashEscape, OutputCharsetEncoder outputCharsetEncoder, boolean useSlashV, boolean isRegexp)
static java.lang.String identifierEscape(java.lang.String s)
private static int getNonEmptyChildCount(Node n, int maxCount)
maxCount
- The maximum number of children to look for.private static Node getFirstNonEmptyChild(Node n)
private static CodeGenerator.Context getContextForNonEmptyExpression(CodeGenerator.Context currentContext)
private static CodeGenerator.Context getContextForNoInOperator(CodeGenerator.Context context)
private void processEnd(Node n, CodeGenerator.Context context)