| Index: mojom/mojom_parser/serialization/serialization.go
|
| diff --git a/mojom/mojom_parser/serialization/serialization.go b/mojom/mojom_parser/serialization/serialization.go
|
| index ef1f8d34044ab605aa4e24daa8b3cbf17165ad3f..f5b0e1eb73e65cb59af9a0b26b5dc5d574cfc299 100644
|
| --- a/mojom/mojom_parser/serialization/serialization.go
|
| +++ b/mojom/mojom_parser/serialization/serialization.go
|
| @@ -5,6 +5,10 @@
|
| package serialization
|
|
|
| import (
|
| + "fmt"
|
| + "mojo/public/go/bindings"
|
| + "mojom/mojom_parser/generated/mojom_files"
|
| + "mojom/mojom_parser/generated/mojom_types"
|
| "mojom/mojom_parser/mojom"
|
| )
|
|
|
| @@ -12,12 +16,548 @@ import (
|
| /// Mojom Descriptor Serialization
|
| //////////////////////////////////////////////////
|
|
|
| +// This variable may be set to false in order to omit emitting line and
|
| +// column numbers.
|
| +var EmitLineAndColumnNumbers bool = true
|
| +
|
| // Serializes the MojomDescriptor into a binary form that is passed to the
|
| // backend of the compiler in order to invoke the code generators.
|
| // To do this we use Mojo serialization.
|
| func Serialize(d *mojom.MojomDescriptor) (bytes []byte, err error) {
|
| - // TODO(rudominer) This is a stub. It will be implemented in a later
|
| - // CL.
|
| - bytes = []byte("DummyOutput")
|
| + fileGraph := translateDescriptor(d)
|
| + encoder := bindings.NewEncoder()
|
| + fileGraph.Encode(encoder)
|
| + bytes, _, err = encoder.Data()
|
| + return
|
| +}
|
| +
|
| +// translateDescriptor translates from a mojom.MojomDescriptor (the pure Go
|
| +// representation used by the parser) to a mojom_files.MojomFileGraph (the
|
| +// Mojo Go representation used for serialization.)
|
| +func translateDescriptor(d *mojom.MojomDescriptor) *mojom_files.MojomFileGraph {
|
| + fileGraph := mojom_files.MojomFileGraph{}
|
| +
|
| + // Add |files| field.
|
| + fileGraph.Files = make(map[string]mojom_files.MojomFile)
|
| + for name, file := range d.MojomFilesByName {
|
| + fileGraph.Files[name] = translateMojomFile(file)
|
| + }
|
| +
|
| + // Add |resolved_types| field.
|
| + fileGraph.ResolvedTypes = make(map[string]mojom_types.UserDefinedType)
|
| + for key, userDefinedType := range d.TypesByKey {
|
| + fileGraph.ResolvedTypes[key] = translateUserDefinedType(userDefinedType)
|
| + }
|
| +
|
| + // Add |resolved_values| field.
|
| + fileGraph.ResolvedValues = make(map[string]mojom_types.UserDefinedValue)
|
| + for key, userDefinedValue := range d.ValuesByKey {
|
| + fileGraph.ResolvedValues[key] = translateUserDefinedValue(userDefinedValue)
|
| + }
|
| +
|
| + return &fileGraph
|
| +}
|
| +
|
| +// translateMojomFile translates from a mojom.MojomFile (the pure Go
|
| +// representation used by the parser) to a mojom_files.MojomFile (the
|
| +// Mojo Go representation used for serialization.)
|
| +func translateMojomFile(f *mojom.MojomFile) (file mojom_files.MojomFile) {
|
| + // file_name field
|
| + file.FileName = f.CanonicalFileName
|
| +
|
| + // module_namespace field
|
| + file.ModuleNamespace = newString(f.ModuleNamespace)
|
| +
|
| + // attributes field
|
| + if f.Attributes != nil {
|
| + file.Attributes = new([]mojom_types.Attribute)
|
| + for _, attr := range f.Attributes.List {
|
| + *(file.Attributes) = append(*(file.Attributes), translateMojomAttribute(&attr))
|
| + }
|
| + }
|
| +
|
| + // imports field
|
| + if len(f.Imports) > 0 {
|
| + file.Imports = new([]string)
|
| + for _, importName := range f.Imports {
|
| + *(file.Imports) = append(*(file.Imports), importName.CanonicalFileName)
|
| + }
|
| + }
|
| +
|
| + // declared_mojom_objects field...
|
| +
|
| + // Interfaces
|
| + if f.Interfaces != nil && len(f.Interfaces) > 0 {
|
| + file.DeclaredMojomObjects.Interfaces = new([]string)
|
| + for _, intrfc := range f.Interfaces {
|
| + *(file.DeclaredMojomObjects.Interfaces) = append(*(file.DeclaredMojomObjects.Interfaces), intrfc.TypeKey())
|
| + }
|
| + }
|
| +
|
| + // Structs
|
| + if f.Structs != nil && len(f.Structs) > 0 {
|
| + file.DeclaredMojomObjects.Structs = new([]string)
|
| + for _, strct := range f.Structs {
|
| + *(file.DeclaredMojomObjects.Structs) = append(*(file.DeclaredMojomObjects.Structs), strct.TypeKey())
|
| + }
|
| + }
|
| +
|
| + // Unions
|
| + if f.Unions != nil && len(f.Unions) > 0 {
|
| + file.DeclaredMojomObjects.Unions = new([]string)
|
| + for _, union := range f.Unions {
|
| + *(file.DeclaredMojomObjects.Unions) = append(*(file.DeclaredMojomObjects.Unions), union.TypeKey())
|
| + }
|
| + }
|
| +
|
| + // TopLevelEnums
|
| + if f.Enums != nil && len(f.Enums) > 0 {
|
| + file.DeclaredMojomObjects.TopLevelEnums = new([]string)
|
| + for _, enum := range f.Enums {
|
| + *(file.DeclaredMojomObjects.TopLevelEnums) = append(*(file.DeclaredMojomObjects.TopLevelEnums), enum.TypeKey())
|
| + }
|
| + }
|
| +
|
| + // TopLevelConstants
|
| + if f.Constants != nil && len(f.Constants) > 0 {
|
| + file.DeclaredMojomObjects.TopLevelConstants = new([]string)
|
| + for _, constant := range f.Constants {
|
| + *(file.DeclaredMojomObjects.TopLevelConstants) = append(*(file.DeclaredMojomObjects.TopLevelConstants), constant.ValueKey())
|
| + }
|
| + }
|
| +
|
| + // TODO(rudominer) Do we need the EmbeddedEnums and EmbeddedConstants
|
| + // fields in KeysByType. It seems these fields are not currently being
|
| + // used in mojom_translator.py.
|
| +
|
| + return
|
| +}
|
| +
|
| +// translateUserDefinedType translates from a mojom.UserDefinedType (the pure Go
|
| +// representation used by the parser) to a mojom_types.UserDefinedType (the
|
| +// Mojo Go representation used for serialization.)
|
| +func translateUserDefinedType(t mojom.UserDefinedType) mojom_types.UserDefinedType {
|
| + switch p := t.(type) {
|
| + case *mojom.MojomStruct:
|
| + return &mojom_types.UserDefinedTypeStructType{translateMojomStruct(p)}
|
| + case *mojom.MojomInterface:
|
| + return translateMojomInterface(p)
|
| + case *mojom.MojomEnum:
|
| + return translateMojomEnum(p)
|
| + case *mojom.MojomUnion:
|
| + return translateMojomUnion(p)
|
| + default:
|
| + panic(fmt.Sprintf("Unexpected type: %T", t))
|
| +
|
| + }
|
| +}
|
| +
|
| +func translateMojomStruct(s *mojom.MojomStruct) mojom_types.MojomStruct {
|
| + mojomStruct := mojom_types.MojomStruct{}
|
| + mojomStruct.DeclData = translateDeclarationData(&s.DeclarationData)
|
| + mojomStruct.DeclData.ContainedDeclarations = translateContainedDeclarations(&s.DeclarationContainer)
|
| +
|
| + for _, field := range s.Fields {
|
| + mojomStruct.Fields = append(mojomStruct.Fields, translateStructField(field))
|
| + }
|
| +
|
| + // TODO(rudominer) Implement VersionInfo.
|
| + //mojomStruct.Value.VersionInfo = new([]mojom_types.StructVersion)
|
| +
|
| + return mojomStruct
|
| +}
|
| +
|
| +func translateStructField(f *mojom.StructField) (field mojom_types.StructField) {
|
| + field.DeclData = translateDeclarationData(&f.DeclarationData)
|
| + field.Type = translateTypeRef(f.FieldType)
|
| + if f.DefaultValue != nil {
|
| + field.DefaultValue = translateDefaultFieldValue(f.DefaultValue)
|
| + }
|
| + // TODO(rudominer) Implement field offsets.
|
| + field.Offset = f.Offset
|
| return
|
| }
|
| +
|
| +func translateDefaultFieldValue(v mojom.ValueRef) mojom_types.DefaultFieldValue {
|
| + switch v := v.(type) {
|
| + case mojom.LiteralValue:
|
| + if v.IsDefault() {
|
| + return &mojom_types.DefaultFieldValueDefaultKeyword{mojom_types.DefaultKeyword{}}
|
| + }
|
| + return &mojom_types.DefaultFieldValueValue{translateLiteralValue(v)}
|
| + case *mojom.UserValueRef:
|
| + switch t := v.ResolvedConcreteValue().(type) {
|
| + case mojom.BuiltInConstantValue:
|
| + return &mojom_types.DefaultFieldValueValue{translateBuiltInConstantValue(t)}
|
| + default:
|
| + return &mojom_types.DefaultFieldValueValue{translateUserValueRef(v)}
|
| + }
|
| + default:
|
| + panic(fmt.Sprintf("Unexpected ValueRef type: %T", v))
|
| +
|
| + }
|
| +}
|
| +
|
| +func translateMojomInterface(intrfc *mojom.MojomInterface) *mojom_types.UserDefinedTypeInterfaceType {
|
| + mojomInterface := mojom_types.UserDefinedTypeInterfaceType{}
|
| +
|
| + mojomInterface.Value.DeclData = translateDeclarationData(&intrfc.DeclarationData)
|
| + mojomInterface.Value.DeclData.ContainedDeclarations = translateContainedDeclarations(&intrfc.DeclarationContainer)
|
| +
|
| + // TODO(rudominer) The Interface name field need not be the name from the .mojom file.
|
| + mojomInterface.Value.InterfaceName = intrfc.SimpleName()
|
| +
|
| + mojomInterface.Value.Methods = make(map[uint32]mojom_types.MojomMethod)
|
| + for ordinal, method := range intrfc.MethodsByOrdinal {
|
| + mojomInterface.Value.Methods[ordinal] = translateMojomMethod(method)
|
| + }
|
| +
|
| + return &mojomInterface
|
| +}
|
| +
|
| +func translateMojomMethod(method *mojom.MojomMethod) mojom_types.MojomMethod {
|
| + mojomMethod := mojom_types.MojomMethod{}
|
| +
|
| + // decl_data
|
| + mojomMethod.DeclData = translateDeclarationData(&method.DeclarationData)
|
| +
|
| + // parameters
|
| + mojomMethod.Parameters = translateMojomStruct(method.Parameters)
|
| +
|
| + // response_params
|
| + if method.ResponseParameters != nil {
|
| + responseParams := translateMojomStruct(method.ResponseParameters)
|
| + mojomMethod.ResponseParams = &responseParams
|
| + }
|
| +
|
| + // ordinal
|
| + mojomMethod.Ordinal = method.Ordinal
|
| + return mojomMethod
|
| +}
|
| +
|
| +func translateMojomEnum(enum *mojom.MojomEnum) *mojom_types.UserDefinedTypeEnumType {
|
| + mojomEnum := mojom_types.UserDefinedTypeEnumType{}
|
| + mojomEnum.Value.DeclData = translateDeclarationData(&enum.DeclarationData)
|
| + for _, value := range enum.Values {
|
| + mojomEnum.Value.Values = append(mojomEnum.Value.Values, translateEnumValue(value))
|
| + }
|
| + return &mojomEnum
|
| +}
|
| +
|
| +func translateMojomUnion(union *mojom.MojomUnion) *mojom_types.UserDefinedTypeUnionType {
|
| + mojomUnion := mojom_types.UserDefinedTypeUnionType{}
|
| + mojomUnion.Value.DeclData = translateDeclarationData(&union.DeclarationData)
|
| + for _, field := range union.Fields {
|
| + mojomUnion.Value.Fields = append(mojomUnion.Value.Fields,
|
| + translateUnionField(field))
|
| + }
|
| + return &mojomUnion
|
| +}
|
| +
|
| +func translateUnionField(unionField mojom.UnionField) mojom_types.UnionField {
|
| + outUnionField := mojom_types.UnionField{}
|
| + outUnionField.DeclData = translateDeclarationData(&unionField.DeclarationData)
|
| + outUnionField.Type = translateTypeRef(unionField.FieldType)
|
| + outUnionField.Tag = unionField.Tag
|
| + return outUnionField
|
| +}
|
| +
|
| +// WARNING: Do not invoke this function on a UserDefinedValue of type BuiltInConstantValue because
|
| +// objects of those types do not have a type_key and do not correspond to a mojom_types.UserDefinedValue.
|
| +func translateUserDefinedValue(v mojom.UserDefinedValue) mojom_types.UserDefinedValue {
|
| + switch t := v.(type) {
|
| + case *mojom.UserDefinedConstant:
|
| + return translateUserDefinedConstant(t)
|
| + case *mojom.EnumValue:
|
| + return &mojom_types.UserDefinedValueEnumValue{translateEnumValue(t)}
|
| + case *mojom.BuiltInConstantValue:
|
| + panic("Do not invoke translateUserDefinedValue on BuiltInConstantValue.")
|
| + default:
|
| + panic(fmt.Sprintf("Unexpected UserDefinedValue type %T", v))
|
| +
|
| + }
|
| +}
|
| +
|
| +func translateUserDefinedConstant(t *mojom.UserDefinedConstant) *mojom_types.UserDefinedValueDeclaredConstant {
|
| + declaredConstant := mojom_types.UserDefinedValueDeclaredConstant{}
|
| + declaredConstant.Value.Type = translateTypeRef(t.DeclaredType())
|
| + declaredConstant.Value.DeclData = *translateDeclarationData(&t.DeclarationData)
|
| + declaredConstant.Value.Value = translateValueRef(t.ValueRef())
|
| + return &declaredConstant
|
| +}
|
| +
|
| +func translateEnumValue(v *mojom.EnumValue) mojom_types.EnumValue {
|
| + enumValue := mojom_types.EnumValue{}
|
| + enumValue.DeclData = translateDeclarationData(&v.DeclarationData)
|
| + enumValue.EnumTypeKey = v.EnumType().TypeKey()
|
| + if v.ValueRef() != nil {
|
| + enumValue.InitializerValue = translateValueRef(v.ValueRef())
|
| + }
|
| + // TODO(rudominer) enumValue.IntValue should be set to v.ComputedIntValue
|
| + // once MojomDescriptor.ComputeEnumValueIntegers() is implemented.
|
| + enumValue.IntValue = v.Int32Value()
|
| + return enumValue
|
| +}
|
| +
|
| +func translateTypeRef(typeRef mojom.TypeRef) mojom_types.Type {
|
| + switch t := typeRef.(type) {
|
| + case mojom.SimpleType:
|
| + return translateSimpleType(t)
|
| + case mojom.StringType:
|
| + return translateStringType(t)
|
| + case mojom.HandleTypeRef:
|
| + return translateHandleType(t)
|
| + case mojom.ArrayTypeRef:
|
| + return translateArrayType(t)
|
| + case mojom.MapTypeRef:
|
| + return translateMapType(t)
|
| + case *mojom.UserTypeRef:
|
| + return translateUserTypeRef(t)
|
| + default:
|
| + panic(fmt.Sprintf("Unexpected TypeRef type %T", t))
|
| + }
|
| +}
|
| +
|
| +func translateSimpleType(simpleType mojom.SimpleType) *mojom_types.TypeSimpleType {
|
| + var value mojom_types.SimpleType
|
| + switch simpleType {
|
| + case mojom.SimpleTypeBool:
|
| + value = mojom_types.SimpleType_Bool
|
| + case mojom.SimpleTypeDouble:
|
| + value = mojom_types.SimpleType_Double
|
| + case mojom.SimpleTypeFloat:
|
| + value = mojom_types.SimpleType_Float
|
| + case mojom.SimpleTypeInt8:
|
| + value = mojom_types.SimpleType_InT8
|
| + case mojom.SimpleTypeInt16:
|
| + value = mojom_types.SimpleType_InT16
|
| + case mojom.SimpleTypeInt32:
|
| + value = mojom_types.SimpleType_InT32
|
| + case mojom.SimpleTypeInt64:
|
| + value = mojom_types.SimpleType_InT64
|
| + case mojom.SimpleTypeUInt8:
|
| + value = mojom_types.SimpleType_UinT8
|
| + case mojom.SimpleTypeUInt16:
|
| + value = mojom_types.SimpleType_UinT16
|
| + case mojom.SimpleTypeUInt32:
|
| + value = mojom_types.SimpleType_UinT32
|
| + case mojom.SimpleTypeUInt64:
|
| + value = mojom_types.SimpleType_UinT64
|
| + }
|
| + return &mojom_types.TypeSimpleType{value}
|
| +}
|
| +
|
| +func translateStringType(stringType mojom.StringType) *mojom_types.TypeStringType {
|
| + return &mojom_types.TypeStringType{mojom_types.StringType{stringType.Nullable()}}
|
| +}
|
| +
|
| +func translateHandleType(handleType mojom.HandleTypeRef) *mojom_types.TypeHandleType {
|
| + var kind mojom_types.HandleType_Kind
|
| + switch handleType.HandleKind() {
|
| + case mojom.HandleKindUnspecified:
|
| + kind = mojom_types.HandleType_Kind_Unspecified
|
| + case mojom.HandleKindMessagePipe:
|
| + kind = mojom_types.HandleType_Kind_MessagePipe
|
| + case mojom.HandleKindDataPipeConsumer:
|
| + kind = mojom_types.HandleType_Kind_DataPipeConsumer
|
| + case mojom.HandleKindDataPipeProducer:
|
| + kind = mojom_types.HandleType_Kind_DataPipeProducer
|
| + case mojom.HandleKindSharedBuffer:
|
| + kind = mojom_types.HandleType_Kind_SharedBuffer
|
| + }
|
| + return &mojom_types.TypeHandleType{mojom_types.HandleType{handleType.Nullable(), kind}}
|
| +}
|
| +
|
| +func translateArrayType(arrayType mojom.ArrayTypeRef) *mojom_types.TypeArrayType {
|
| + return &mojom_types.TypeArrayType{mojom_types.ArrayType{
|
| + Nullable: arrayType.Nullable(),
|
| + FixedLength: int32(arrayType.FixedLength()),
|
| + ElementType: translateTypeRef(arrayType.ElementType())}}
|
| +}
|
| +
|
| +func translateMapType(mapType mojom.MapTypeRef) *mojom_types.TypeMapType {
|
| + return &mojom_types.TypeMapType{mojom_types.MapType{
|
| + Nullable: mapType.Nullable(),
|
| + KeyType: translateTypeRef(mapType.KeyType()),
|
| + ValueType: translateTypeRef(mapType.ValueType())}}
|
| +}
|
| +
|
| +func translateUserTypeRef(userType *mojom.UserTypeRef) *mojom_types.TypeTypeReference {
|
| + typeKey := newString(userType.ResolvedType().TypeKey())
|
| + identifier := newString(userType.Identifier())
|
| + return &mojom_types.TypeTypeReference{mojom_types.TypeReference{
|
| + Nullable: userType.Nullable(),
|
| + IsInterfaceRequest: userType.IsInterfaceRequest(),
|
| + Identifier: identifier,
|
| + TypeKey: typeKey}}
|
| +}
|
| +
|
| +func translateValueRef(valueRef mojom.ValueRef) mojom_types.Value {
|
| + switch valueRef := valueRef.(type) {
|
| + case mojom.LiteralValue:
|
| + return translateLiteralValue(valueRef)
|
| + case *mojom.UserValueRef:
|
| + return translateUserValueRef(valueRef)
|
| + default:
|
| + panic(fmt.Sprintf("Unexpected ValueRef type %T", valueRef))
|
| + }
|
| +}
|
| +
|
| +func translateLiteralValue(v mojom.LiteralValue) *mojom_types.ValueLiteralValue {
|
| + var lv mojom_types.LiteralValue
|
| + switch v.ValueType() {
|
| + case mojom.SimpleTypeBool:
|
| + lv = &mojom_types.LiteralValueBoolValue{v.Value().(bool)}
|
| + case mojom.SimpleTypeDouble:
|
| + lv = &mojom_types.LiteralValueDoubleValue{v.Value().(float64)}
|
| + case mojom.SimpleTypeFloat:
|
| + lv = &mojom_types.LiteralValueFloatValue{v.Value().(float32)}
|
| + case mojom.SimpleTypeInt8:
|
| + lv = &mojom_types.LiteralValueInt8Value{v.Value().(int8)}
|
| + case mojom.SimpleTypeInt16:
|
| + lv = &mojom_types.LiteralValueInt16Value{v.Value().(int16)}
|
| + case mojom.SimpleTypeInt32:
|
| + lv = &mojom_types.LiteralValueInt32Value{v.Value().(int32)}
|
| + case mojom.SimpleTypeInt64:
|
| + lv = &mojom_types.LiteralValueInt64Value{v.Value().(int64)}
|
| + case mojom.SimpleTypeUInt8:
|
| + lv = &mojom_types.LiteralValueUint8Value{v.Value().(uint8)}
|
| + case mojom.SimpleTypeUInt16:
|
| + lv = &mojom_types.LiteralValueUint16Value{v.Value().(uint16)}
|
| + case mojom.SimpleTypeUInt32:
|
| + lv = &mojom_types.LiteralValueUint32Value{v.Value().(uint32)}
|
| + case mojom.SimpleTypeUInt64:
|
| + lv = &mojom_types.LiteralValueUint64Value{v.Value().(uint64)}
|
| + case mojom.StringLiteralType:
|
| + lv = &mojom_types.LiteralValueStringValue{v.Value().(string)}
|
| + default:
|
| + panic(fmt.Sprintf("Unexpected literal value type %d", v.ValueType()))
|
| + }
|
| + return &mojom_types.ValueLiteralValue{lv}
|
| +}
|
| +
|
| +func translateBuiltInConstantValue(t mojom.BuiltInConstantValue) *mojom_types.ValueBuiltinValue {
|
| + builtInValue := mojom_types.ValueBuiltinValue{}
|
| + switch t {
|
| + case mojom.SimpleTypeFloat_INFINITY:
|
| + builtInValue.Value = mojom_types.BuiltinConstantValue_FloatInfinity
|
| + case mojom.SimpleTypeFloat_NEGATIVE_INFINITY:
|
| + builtInValue.Value = mojom_types.BuiltinConstantValue_FloatNegativeInfinity
|
| + case mojom.SimpleTypeFloat_NAN:
|
| + builtInValue.Value = mojom_types.BuiltinConstantValue_FloatNan
|
| + case mojom.SimpleTypeDouble_INFINITY:
|
| + builtInValue.Value = mojom_types.BuiltinConstantValue_DoubleInfinity
|
| + case mojom.SimpleTypeDouble_NEGATIVE_INFINITY:
|
| + builtInValue.Value = mojom_types.BuiltinConstantValue_DoubleNegativeInfinity
|
| + case mojom.SimpleTypeDouble_NAN:
|
| + builtInValue.Value = mojom_types.BuiltinConstantValue_DoubleNegativeInfinity
|
| + default:
|
| + panic(fmt.Sprintf("Unrecognized BuiltInConstantValue %v", t))
|
| + }
|
| + return &builtInValue
|
| +}
|
| +
|
| +func translateUserValueRef(r *mojom.UserValueRef) *mojom_types.ValueUserValueReference {
|
| + valueKey := newString(r.ResolvedDeclaredValue().ValueKey())
|
| + return &mojom_types.ValueUserValueReference{mojom_types.UserValueReference{
|
| + Identifier: r.Identifier(),
|
| + ValueKey: valueKey,
|
| + ResolvedConcreteValue: translateConcreteValue(r.ResolvedConcreteValue())}}
|
| +}
|
| +
|
| +func translateConcreteValue(v mojom.ConcreteValue) mojom_types.Value {
|
| + switch t := v.(type) {
|
| + case mojom.BuiltInConstantValue:
|
| + return translateBuiltInConstantValue(t)
|
| + case mojom.LiteralValue:
|
| + return translateLiteralValue(t)
|
| + case *mojom.EnumValue:
|
| + // Note that in the pure Go representation we support the abstraction
|
| + // that an EnumValue is a type of ConcreteValue. This makes sense because
|
| + // an Enum is abstractly a finite set of values that need not have
|
| + // a corresponding integer value. However in mojom_types.mojom we currently
|
| + // do not support this abstraction: the only concrete values are the literal
|
| + // values and the BuiltInConstantValues. Consequently here we return the
|
| + // Int32Value() of the EnumValue.
|
| + return &mojom_types.ValueLiteralValue{&mojom_types.LiteralValueInt32Value{t.Int32Value()}}
|
| + default:
|
| + panic(fmt.Sprintf("Unexpected type %T", v))
|
| + }
|
| +}
|
| +
|
| +func translateDeclarationData(d *mojom.DeclarationData) *mojom_types.DeclarationData {
|
| + declData := mojom_types.DeclarationData{}
|
| +
|
| + // attributes field
|
| + if d.Attributes() != nil {
|
| + declData.Attributes = new([]mojom_types.Attribute)
|
| + for _, attr := range d.Attributes().List {
|
| + *(declData.Attributes) = append(*(declData.Attributes), translateMojomAttribute(&attr))
|
| + }
|
| + }
|
| +
|
| + // min_version field
|
| + // TODO(rudominer) Eliminate the min_version field from struct DeclarationData
|
| +
|
| + // short_name field
|
| + declData.ShortName = newString(d.SimpleName())
|
| +
|
| + // full_identifier field
|
| + declData.FullIdentifier = newString(d.FullyQualifiedName())
|
| +
|
| + // declared_ordinal field
|
| + if d.DeclaredOrdinal() < 0 {
|
| + declData.DeclaredOrdinal = -1
|
| + } else {
|
| + declData.DeclaredOrdinal = int32(d.DeclaredOrdinal())
|
| + }
|
| +
|
| + // declaration_order
|
| + // TODO(rudominer) DeclarationOrder is currently not populated.
|
| + declData.DeclarationOrder = -1
|
| +
|
| + // source_file_info
|
| + declData.SourceFileInfo = new(mojom_types.SourceFileInfo)
|
| + declData.SourceFileInfo.FileName = d.OwningFile().CanonicalFileName
|
| + if EmitLineAndColumnNumbers {
|
| + declData.SourceFileInfo.LineNumber = d.LineNumber()
|
| + declData.SourceFileInfo.ColumnNumber = d.ColumnNumber()
|
| + }
|
| + return &declData
|
| +}
|
| +
|
| +// Returns nil if there are no contained declarations
|
| +func translateContainedDeclarations(container *mojom.DeclarationContainer) *mojom_types.ContainedDeclarations {
|
| + if container.Enums == nil && container.Constants == nil {
|
| + return nil
|
| + }
|
| + declarations := mojom_types.ContainedDeclarations{}
|
| + if container.Enums != nil {
|
| + declarations.Enums = new([]string)
|
| + for _, enum := range container.Enums {
|
| + *declarations.Enums = append(*declarations.Enums, enum.TypeKey())
|
| + }
|
| + }
|
| + if container.Constants != nil {
|
| + declarations.Constants = new([]string)
|
| + for _, constant := range container.Constants {
|
| + *declarations.Constants = append(*declarations.Constants, constant.ValueKey())
|
| + }
|
| + }
|
| + return &declarations
|
| +}
|
| +
|
| +func translateMojomAttribute(a *mojom.MojomAttribute) (attribute mojom_types.Attribute) {
|
| + // TODO(rudominer) Improve representation of attribute values.
|
| + return mojom_types.Attribute{a.Key, fmt.Sprintf("%v", a.Value.Value())}
|
| +}
|
| +
|
| +// newString is a convenience function for creating a pointer to a string whose value
|
| +// is the specified string. It is necessary to create pointers to strings because
|
| +// that is how the Mojom type string? (i.e. nullable string) is represented in
|
| +// in the Mojom Go bindings.
|
| +func newString(s string) *string {
|
| + t := new(string)
|
| + *t = s
|
| + return t
|
| +}
|
|
|