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..5509759ee8728af03d3d1ea2e48b6df5d77fb411 100644 |
--- a/mojom/mojom_parser/serialization/serialization.go |
+++ b/mojom/mojom_parser/serialization/serialization.go |
@@ -19,14 +19,34 @@ import ( |
// This variable may be set to false in order to omit emitting line and |
// column numbers. |
-var EmitLineAndColumnNumbers bool = true |
+var emitLineAndColumnNumbers bool = true |
+ |
+// This variable may be set to false in order to omit emitting serialized |
+// runtime type info. |
+var emitSerializedRuntimeTypeInfo bool = true |
// 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. |
// If |debug| is true we also return a human-readable representation |
// of the serialized mojom_types.FileGraph. |
+// This function is not thread safe. |
func Serialize(d *mojom.MojomDescriptor, debug bool) (bytes []byte, debugString string, err error) { |
+ return serialize(d, debug, true, true) |
+} |
+ |
+// serialize() is a package-private version of the public method Serialize(). |
+// It is intended for use in tests because it allows setting of the variables |
+// emitLineAndColumnNumbers and emitSerializedRuntimeTypeInfo. |
+// This function is not thread safe because it accesses the global variables |
+// emitLineAndColumnNumbers and emitSerializedRuntimeTypeInfo. |
+func serialize(d *mojom.MojomDescriptor, debug, |
+ emitLineAndColumnNumbersParam, emitSerializedRuntimeTypeInfoParam bool) (bytes []byte, debugString string, err error) { |
+ saveEmitLineAndColumnNumbers := emitLineAndColumnNumbers |
+ emitLineAndColumnNumbers = emitLineAndColumnNumbersParam |
+ saveEmitSerializedRuntimeTypeInfo := emitSerializedRuntimeTypeInfo |
+ emitSerializedRuntimeTypeInfo = emitSerializedRuntimeTypeInfoParam |
+ |
fileGraph := translateDescriptor(d) |
if debug { |
debugString = myfmt.Sprintf("%#v", fileGraph) |
@@ -34,6 +54,9 @@ func Serialize(d *mojom.MojomDescriptor, debug bool) (bytes []byte, debugString |
encoder := bindings.NewEncoder() |
fileGraph.Encode(encoder) |
bytes, _, err = encoder.Data() |
+ |
+ emitLineAndColumnNumbers = saveEmitLineAndColumnNumbers |
+ emitSerializedRuntimeTypeInfo = saveEmitSerializedRuntimeTypeInfo |
return |
} |
@@ -43,12 +66,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 +78,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 +116,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 +149,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 +166,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 +176,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 +194,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 |
} |
@@ -544,7 +624,7 @@ func translateDeclarationData(d *mojom.DeclarationData) *mojom_types.Declaration |
// source_file_info |
declData.SourceFileInfo = new(mojom_types.SourceFileInfo) |
declData.SourceFileInfo.FileName = d.OwningFile().CanonicalFileName |
- if EmitLineAndColumnNumbers { |
+ if emitLineAndColumnNumbers { |
declData.SourceFileInfo.LineNumber = d.LineNumber() |
declData.SourceFileInfo.ColumnNumber = d.ColumnNumber() |
} |