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

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: 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..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
}
« 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