private ClassDeclarationMetadata(Node insertionPoint, String fullClassName, boolean anonymous, Node classNameNode, Node superClassNameNode) { this.insertionPoint = insertionPoint; this.definePropertiesObjForClass = IR.objectlit(); this.definePropertiesObjForPrototype = IR.objectlit(); this.prototypeMembersToDeclare = new LinkedHashMap<String, JSDocInfo>(); this.prototypeComputedPropsToDeclare = new LinkedHashMap<String, JSDocInfo>(); this.classMembersToDeclare = new LinkedHashMap<String, JSDocInfo>(); this.fullClassName = fullClassName; this.anonymous = anonymous; this.classNameNode = classNameNode; this.superClassNameNode = superClassNameNode; }
@Override public Node getLValue() { // As far as we know, only the property name matters so the target can be an object literal return IR.getprop(IR.objectlit(), memberFunctionDef.getString()); } }
private Node createObjectLit() { Node objectlit = IR.objectlit(); if (shouldAddTypesOnNewAstNodes) { objectlit.setJSType(getNativeType(OBJECT_TYPE)); } return objectlit; }
RecordTypePropertyDefinition(Node name) { super(IR.getprop(IR.objectlit(), name.cloneNode()), /** isExtern */ true); checkArgument(name.isString()); }
RecordTypePropertyDefinition(Node name) { super(IR.getprop(IR.objectlit(), name.cloneNode()), /** isExtern */ true); Preconditions.checkArgument(name.isString()); }
/** Creates an empty object literal, `{}`. */ Node createEmptyObjectLit() { Node result = IR.objectlit(); if (isAddingTypes()) { result.setJSType(registry.createAnonymousObjectType(null)); } return result; }
/** * There are some special cases where clients of the compiler * do not run TypedScopeCreator after running this pass. * So always give the namespace literal a type. */ private Node createNamespaceLiteral() { Node objlit = IR.objectlit(); objlit.setJSType( compiler.getTypeRegistry().createAnonymousObjectType(null)); return objlit; }
/** Adds exports to the exports object using Object.defineProperties. */ private void addExportDef() { if (!exportedNameToLocalQName.isEmpty()) { Node definePropertiesLit = IR.objectlit(); for (Map.Entry<String, LocalQName> entry : exportedNameToLocalQName.entrySet()) { addExport(definePropertiesLit, entry.getKey(), entry.getValue()); } script.addChildToFront( IR.exprResult( IR.call( NodeUtil.newQName(compiler, "Object.defineProperties"), IR.name(EXPORTS), definePropertiesLit)) .useSourceInfoIfMissingFromForTree(script)); } }
/** * Creates a JS object that holds a map of tweakId -> default value override. */ private Node createCompilerDefaultValueOverridesVarNode( Node sourceInformationNode) { Node objNode = IR.objectlit().srcref(sourceInformationNode); for (Entry<String, Node> entry : compilerDefaultValueOverrides.entrySet()) { Node objKeyNode = IR.stringKey(entry.getKey()) .useSourceInfoIfMissingFrom(sourceInformationNode); Node objValueNode = entry.getValue().cloneNode() .useSourceInfoIfMissingFrom(sourceInformationNode); objKeyNode.addChildToBack(objValueNode); objNode.addChildToBack(objKeyNode); } return objNode; }
@Override public Node getLValue() { // TODO(user) revisit: object literal definitions are an example // of definitions whose LHS doesn't correspond to a node that // exists in the AST. We will have to change the return type of // getLValue sooner or later in order to provide this added // flexibility. switch (name.getType()) { case Token.SETTER_DEF: case Token.GETTER_DEF: case Token.STRING_KEY: // TODO(johnlenz): return a GETELEM for quoted strings. return IR.getprop( IR.objectlit(), IR.string(name.getString())); default: throw new IllegalStateException("unexpected"); } }
/** * Creates a JS object that holds a map of tweakId -> default value override. */ private Node createCompilerDefaultValueOverridesVarNode( Node sourceInformationNode) { Node objNode = IR.objectlit().srcref(sourceInformationNode); for (Entry<String, Node> entry : compilerDefaultValueOverrides.entrySet()) { Node objKeyNode = IR.stringKey(entry.getKey()) .useSourceInfoIfMissingFrom(sourceInformationNode); Node objValueNode = entry.getValue().cloneNode() .useSourceInfoIfMissingFrom(sourceInformationNode); objKeyNode.addChildToBack(objValueNode); objNode.addChildToBack(objKeyNode); } return objNode; }
private Node createPropertyDescriptor() { return IR.objectlit( astFactory.createStringKey("configurable", astFactory.createBoolean(true)), astFactory.createStringKey("enumerable", astFactory.createBoolean(true))) .setJSType(objectPropertyDescriptorType); }
private static Node getLValue(Node name) { // TODO(user) revisit: object literal definitions are an example // of definitions whose LHS doesn't correspond to a node that // exists in the AST. We will have to change the return type of // getLValue sooner or later in order to provide this added // flexibility. switch (name.getToken()) { case SETTER_DEF: case GETTER_DEF: case STRING_KEY: case MEMBER_FUNCTION_DEF: // TODO(johnlenz): return a GETELEM for quoted strings. return IR.getprop( IR.objectlit(), IR.string(name.getString())); default: throw new IllegalStateException("Unexpected left Token: " + name.getToken()); } }
private static Node createIteratorResult(Node value, boolean done) { return IR.objectlit( IR.propdef(IR.stringKey("value"), value), IR.propdef(IR.stringKey("done"), done ? IR.trueNode() : IR.falseNode())); }
private void visitNamespaceDeclaration(NodeTraversal t, Node n, Node parent) { popNamespace(n, parent); for (Node name = NodeUtil.getRootOfQualifiedName(n.getFirstChild()); name != n; name = name.getParent()) { String fullName = maybePrependCurrNamespace(name.getQualifiedName()); if (!convertedNamespaces.contains(fullName)) { JSDocInfoBuilder doc = JSDocInfoBuilder.maybeCopyFrom(n.getJSDocInfo()); doc.recordConstancy(); Node namespaceDec = NodeUtil.newQNameDeclaration( compiler, fullName, IR.objectlit(), doc.build()).useSourceInfoFromForTree(n); parent.addChildBefore(namespaceDec, n); convertedNamespaces.add(fullName); } } replaceWithNodes(t, n, n.getLastChild().children()); }
private void visitNamespaceDeclaration(Node n, Node parent) { popNamespace(n, parent); for (Node name = NodeUtil.getRootOfQualifiedName(n.getFirstChild()); name != n; name = name.getParent()) { String fullName = maybePrependCurrNamespace(name.getQualifiedName()); if (!convertedNamespaces.contains(fullName)) { JSDocInfoBuilder doc = JSDocInfoBuilder.maybeCopyFrom(n.getJSDocInfo()); doc.recordConstancy(); Node namespaceDec = NodeUtil.newQNameDeclaration( compiler, fullName, IR.objectlit(), doc.build()).useSourceInfoFromForTree(n); parent.addChildBefore(namespaceDec, n); convertedNamespaces.add(fullName); } } replaceWithNodes(n, n.getLastChild().children()); }
/** * Converts all of the given call nodes to object literals that are safe to * do so. */ private void processObjectCreateSetCall(Node callNode) { Node curParam = callNode.getSecondChild(); if (canOptimizeObjectCreateSet(curParam)) { Node objNode = IR.objectlit().srcref(callNode); while (curParam != null) { Node keyNode = curParam; Node valueNode = IR.trueNode().srcref(keyNode); curParam = curParam.getNext(); callNode.removeChild(keyNode); addKeyValueToObjLit(objNode, keyNode, valueNode); } callNode.replaceWith(objNode); compiler.reportChangeToEnclosingScope(objNode); } }
/** * Converts all of the given call nodes to object literals that are safe to * do so. */ private void processObjectCreateCall(Node callNode) { Node curParam = callNode.getSecondChild(); if (canOptimizeObjectCreate(curParam)) { Node objNode = IR.objectlit().srcref(callNode); while (curParam != null) { Node keyNode = curParam; Node valueNode = curParam.getNext(); curParam = valueNode.getNext(); callNode.removeChild(keyNode); callNode.removeChild(valueNode); addKeyValueToObjLit(objNode, keyNode, valueNode); } callNode.replaceWith(objNode); compiler.reportChangeToEnclosingScope(objNode); } }
/** Adds an ES5 getter to the given object literal to use an an export. */ private void addExport(Node definePropertiesLit, String exportedName, LocalQName localQName) { Node exportedValue = NodeUtil.newQName(compiler, localQName.qName); Node getterFunction = IR.function(IR.name(""), IR.paramList(), IR.block(IR.returnNode(exportedValue))); getterFunction.useSourceInfoFromForTree(localQName.nodeForSourceInfo); Node objLit = IR.objectlit( IR.stringKey("enumerable", IR.trueNode()), IR.stringKey("get", getterFunction)); definePropertiesLit.addChildToBack(IR.stringKey(exportedName, objLit)); compiler.reportChangeToChangeScope(getterFunction); }
/** * Add the missing "var module$exports$pkg$Foo = {};" line. */ private void exportTheEmptyBinaryNamespaceAt(Node atNode, AddAt addAt) { if (currentScript.declareLegacyNamespace) { return; } Node binaryNamespaceName = IR.name(currentScript.getBinaryNamespace()); binaryNamespaceName.setOriginalName(currentScript.legacyNamespace); Node binaryNamespaceExportNode = IR.var(binaryNamespaceName, IR.objectlit()); if (addAt == AddAt.BEFORE) { atNode.getParent().addChildBefore(binaryNamespaceExportNode, atNode); } else if (addAt == AddAt.AFTER) { atNode.getParent().addChildAfter(binaryNamespaceExportNode, atNode); } binaryNamespaceExportNode.putBooleanProp(Node.IS_NAMESPACE, true); binaryNamespaceExportNode.srcrefTree(atNode); markConst(binaryNamespaceExportNode); compiler.reportChangeToEnclosingScope(binaryNamespaceExportNode); currentScript.hasCreatedExportObject = true; }