@VisibleForTesting static Map<String, Node> getAdditionalReplacements(CompilerOptions options) { Map<String, Node> additionalReplacements = new HashMap<>(); if (options.markAsCompiled || options.closurePass) { additionalReplacements.put(COMPILED_CONSTANT_NAME, IR.trueNode()); } if (options.closurePass && options.locale != null) { additionalReplacements.put(CLOSURE_LOCALE_CONSTANT_NAME, IR.string(options.locale)); } return additionalReplacements; }
Node buildLineDeclaration(String uri, int lineNo) { Node coverVar = IR.name("_$jscoverage"); Node path = IR.string(uri); Node getURI = IR.getelem(coverVar, path); Node prop = IR.string("branchData"); Node propGet = IR.getprop(getURI, prop); Node number = IR.string("" + lineNo); return IR.getelem(propGet, number); }
Node buildLineDeclaration(String uri, int lineNo) { Node coverVar = IR.name("_$jscoverage"); Node path = IR.string(uri); Node getURI = IR.getelem(coverVar, path); Node prop = IR.string("branchData"); Node propGet = IR.getprop(getURI, prop); Node number = IR.string("" + lineNo); return IR.getelem(propGet, number); }
Node processTypeQuery(TypeQueryTree tree) { Iterator<String> segmentsIt = tree.segments.iterator(); Node node = newStringNode(Token.NAME, segmentsIt.next()); while (segmentsIt.hasNext()) { node = IR.getprop(node, IR.string(segmentsIt.next())); } return cloneProps(new TypeDeclarationNode(Token.TYPEOF, node)); }
Node buildLineNumberExpression(int lineNumber, String fileName, String identifier) { Node coverVar = IR.name("_$jscoverage"); Node path = IR.string(fileName); Node getURI = IR.getelem(coverVar, path); Node prop = IR.string(identifier); Node propGet = IR.getprop(getURI, prop); Node number = IR.number(lineNumber); return IR.getelem(propGet, number); }
Node createString(String value) { Node result = IR.string(value); if (isAddingTypes()) { result.setJSType(getNativeType(JSTypeNative.STRING_TYPE)); } return result; }
/** * @return The lowered string Node. */ private Node tryFoldStringToLowerCase(Node subtree, Node stringNode) { // From Rhino, NativeString.java. See ECMA 15.5.4.11 String lowered = stringNode.getString().toLowerCase(Locale.ROOT); Node replacement = IR.string(lowered); subtree.getParent().replaceChild(subtree, replacement); reportCodeChange(); return replacement; }
/** * @return The upped string Node. */ private Node tryFoldStringToUpperCase(Node subtree, Node stringNode) { // From Rhino, NativeString.java. See ECMA 15.5.4.12 String upped = stringNode.getString().toUpperCase(Locale.ROOT); Node replacement = IR.string(upped); subtree.getParent().replaceChild(subtree, replacement); reportCodeChange(); return replacement; }
/** * Creates a property access on the {@code context} tree. */ public static Node newPropertyAccess(AbstractCompiler compiler, Node context, String name) { Node propNode = IR.getprop(context, IR.string(name)); if (compiler.getCodingConvention().isConstantKey(name)) { propNode.putBooleanProp(Node.IS_CONSTANT_NAME, true); } return propNode; }
private JSTypeExpression getSuperclassFor(Node superNode) { final String superName; if (superNode.isQualifiedName()) { superName = superNode.getQualifiedName(); } else { checkState(NodeUtil.isCallTo(superNode, "goog.module.get")); superName = superNode.getLastChild().getString(); } return new JSTypeExpression(new Node(Token.BANG, IR.string(superName)), VIRTUAL_FILE); }
/** Creates node that access a specified field of the current context. */ Node getContextField(Node sourceNode, String fieldName) { return withType( IR.getprop( getJsContextNameNode(sourceNode), IR.string(fieldName).useSourceInfoFrom(sourceNode)), shouldAddTypes ? contextType.getPropertyType(fieldName) : null) .useSourceInfoFrom(sourceNode); }
private static Node createRawStringArray(Node n) { Node array = IR.arraylit(); for (Node child = n.getFirstChild(); child != null; child = child.getNext()) { if (child.isString()) { array.addChildToBack(IR.string((String) child.getProp(Node.RAW_STRING_VALUE))); } } return array; }
private Node createMathPowCall() { return IR.call( IR.getprop( IR.name("Math").setJSType(mathType), // Force wrapping. IR.string("pow").setJSType(stringType)) .setJSType(mathPowType)) .setJSType(numberType); } }
public Node buildLineAndConditionCall(String uri, int lineNo, int conditionNo) { Node indexLineNumber = buildLineDeclaration(uri, lineNo); Node conditionNumberLiteral = IR.number(conditionNo); Node indexConditionNumber = IR.getelem(indexLineNumber, conditionNumberLiteral); Node initCall = IR.string("ranCondition"); Node propertyName = IR.getprop(indexConditionNumber, initCall); Node result = IR.name("result"); Node fnCall = IR.call(propertyName, result); return IR.exprResult(fnCall); }
public Node buildLineAndConditionInitialisation(String uri, int lineNo, int conditionNo, int position, int length) { Node indexLineNumber = buildLineDeclaration(uri, lineNo); Node conditionNumberLiteral = IR.number(conditionNo); Node indexConditionNumber = IR.getelem(indexLineNumber, conditionNumberLiteral); Node positionLiteral = IR.number(position); Node lengthLiteral = IR.number(length); Node initCall = IR.string("init"); Node propertyName = IR.getprop(indexConditionNumber, initCall); Node fnCall = IR.call(propertyName, positionLiteral, lengthLiteral); return IR.exprResult(fnCall); }
private Node tryRewriteStringValueOfCall(Node n) { Node param = n.getSecondChild(); if (NodeUtil.isUndefined(param)) { return IR.string("null"); } else if (NodeUtil.isDefinedValue(param) && !param.isArrayLit()) { // Generate String(param), let other peephole optimizations handle the rest when safe return NodeUtil.newCallNode(IR.name("String").useSourceInfoFrom(n), param.detach()); } return n; }
@Override public void visit(NodeTraversal t, Node n, Node parent) { if (n.isReturn() && n.hasChildren()) { Node retVal = n.getFirstChild(); n.removeChild(retVal); parent.replaceChild(n, IR.exprResult( IR.assign( IR.getprop(IR.name("module"), IR.string("exports")), retVal)) .useSourceInfoFromForTree(n)); } } }
private void addExtern(String export) { Node objectPrototype = NodeUtil.newQName(compiler, "Object.prototype"); JSType objCtor = compiler.getTypeRegistry().getNativeType(JSTypeNative.OBJECT_FUNCTION_TYPE); objectPrototype.getFirstChild().setJSType(objCtor); Node propstmt = IR.exprResult(IR.getprop(objectPrototype, IR.string(export))); propstmt.useSourceInfoFromForTree(getSynthesizedExternsRoot()); propstmt.setOriginalName(export); getSynthesizedExternsRoot().addChildToBack(propstmt); compiler.reportChangeToEnclosingScope(propstmt); }