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

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

Issue 1690453002: Mojom Parser: Populate |serialized_runimte_type_info| field during serialization. (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: Rename variables and new sha1s. Created 4 years, 10 months 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 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()
}
« no previous file with comments | « mojom/mojom_parser/parser/resolution_test.go ('k') | mojom/mojom_parser/serialization/serialization_test.go » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698