Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(199)

Unified Diff: mojom/mojom_parser/serialization/serialization.go

Issue 1421193003: New Mojom Parser: Serialization. (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: Refactors TestSingleFileSerialization. Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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
+}
« no previous file with comments | « mojom/mojom_parser/mojom/mojom_descriptor.go ('k') | mojom/mojom_parser/serialization/serialization_test.go » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698