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

Side by Side Diff: mojom/mojom_tool/serialization/serialization.go

Issue 1916863003: Delete the |complete_type_set| field from mojom_types.mojom (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: Created 4 years, 7 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 unified diff | Download patch
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 package serialization 5 package serialization
6 6
7 import ( 7 import (
8 "bytes" 8 "bytes"
9 "compress/gzip" 9 "compress/gzip"
10 "encoding/base64" 10 "encoding/base64"
(...skipping 14 matching lines...) Expand all
25 var emitLineAndColumnNumbers bool = true 25 var emitLineAndColumnNumbers bool = true
26 26
27 // This variable may be set to false in order to omit emitting computed 27 // This variable may be set to false in order to omit emitting computed
28 // packing. This is useful in tests. 28 // packing. This is useful in tests.
29 var emitComputedPackingData bool = true 29 var emitComputedPackingData bool = true
30 30
31 // This variable may be set to false in order to omit emitting serialized 31 // This variable may be set to false in order to omit emitting serialized
32 // runtime type info. This is useful in tests. 32 // runtime type info. This is useful in tests.
33 var emitSerializedRuntimeTypeInfo bool = true 33 var emitSerializedRuntimeTypeInfo bool = true
34 34
35 // By default we do not populate the complete type set of each top-level interfa ce
36 // because doing so is expensive and we are not currently using the the data.
37 var populateCompleteTypeSet bool = false
38
39 // Serialize serializes the MojomDescriptor into a binary form that is passed to the 35 // Serialize serializes the MojomDescriptor into a binary form that is passed to the
40 // backend of the compiler in order to invoke the code generators. 36 // backend of the compiler in order to invoke the code generators.
41 // To do this we use Mojo serialization. 37 // To do this we use Mojo serialization.
42 // If |debug| is true we also return a human-readable representation 38 // If |debug| is true we also return a human-readable representation
43 // of the serialized mojom_types.FileGraph. 39 // of the serialized mojom_types.FileGraph.
44 // This function is not thread safe. 40 // This function is not thread safe.
45 func Serialize(d *mojom.MojomDescriptor, debug bool) (bytes []byte, debugString string, err error) { 41 func Serialize(d *mojom.MojomDescriptor, debug bool) (bytes []byte, debugString string, err error) {
46 » return serialize(d, debug, true, true, true, false) 42 » return serialize(d, debug, true, true, true)
47 } 43 }
48 44
49 // serialize() is a package-private version of the public method Serialize(). 45 // serialize() is a package-private version of the public method Serialize().
50 // It is intended for use in tests because it allows setting of the variables 46 // It is intended for use in tests because it allows setting of the variables
51 // emitLineAndColumnNumbers, emitComputedPackingData, emitSerializedRuntimeTypeI nfo 47 // emitLineAndColumnNumbers, emitComputedPackingData and emitSerializedRuntimeTy peInfo.
52 // and populateCompleteTypeSet.
53 // This function is not thread safe because it sets and accesses these global 48 // This function is not thread safe because it sets and accesses these global
54 // variables. 49 // variables.
55 func serialize(d *mojom.MojomDescriptor, debug, 50 func serialize(d *mojom.MojomDescriptor, debug,
56 » emitLineAndColumnNumbersParam, emitComputedPackingDataParam, emitSeriali zedRuntimeTypeInfoParam, 51 » emitLineAndColumnNumbersParam, emitComputedPackingDataParam,
57 » populateCompleteTypeSetParam bool) (bytes []byte, debugString string, er r error) { 52 » emitSerializedRuntimeTypeInfoParam bool) (bytes []byte, debugString stri ng, err error) {
58 53
59 // Save the global state and then set it based on the parameters. 54 // Save the global state and then set it based on the parameters.
60 saveEmitLineAndColumnNumbers := emitLineAndColumnNumbers 55 saveEmitLineAndColumnNumbers := emitLineAndColumnNumbers
61 emitLineAndColumnNumbers = emitLineAndColumnNumbersParam 56 emitLineAndColumnNumbers = emitLineAndColumnNumbersParam
62 saveEmitComputedPackingData := emitComputedPackingData 57 saveEmitComputedPackingData := emitComputedPackingData
63 emitComputedPackingData = emitComputedPackingDataParam 58 emitComputedPackingData = emitComputedPackingDataParam
64 saveEmitSerializedRuntimeTypeInfo := emitSerializedRuntimeTypeInfo 59 saveEmitSerializedRuntimeTypeInfo := emitSerializedRuntimeTypeInfo
65 emitSerializedRuntimeTypeInfo = emitSerializedRuntimeTypeInfoParam 60 emitSerializedRuntimeTypeInfo = emitSerializedRuntimeTypeInfoParam
66 savePopulateCompleteTypeSet := populateCompleteTypeSet
67 populateCompleteTypeSet = populateCompleteTypeSetParam
68 61
69 fileGraph := translateDescriptor(d) 62 fileGraph := translateDescriptor(d)
70 if debug { 63 if debug {
71 debugString = myfmt.Sprintf("%#v", fileGraph) 64 debugString = myfmt.Sprintf("%#v", fileGraph)
72 } 65 }
73 encoder := bindings.NewEncoder() 66 encoder := bindings.NewEncoder()
74 encoder.SetDeterministic(true) 67 encoder.SetDeterministic(true)
75 fileGraph.Encode(encoder) 68 fileGraph.Encode(encoder)
76 bytes, _, err = encoder.Data() 69 bytes, _, err = encoder.Data()
77 70
78 // Restore the original values of the global state. 71 // Restore the original values of the global state.
79 emitLineAndColumnNumbers = saveEmitLineAndColumnNumbers 72 emitLineAndColumnNumbers = saveEmitLineAndColumnNumbers
80 emitComputedPackingData = saveEmitComputedPackingData 73 emitComputedPackingData = saveEmitComputedPackingData
81 emitSerializedRuntimeTypeInfo = saveEmitSerializedRuntimeTypeInfo 74 emitSerializedRuntimeTypeInfo = saveEmitSerializedRuntimeTypeInfo
82 populateCompleteTypeSet = savePopulateCompleteTypeSet
83 return 75 return
84 } 76 }
85 77
86 // translateDescriptor translates from a mojom.MojomDescriptor (the pure Go 78 // translateDescriptor translates from a mojom.MojomDescriptor (the pure Go
87 // representation used by the parser) to a mojom_files.MojomFileGraph (the 79 // representation used by the parser) to a mojom_files.MojomFileGraph (the
88 // Mojo Go representation used for serialization.) 80 // Mojo Go representation used for serialization.)
89 func translateDescriptor(d *mojom.MojomDescriptor) *mojom_files.MojomFileGraph { 81 func translateDescriptor(d *mojom.MojomDescriptor) *mojom_files.MojomFileGraph {
90 fileGraph := mojom_files.MojomFileGraph{} 82 fileGraph := mojom_files.MojomFileGraph{}
91 83
92 // Add |resolved_types| field. 84 // Add |resolved_types| field.
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
146 // If we are in a mode where canonical file names are no t being resolved 138 // If we are in a mode where canonical file names are no t being resolved
147 // then emit a null value for |imports| rather than an e mpty array. 139 // then emit a null value for |imports| rather than an e mpty array.
148 file.Imports = nil 140 file.Imports = nil
149 } 141 }
150 } 142 }
151 143
152 // We will populate a RuntimeTypeInfo structure and then serialize it an d 144 // We will populate a RuntimeTypeInfo structure and then serialize it an d
153 // the serialized bytes will form the |serialized_runtime_type_info| fie ld 145 // the serialized bytes will form the |serialized_runtime_type_info| fie ld
154 // of the MojomFile. 146 // of the MojomFile.
155 typeInfo := mojom_types.RuntimeTypeInfo{} 147 typeInfo := mojom_types.RuntimeTypeInfo{}
156 » typeInfo.ServicesByName = make(map[string]mojom_types.ServiceTypeInfo) 148 » typeInfo.Services = make(map[string]string)
157 typeInfo.TypeMap = make(map[string]mojom_types.UserDefinedType) 149 typeInfo.TypeMap = make(map[string]mojom_types.UserDefinedType)
158 150
159 // We populate the declared_mojom_objects field 151 // We populate the declared_mojom_objects field
160 // and simultaneously we populate typeInfo.TypeMap. 152 // and simultaneously we populate typeInfo.TypeMap.
161 153
162 // Interfaces 154 // Interfaces
163 if f.Interfaces != nil && len(f.Interfaces) > 0 { 155 if f.Interfaces != nil && len(f.Interfaces) > 0 {
164 file.DeclaredMojomObjects.Interfaces = new([]string) 156 file.DeclaredMojomObjects.Interfaces = new([]string)
165 for _, intrfc := range f.Interfaces { 157 for _, intrfc := range f.Interfaces {
166 typeKey := intrfc.TypeKey() 158 typeKey := intrfc.TypeKey()
167 *(file.DeclaredMojomObjects.Interfaces) = append(*(file. DeclaredMojomObjects.Interfaces), typeKey) 159 *(file.DeclaredMojomObjects.Interfaces) = append(*(file. DeclaredMojomObjects.Interfaces), typeKey)
168 160
169 » » » addServiceTypeInfo(intrfc, &typeInfo) 161 » » » addServiceName(intrfc, &typeInfo)
170 typeInfo.TypeMap[typeKey] = fileGraph.ResolvedTypes[type Key] 162 typeInfo.TypeMap[typeKey] = fileGraph.ResolvedTypes[type Key]
171 if intrfc.Enums != nil { 163 if intrfc.Enums != nil {
172 // Add embedded enums to typeInfo.TypeMap. 164 // Add embedded enums to typeInfo.TypeMap.
173 for _, enum := range intrfc.Enums { 165 for _, enum := range intrfc.Enums {
174 typeKey := enum.TypeKey() 166 typeKey := enum.TypeKey()
175 typeInfo.TypeMap[typeKey] = fileGraph.Re solvedTypes[typeKey] 167 typeInfo.TypeMap[typeKey] = fileGraph.Re solvedTypes[typeKey]
176 } 168 }
177 } 169 }
178 } 170 }
179 } 171 }
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
247 panic(fmt.Sprintf("Error while gzipping runtimeTypeInfo: %s", err.Error())) 239 panic(fmt.Sprintf("Error while gzipping runtimeTypeInfo: %s", err.Error()))
248 } 240 }
249 byteSlice = compressedBytes.Bytes() 241 byteSlice = compressedBytes.Bytes()
250 encoded := base64.StdEncoding.EncodeToString(byteSlice) 242 encoded := base64.StdEncoding.EncodeToString(byteSlice)
251 file.SerializedRuntimeTypeInfo = &encoded 243 file.SerializedRuntimeTypeInfo = &encoded
252 } 244 }
253 245
254 return 246 return
255 } 247 }
256 248
257 // addServiceTypeInfo will add a ServiceTypeInfo to the ServicesByName field of |typeInfo| corresponding 249 // addServiceName will add the service name of |intrfc| to the |Services| field of |typeInfo|
258 // to |intrfc| if |intrfc| is a top-level interface, meaning that it has a non-n il service name. In that 250 // if |intrfc| is a top-level interface, meaning that it has a non-nil service n ame. In that
259 // case this method returns true. Otherwise this method will do nothing and retu rn fals. 251 // case this method returns true. Otherwise this method will do nothing and retu rn fals.
260 func addServiceTypeInfo(intrfc *mojom.MojomInterface, typeInfo *mojom_types.Runt imeTypeInfo) (isTopLevel bool) { 252 func addServiceName(intrfc *mojom.MojomInterface, typeInfo *mojom_types.RuntimeT ypeInfo) (isTopLevel bool) {
261 isTopLevel = intrfc.ServiceName != nil 253 isTopLevel = intrfc.ServiceName != nil
262 if isTopLevel { 254 if isTopLevel {
263 » » serviceTypeInfo := mojom_types.ServiceTypeInfo{} 255 » » typeInfo.Services[*intrfc.ServiceName] = intrfc.TypeKey()
264 » » serviceTypeInfo.TopLevelInterface = intrfc.TypeKey()
265 » » if populateCompleteTypeSet {
266 » » » serviceTypeInfo.CompleteTypeSet = intrfc.FindReachableTy pes()
267 » » }
268 » » typeInfo.ServicesByName[*intrfc.ServiceName] = serviceTypeInfo
269 } 256 }
270 return 257 return
271 } 258 }
272 259
273 // translateUserDefinedType translates from a mojom.UserDefinedType (the pure Go 260 // translateUserDefinedType translates from a mojom.UserDefinedType (the pure Go
274 // representation used by the parser) to a mojom_types.UserDefinedType (the 261 // representation used by the parser) to a mojom_types.UserDefinedType (the
275 // Mojo Go representation used for serialization.) 262 // Mojo Go representation used for serialization.)
276 func translateUserDefinedType(t mojom.UserDefinedType) mojom_types.UserDefinedTy pe { 263 func translateUserDefinedType(t mojom.UserDefinedType) mojom_types.UserDefinedTy pe {
277 switch p := t.(type) { 264 switch p := t.(type) {
278 case *mojom.MojomStruct: 265 case *mojom.MojomStruct:
(...skipping 456 matching lines...) Expand 10 before | Expand all | Expand 10 after
735 722
736 // stringPointer is a convenience function for creating a pointer to a string wh ose value 723 // stringPointer is a convenience function for creating a pointer to a string wh ose value
737 // is the specified string. It may be used in situations where the compiler will 724 // is the specified string. It may be used in situations where the compiler will
738 // not allow you to take the address of a string value directly, such as the 725 // not allow you to take the address of a string value directly, such as the
739 // return value of a function. It is necessary to create pointers to strings bec ause 726 // return value of a function. It is necessary to create pointers to strings bec ause
740 // that is how the Mojom type |string?| (i.e. nullable string) is represented in 727 // that is how the Mojom type |string?| (i.e. nullable string) is represented in
741 // in the Mojom Go bindings. 728 // in the Mojom Go bindings.
742 func stringPointer(s string) *string { 729 func stringPointer(s string) *string {
743 return &s 730 return &s
744 } 731 }
OLDNEW
« no previous file with comments | « mojom/mojom_tool/mojom/user_defined_types.go ('k') | mojom/mojom_tool/serialization/serialization_test.go » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698