Chromium Code Reviews| Index: mojom/mojom_parser/serialization/serialization.go |
| diff --git a/mojom/mojom_parser/serialization/serialization.go b/mojom/mojom_parser/serialization/serialization.go |
| index 6290c719ddaa4af4b32f2f5b72bd56abedfec287..18b2f901c4842ed65c3699208311cd36ec8444ce 100644 |
| --- a/mojom/mojom_parser/serialization/serialization.go |
| +++ b/mojom/mojom_parser/serialization/serialization.go |
| @@ -21,6 +21,10 @@ import ( |
| // column numbers. |
| var EmitLineAndColumnNumbers bool = true |
| +// This variable may be set to false in order to omit emitting serialized |
| +// runtime type info. |
| +var EmitSerializedRuntimeTypeInfo bool = true |
|
azani
2016/02/11 19:45:48
As discussed, make this private and create a packa
rudominer
2016/02/11 20:16:11
Done.
|
| + |
| // Serialize 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. |
| @@ -43,12 +47,6 @@ func Serialize(d *mojom.MojomDescriptor, debug bool) (bytes []byte, debugString |
| 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 { |
| @@ -61,13 +59,19 @@ func translateDescriptor(d *mojom.MojomDescriptor) *mojom_files.MojomFileGraph { |
| fileGraph.ResolvedValues[key] = translateUserDefinedValue(userDefinedValue) |
| } |
| + // Add |files| field. |
| + fileGraph.Files = make(map[string]mojom_files.MojomFile) |
| + for name, file := range d.MojomFilesByName { |
| + fileGraph.Files[name] = translateMojomFile(file, &fileGraph) |
| + } |
| + |
| 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) { |
| +func translateMojomFile(f *mojom.MojomFile, fileGraph *mojom_files.MojomFileGraph) (file mojom_files.MojomFile) { |
| // file_name field |
| file.FileName = f.CanonicalFileName |
| @@ -93,13 +97,32 @@ func translateMojomFile(f *mojom.MojomFile) (file mojom_files.MojomFile) { |
| } |
| } |
| - // declared_mojom_objects field... |
| + // We will populate a RuntimeTypeInfo structure and then serialize it and |
| + // the serialized bytes will form the |serialized_runtime_type_info| field |
| + // of the MojomFile. |
| + typeInfo := mojom_files.RuntimeTypeInfo{} |
| + typeInfo.ServicesByName = make(map[string]mojom_files.ServiceTypeInfo) |
| + typeInfo.TypeMap = make(map[string]mojom_types.UserDefinedType) |
| + |
| + // We populate the declared_mojom_objects field |
| + // and simultaneously we populate typeInfo.TypeMap. |
| // 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()) |
| + typeKey := intrfc.TypeKey() |
| + *(file.DeclaredMojomObjects.Interfaces) = append(*(file.DeclaredMojomObjects.Interfaces), typeKey) |
| + |
| + addServiceTypeInfo(intrfc, &typeInfo) |
| + typeInfo.TypeMap[typeKey] = fileGraph.ResolvedTypes[typeKey] |
| + if intrfc.Enums != nil { |
| + // Add embedded enums to typeInfo.TypeMap. |
| + for _, enum := range intrfc.Enums { |
| + typeKey := enum.TypeKey() |
| + typeInfo.TypeMap[typeKey] = fileGraph.ResolvedTypes[typeKey] |
| + } |
| + } |
| } |
| } |
| @@ -107,7 +130,16 @@ func translateMojomFile(f *mojom.MojomFile) (file mojom_files.MojomFile) { |
| 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()) |
| + typeKey := strct.TypeKey() |
| + *(file.DeclaredMojomObjects.Structs) = append(*(file.DeclaredMojomObjects.Structs), typeKey) |
| + typeInfo.TypeMap[typeKey] = fileGraph.ResolvedTypes[typeKey] |
| + if strct.Enums != nil { |
| + // Add embedded enums to typeInfo.TypeMap. |
| + for _, enum := range strct.Enums { |
| + typeKey := enum.TypeKey() |
| + typeInfo.TypeMap[typeKey] = fileGraph.ResolvedTypes[typeKey] |
| + } |
| + } |
| } |
| } |
| @@ -115,7 +147,9 @@ func translateMojomFile(f *mojom.MojomFile) (file mojom_files.MojomFile) { |
| 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()) |
| + typeKey := union.TypeKey() |
| + *(file.DeclaredMojomObjects.Unions) = append(*(file.DeclaredMojomObjects.Unions), typeKey) |
| + typeInfo.TypeMap[typeKey] = fileGraph.ResolvedTypes[typeKey] |
| } |
| } |
| @@ -123,7 +157,9 @@ func translateMojomFile(f *mojom.MojomFile) (file mojom_files.MojomFile) { |
| 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()) |
| + typeKey := enum.TypeKey() |
| + *(file.DeclaredMojomObjects.TopLevelEnums) = append(*(file.DeclaredMojomObjects.TopLevelEnums), typeKey) |
| + typeInfo.TypeMap[typeKey] = fileGraph.ResolvedTypes[typeKey] |
| } |
| } |
| @@ -139,6 +175,31 @@ func translateMojomFile(f *mojom.MojomFile) (file mojom_files.MojomFile) { |
| // fields in KeysByType. It seems these fields are not currently being |
| // used in mojom_translator.py. |
| + // SerializedRuntimeTypeInfo |
| + if EmitSerializedRuntimeTypeInfo { |
| + encoder := bindings.NewEncoder() |
| + typeInfo.Encode(encoder) |
| + bytes, _, err := encoder.Data() |
| + if err != nil { |
| + panic(fmt.Sprintf("Error while serializing runtimeTypeInfo: %s", err.Error())) |
| + } |
| + file.SerializedRuntimeTypeInfo = &bytes |
| + } |
| + |
| + return |
| +} |
| + |
| +// addServiceTypeInfo will add a ServiceTypeInfo to the ServicesByName field of |typeInfo| corresponding |
| +// to |intrfc| if |intrfc| is a top-level interface, meaning that it has a non-nil service name. In that |
| +// case this method returns true. Otherwise this method will do nothing and return fals. |
| +func addServiceTypeInfo(intrfc *mojom.MojomInterface, typeInfo *mojom_files.RuntimeTypeInfo) (isTopLevel bool) { |
| + isTopLevel = intrfc.ServiceName != nil |
| + if isTopLevel { |
| + serviceTypeInfo := mojom_files.ServiceTypeInfo{} |
| + serviceTypeInfo.TopLevelInterface = intrfc.TypeKey() |
| + serviceTypeInfo.CompleteTypeSet = intrfc.FindReachableTypes() |
| + typeInfo.ServicesByName[*intrfc.ServiceName] = serviceTypeInfo |
| + } |
| return |
| } |