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

Side by Side Diff: mojo/public/tools/bindings/generators/mojom_go_generator.py

Issue 1776243004: Mojom runtime type info: Use compression and base64 encoding. (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: Rebasing Created 4 years, 9 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 '''Generates Go source files from a mojom.Module.''' 5 '''Generates Go source files from a mojom.Module.'''
6 6
7 from itertools import chain 7 from itertools import chain
8 import os 8 import os
9 import re 9 import re
10 10
(...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after
218 def GetAllConstants(module): 218 def GetAllConstants(module):
219 data = [module] + module.structs + module.interfaces 219 data = [module] + module.structs + module.interfaces
220 constants = [x.constants for x in data] 220 constants = [x.constants for x in data]
221 return [i for i in chain.from_iterable(constants)] 221 return [i for i in chain.from_iterable(constants)]
222 222
223 def GetAllEnums(module): 223 def GetAllEnums(module):
224 data = [module] + module.structs + module.interfaces 224 data = [module] + module.structs + module.interfaces
225 enums = [x.enums for x in data] 225 enums = [x.enums for x in data]
226 return [i for i in chain.from_iterable(enums)] 226 return [i for i in chain.from_iterable(enums)]
227 227
228 def GetSerializedRuntimeTypeInfoLiteral(module, enabled):
229 """ Constructs a string that represents a literal definition in Go of
230 an array of bytes corresponding to |module.serialized_runtime_type_info|.
231
232 Args:
233 module: {mojom.Module} the module being processed.
234 enabled: {bool} Is this feature enabled.
235
236 Returns: A string of the form '{b0, b1, b2,...}' where the 'bi' are
237 the decimal representation of the bytes of
238 |module.serialized_runtime_type_info| or the string '{}' if either
239 |enabled| is false or |module.serialized_runtime_type_info| is None.
240 Furthermore the returned string will have embedded newline characters inserted
241 every 1000 characters to make the generated source code more tractable.
242 """
243 if not enabled or not module.serialized_runtime_type_info:
244 return '{}'
245 return '{%s}' % ','.join('%s%d' %
246 ('\n' if index > 0 and index%1000 == 0 else '', b)
247 for index, b in enumerate(module.serialized_runtime_type_info))
248
249 def AddImport(imports, mojom_imports, module, element): 228 def AddImport(imports, mojom_imports, module, element):
250 """Adds an import required to use the provided element. 229 """Adds an import required to use the provided element.
251 230
252 The required import is stored in the imports parameter. 231 The required import is stored in the imports parameter.
253 The corresponding mojom import is stored in the mojom_imports parameter. 232 The corresponding mojom import is stored in the mojom_imports parameter.
254 Each import is also updated to include a 'go_name' entry. The 'go_name' entry 233 Each import is also updated to include a 'go_name' entry. The 'go_name' entry
255 is the name by which the imported module will be referred to in the generated 234 is the name by which the imported module will be referred to in the generated
256 code. Because the import dictionary is accessible from the element's 235 code. Because the import dictionary is accessible from the element's
257 imported_from field this allows us to generate the qualified name for the 236 imported_from field this allows us to generate the qualified name for the
258 element. 237 element.
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
334 'imports': imports, 313 'imports': imports,
335 'interfaces': self.GetInterfaces(), 314 'interfaces': self.GetInterfaces(),
336 'mojom_imports': mojom_imports, 315 'mojom_imports': mojom_imports,
337 'package': package, 316 'package': package,
338 'structs': self.GetStructs(), 317 'structs': self.GetStructs(),
339 'descpkg': '%s.' % _service_describer_pkg_short \ 318 'descpkg': '%s.' % _service_describer_pkg_short \
340 if package != _service_describer_pkg_short else '', 319 if package != _service_describer_pkg_short else '',
341 'typepkg': '%s.' % _mojom_types_pkg_short \ 320 'typepkg': '%s.' % _mojom_types_pkg_short \
342 if package != _mojom_types_pkg_short else '', 321 if package != _mojom_types_pkg_short else '',
343 'unions': self.GetUnions(), 322 'unions': self.GetUnions(),
344 'serialized_runtime_type_info_literal' : (
345 GetSerializedRuntimeTypeInfoLiteral(self.module,
346 self.should_gen_mojom_types))
347 } 323 }
348 324
349 @UseJinja('go_templates/source.tmpl', filters=go_filters) 325 @UseJinja('go_templates/source.tmpl', filters=go_filters)
350 def GenerateSource(self): 326 def GenerateSource(self):
351 return self.GetParameters() 327 return self.GetParameters()
352 328
353 def GenerateFiles(self, args): 329 def GenerateFiles(self, args):
354 self.should_gen_mojom_types = "--generate_type_info" in args 330 self.should_gen_mojom_types = "--generate_type_info" in args
355 331
356 self.Write(self.GenerateSource(), os.path.join("go", "src", 332 self.Write(self.GenerateSource(), os.path.join("go", "src",
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
414 for enum in GetAllEnums(self.module): 390 for enum in GetAllEnums(self.module):
415 for field in enum.fields: 391 for field in enum.fields:
416 if field.value: 392 if field.value:
417 AddImport(imports, mojom_imports, self.module, field.value) 393 AddImport(imports, mojom_imports, self.module, field.value)
418 394
419 # Mojom Type generation requires additional imports. 395 # Mojom Type generation requires additional imports.
420 defInterface = len(self.module.interfaces) > 0 396 defInterface = len(self.module.interfaces) > 0
421 defOtherType = len(self.module.unions) + len(all_structs) + \ 397 defOtherType = len(self.module.unions) + len(all_structs) + \
422 len(GetAllEnums(self.module)) > 0 398 len(GetAllEnums(self.module)) > 0
423 399
400 if self.should_gen_mojom_types:
401 imports['bytes'] = 'bytes'
402 imports['compress/gzip'] = 'gzip'
403 imports['encoding/base64'] = 'base64'
404 imports['io/ioutil'] = 'ioutil'
405
424 if GetPackageName(self.module) != _mojom_types_pkg_short: 406 if GetPackageName(self.module) != _mojom_types_pkg_short:
425 if defInterface: 407 if defInterface:
426 # Each Interface has a service description that uses this. 408 # Each Interface has a service description that uses this.
427 imports[_mojom_types_pkg] = _mojom_types_pkg_short 409 imports[_mojom_types_pkg] = _mojom_types_pkg_short
428 if defOtherType and self.should_gen_mojom_types: 410 if defOtherType and self.should_gen_mojom_types:
429 # This import is needed only if generating mojom type definitions. 411 # This import is needed only if generating mojom type definitions.
430 imports[_mojom_types_pkg] = _mojom_types_pkg_short 412 imports[_mojom_types_pkg] = _mojom_types_pkg_short
431 413
432 if GetPackageName(self.module) != _service_describer_pkg_short and \ 414 if GetPackageName(self.module) != _service_describer_pkg_short and \
433 defInterface: 415 defInterface:
(...skipping 20 matching lines...) Expand all
454 # Overrides the implementation from the base class in order to customize the 436 # Overrides the implementation from the base class in order to customize the
455 # struct and field names. 437 # struct and field names.
456 def _GetResponseStructFromMethod(self, method): 438 def _GetResponseStructFromMethod(self, method):
457 params_class = "%s_%s_ResponseParams" % ( 439 params_class = "%s_%s_ResponseParams" % (
458 GetNameForElement(method.interface), GetNameForElement(method)) 440 GetNameForElement(method.interface), GetNameForElement(method))
459 struct = mojom.Struct(params_class, module=method.interface.module) 441 struct = mojom.Struct(params_class, module=method.interface.module)
460 for param in method.response_parameters: 442 for param in method.response_parameters:
461 struct.AddField("out%s" % GetNameForElement(param), 443 struct.AddField("out%s" % GetNameForElement(param),
462 param.kind, param.ordinal, attributes=param.attributes) 444 param.kind, param.ordinal, attributes=param.attributes)
463 return self._AddStructComputedData(False, struct) 445 return self._AddStructComputedData(False, struct)
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698