/** * Represents a union type, which can be one of the given types. * Closure accepts syntax like {@code {(number|boolean)}} * * <p>Example: * <pre> * UNION_TYPE * NUMBER_TYPE * BOOLEAN_TYPE * </pre> * @param options the types which are accepted * @return a new node representing the union type */ public static TypeDeclarationNode unionType(Iterable<TypeDeclarationNode> options) { checkArgument(!Iterables.isEmpty(options), "union must have at least one option"); TypeDeclarationNode node = new TypeDeclarationNode(Token.UNION_TYPE); for (Node option : options) { node.addChildToBack(option); } return node; }
/** * Represents a union type, which can be one of the given types. * Closure accepts syntax like {@code {(number|boolean)}} * * <p>Example: * <pre> * UNION_TYPE * NUMBER_TYPE * BOOLEAN_TYPE * </pre> * @param options the types which are accepted * @return a new node representing the union type */ public static TypeDeclarationNode unionType(Iterable<TypeDeclarationNode> options) { Preconditions.checkArgument(!Iterables.isEmpty(options), "union must have at least one option"); TypeDeclarationNode node = new TypeDeclarationNode(Token.UNION_TYPE); for (Node option : options) { node.addChildToBack(option); } return node; }
/** * Represents a structural type. * Closure calls this a Record Type and accepts the syntax * {@code {myNum: number, myObject}} * * <p>Example: * <pre> * RECORD_TYPE * STRING_KEY myNum * NUMBER_TYPE * STRING_KEY myObject * </pre> * @param properties a map from property name to property type * @return a new node representing the record type */ public static TypeDeclarationNode recordType( LinkedHashMap<String, TypeDeclarationNode> properties) { TypeDeclarationNode node = new TypeDeclarationNode(Token.RECORD_TYPE); for (Map.Entry<String, TypeDeclarationNode> prop : properties.entrySet()) { Node stringKey = IR.stringKey(prop.getKey()); node.addChildToBack(stringKey); if (prop.getValue() != null) { stringKey.addChildToFront(prop.getValue()); } } return node; }
node.addChildToBack(maybeAddType(name, param.getValue())); Node name = IR.name(param.getKey()); name.putBooleanProp(Node.OPT_ES6_TYPED, true); node.addChildToBack(maybeAddType(name, param.getValue()));
node.addChildToBack(maybeAddType(name, param.getValue())); Node name = IR.name(param.getKey()); name.putBooleanProp(Node.OPT_ES6_TYPED, true); node.addChildToBack(maybeAddType(name, param.getValue())); node.addChildToBack(maybeAddType(rest, restType));
/** * Represents a parameterized, or generic, type. * Closure calls this a Type Application and accepts syntax like * {@code {Object.<string, number>}} * * <p>Example: * <pre> * PARAMETERIZED_TYPE * NAMED_TYPE * NAME Object * STRING_TYPE * NUMBER_TYPE * </pre> * @param baseType * @param typeParameters */ public static TypeDeclarationNode parameterizedType( TypeDeclarationNode baseType, Iterable<TypeDeclarationNode> typeParameters) { if (Iterables.isEmpty(typeParameters)) { return baseType; } TypeDeclarationNode node = new TypeDeclarationNode(Token.PARAMETERIZED_TYPE, baseType); for (Node typeParameter : typeParameters) { node.addChildToBack(typeParameter); } return node; }
/** * Represents a structural type. * Closure calls this a Record Type and accepts the syntax * {@code {myNum: number, myObject}} * * <p>Example: * <pre> * RECORD_TYPE * STRING_KEY myNum * NUMBER_TYPE * STRING_KEY myObject * </pre> * @param properties a map from property name to property type * @return a new node representing the record type */ public static TypeDeclarationNode recordType( LinkedHashMap<String, TypeDeclarationNode> properties) { TypeDeclarationNode node = new TypeDeclarationNode(Token.RECORD_TYPE); for (Map.Entry<String, TypeDeclarationNode> prop : properties.entrySet()) { Node stringKey = IR.stringKey(prop.getKey()); node.addChildToBack(stringKey); if (prop.getValue() != null) { stringKey.addChildToFront(prop.getValue()); } } return node; }
/** * Represents a parameterized, or generic, type. * Closure calls this a Type Application and accepts syntax like * {@code {Object.<string, number>}} * * <p>Example: * <pre> * PARAMETERIZED_TYPE * NAMED_TYPE * NAME Object * STRING_TYPE * NUMBER_TYPE * </pre> * @param baseType * @param typeParameters */ public static TypeDeclarationNode parameterizedType( TypeDeclarationNode baseType, Iterable<TypeDeclarationNode> typeParameters) { if (Iterables.isEmpty(typeParameters)) { return baseType; } TypeDeclarationNode node = new TypeDeclarationNode(Token.PARAMETERIZED_TYPE, baseType); for (Node typeParameter : typeParameters) { node.addChildToBack(typeParameter); } return node; }
Node processRecordType(RecordTypeTree tree) { TypeDeclarationNode node = new TypeDeclarationNode(Token.RECORD_TYPE); for (ParseTree child : tree.members) { node.addChildToBack(transform(child)); } return cloneProps(node); }
Node processRecordType(RecordTypeTree tree) { TypeDeclarationNode node = new TypeDeclarationNode(Token.RECORD_TYPE); for (ParseTree child : tree.members) { node.addChildToBack(transform(child)); } return cloneProps(node); }
/** Returns a new node representing an index signature type. */ TypeDeclarationNode indexSignatureType( TypeDeclarationNode keyType, TypeDeclarationNode valueType) { TypeDeclarationNode node = new TypeDeclarationNode(Token.INDEX_SIGNATURE); TypeDeclarationNode first = null; first = new TypeDeclarationNode(Token.STRING_KEY, "key"); first.setDeclaredTypeExpression(keyType); node.addChildToBack(first); node.setDeclaredTypeExpression(valueType); return node; }