public static string Format(WebIDLType type) { var f = new WebIDLFormatter(); f.Visit(type); return(f._sb.ToString()); }
private Tuple <WebIDLType, IReadOnlyList <ExtendedAttribute> > Resolve(WebIDLType type, IEnumerable <ExtendedAttribute> extendedAttributes) { return(type.DecomposeWithResult( builtin => Tuple.Create(WebIDLType.Builtin(builtin.BuiltinType), extendedAttributes.AsReadOnlySafe()), @void => Tuple.Create(WebIDLType.Void(), extendedAttributes.AsReadOnlySafe()), @union => { var flat = FlattenAndResolveUnionMembers(@union.Members); var t = WebIDLType.Union(flat.Item1); if (flat.Item2) { t = WebIDLType.Nullable(t); } return Tuple.Create(t, extendedAttributes.AsReadOnlySafe()); }, typeReference => { DataBase d; if (!_entities.TryGetValue(typeReference.Target, out d)) { _errors.Add("The type `" + typeReference.Target + "' does not exist."); d = _entities[typeReference.Target] = new InterfaceData { Name = typeReference.Target }; } if (d is TypedefData) { var td = (TypedefData)d; return Resolve(td.ReferencedType, (extendedAttributes ?? new ExtendedAttribute[0]).Concat(td.TypeExtendedAttributes)); } else if (d is InterfaceData) { ((InterfaceData)d).IsUsed = true; } return Tuple.Create(WebIDLType.TypeReference(typeReference.Target), extendedAttributes.AsReadOnlySafe()); }, array => Tuple.Create(WebIDLType.Array(Resolve(array.ElementType, new ExtendedAttribute[0]).Item1), extendedAttributes.AsReadOnlySafe()), sequence => Tuple.Create(WebIDLType.Sequence(Resolve(sequence.ElementType, new ExtendedAttribute[0]).Item1), extendedAttributes.AsReadOnlySafe()), nullable => { // Attributes flow through nullables (I suppose) var res = Resolve(nullable.UnderlyingType, extendedAttributes); bool isNullable = res.Item1.DecomposeWithResult( builtin: _ => false, @void: _ => false, union: _ => false, typeReference: _ => false, array: _ => false, sequence: _ => false, nullable: _ => true ); return Tuple.Create(isNullable ? res.Item1 : WebIDLType.Nullable(res.Item1), res.Item2); } )); }
private void Visit(WebIDLType type) { type.Decompose( builtin => { switch (builtin.BuiltinType) { case BuiltinType.Any: _sb.Append("any"); break; case BuiltinType.DOMString: _sb.Append("DOMString"); break; case BuiltinType.Object: _sb.Append("Object"); break; case BuiltinType.Date: _sb.Append("Date"); break; case BuiltinType.Boolean: _sb.Append("boolean"); break; case BuiltinType.Byte: _sb.Append("byte"); break; case BuiltinType.Octet: _sb.Append("octet"); break; case BuiltinType.Float: _sb.Append("float"); break; case BuiltinType.UnrestrictedFloat: _sb.Append("unrestricted float"); break; case BuiltinType.Double: _sb.Append("double"); break; case BuiltinType.UnrestrictedDouble: _sb.Append("unrestricted double"); break; case BuiltinType.Short: _sb.Append("short"); break; case BuiltinType.UnsignedShort: _sb.Append("unsigned short"); break; case BuiltinType.Long: _sb.Append("long"); break; case BuiltinType.UnsignedLong: _sb.Append("unsigned long"); break; case BuiltinType.LongLong: _sb.Append("long long"); break; case BuiltinType.UnsignedLongLong: _sb.Append("unsigned long long"); break; default: throw new ArgumentException("Invalid builtin type " + builtin.BuiltinType); } }, @void => { _sb.Append("void"); }, union => { _sb.Append("("); for (int i = 0; i < union.Members.Count; i++) { if (i > 0) { _sb.Append(" or "); } Visit(union.Members[i]); } _sb.Append(")"); }, typeReference => { _sb.Append(typeReference.Target); }, array => { Visit(array.ElementType); _sb.Append("[]"); }, sequence => { _sb.Append("sequence<"); Visit(sequence.ElementType); _sb.Append(">"); }, nullable => { Visit(nullable.UnderlyingType); _sb.Append("?"); } ); }
public static string Format(WebIDLType type) { var f = new WebIDLFormatter(); f.Visit(type); return f._sb.ToString(); }
private void Visit(WebIDLType type) { type.Decompose( builtin => { switch (builtin.BuiltinType) { case BuiltinType.Any: _sb.Append("any"); break; case BuiltinType.DOMString: _sb.Append("DOMString"); break; case BuiltinType.Object: _sb.Append("Object"); break; case BuiltinType.Date: _sb.Append("Date"); break; case BuiltinType.Boolean: _sb.Append("boolean"); break; case BuiltinType.Byte: _sb.Append("byte"); break; case BuiltinType.Octet: _sb.Append("octet"); break; case BuiltinType.Float: _sb.Append("float"); break; case BuiltinType.UnrestrictedFloat: _sb.Append("unrestricted float"); break; case BuiltinType.Double: _sb.Append("double"); break; case BuiltinType.UnrestrictedDouble: _sb.Append("unrestricted double"); break; case BuiltinType.Short: _sb.Append("short"); break; case BuiltinType.UnsignedShort: _sb.Append("unsigned short"); break; case BuiltinType.Long: _sb.Append("long"); break; case BuiltinType.UnsignedLong: _sb.Append("unsigned long"); break; case BuiltinType.LongLong: _sb.Append("long long"); break; case BuiltinType.UnsignedLongLong: _sb.Append("unsigned long long"); break; default: throw new ArgumentException("Invalid builtin type " + builtin.BuiltinType); } }, @void => { _sb.Append("void"); }, union => { _sb.Append("("); for (int i = 0; i < union.Members.Count; i++) { if (i > 0) _sb.Append(" or "); Visit(union.Members[i]); } _sb.Append(")"); }, typeReference => { _sb.Append(typeReference.Target); }, array => { Visit(array.ElementType); _sb.Append("[]"); }, sequence => { _sb.Append("sequence<"); Visit(sequence.ElementType); _sb.Append(">"); }, nullable => { Visit(nullable.UnderlyingType); _sb.Append("?"); } ); }
public static DictionaryMember Create(WebIDLType type, string name, Value @default, IEnumerable<ExtendedAttribute> extendedAttributes) { return new DictionaryMember { Type = type, Name = name, Default = @default, ExtendedAttributes = extendedAttributes.AsReadOnlySafe() }; }