Пример #1
0
        public static string Format(WebIDLType type)
        {
            var f = new WebIDLFormatter();

            f.Visit(type);
            return(f._sb.ToString());
        }
Пример #2
0
 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);
     }
                ));
 }
Пример #3
0
        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("?");
            }
                );
        }
Пример #4
0
 public static string Format(WebIDLType type)
 {
     var f = new WebIDLFormatter();
     f.Visit(type);
     return f._sb.ToString();
 }
Пример #5
0
 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("?");
         }
     );
 }
Пример #6
0
 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() };
 }