Index: mojo/public/tools/bindings/pylib/mojom/generate/generator.py |
diff --git a/mojo/public/tools/bindings/pylib/mojom/generate/generator.py b/mojo/public/tools/bindings/pylib/mojom/generate/generator.py |
index 0e64af78a12b6db2fb6adfc863e081099d87081d..04850d71025953807451fb7b5d80dc048054a214 100644 |
--- a/mojo/public/tools/bindings/pylib/mojom/generate/generator.py |
+++ b/mojo/public/tools/bindings/pylib/mojom/generate/generator.py |
@@ -12,17 +12,25 @@ import module as mojom |
import mojom.fileutil as fileutil |
import pack |
+ |
def ExpectedArraySize(kind): |
if mojom.IsArrayKind(kind): |
return kind.length |
return None |
-def StudlyCapsToCamel(studly): |
- return studly[0].lower() + studly[1:] |
-def UnderToCamel(under): |
- """Converts underscore_separated strings to CamelCase strings.""" |
- return ''.join(word.capitalize() for word in under.split('_')) |
+def ToCamel(identifier, lower_initial=False, dilimiter='_'): |
+ """Splits |identifier| using |dilimiter|, makes the first character of each |
+ word uppercased (but makes the first character of the first word lowercased |
+ if |lower_initial| is set to True), and joins the words. Please note that for |
+ each word, all the characters except the first one are untouched. |
+ """ |
+ result = ''.join( |
+ word[0].upper() + word[1:] for word in identifier.split(dilimiter)) |
+ if lower_initial: |
+ result = result[0].lower() + result[1:] |
+ return result |
+ |
def WriteFile(contents, full_path): |
# Make sure the containing directory exists. |
@@ -33,121 +41,115 @@ def WriteFile(contents, full_path): |
with open(full_path, "w+") as f: |
f.write(contents) |
-class Generator(object): |
- # Pass |output_dir| to emit files to disk. Omit |output_dir| to echo all |
- # files to stdout. |
- def __init__(self, module, output_dir=None, typemap=None, variant=None, |
- bytecode_path=None, for_blink=False, use_once_callback=False, |
- use_new_js_bindings=False, export_attribute=None, |
- export_header=None, generate_non_variant_code=False): |
- self.module = module |
- self.output_dir = output_dir |
- self.typemap = typemap or {} |
- self.variant = variant |
- self.bytecode_path = bytecode_path |
- self.for_blink = for_blink |
- self.use_once_callback = use_once_callback |
- self.use_new_js_bindings = use_new_js_bindings |
- self.export_attribute = export_attribute |
- self.export_header = export_header |
- self.generate_non_variant_code = generate_non_variant_code |
- |
- def GetStructsFromMethods(self): |
- result = [] |
- for interface in self.module.interfaces: |
- for method in interface.methods: |
- result.append(self._GetStructFromMethod(method)) |
- if method.response_parameters != None: |
- result.append(self._GetResponseStructFromMethod(method)) |
- return result |
- |
- def GetStructs(self): |
- return map(partial(self._AddStructComputedData, True), self.module.structs) |
- |
- def GetUnions(self): |
- return map(self._AddUnionComputedData, self.module.unions) |
- |
- def GetInterfaces(self): |
- return map(self._AddInterfaceComputedData, self.module.interfaces) |
- # Prepend the filename with a directory that matches the directory of the |
- # original .mojom file, relative to the import root. |
- def MatchMojomFilePath(self, filename): |
- return os.path.join(os.path.dirname(self.module.path), filename) |
- |
- def Write(self, contents, filename): |
- if self.output_dir is None: |
- print contents |
- return |
- full_path = os.path.join(self.output_dir, filename) |
- WriteFile(contents, full_path) |
- |
- def GenerateFiles(self, args): |
- raise NotImplementedError("Subclasses must override/implement this method") |
- |
- def GetJinjaParameters(self): |
- """Returns default constructor parameters for the jinja environment.""" |
- return {} |
+def AddComputedData(module): |
+ """Adds computed data to the given module. The data is computed once and |
+ used repeatedly in the generation process.""" |
- def GetGlobals(self): |
- """Returns global mappings for the template generation.""" |
- return {} |
- |
- def _AddStructComputedData(self, exported, struct): |
- """Adds computed data to the given struct. The data is computed once and |
- used repeatedly in the generation process.""" |
+ def _AddStructComputedData(exported, struct): |
struct.packed = pack.PackedStruct(struct) |
struct.bytes = pack.GetByteLayout(struct.packed) |
struct.versions = pack.GetVersionInfo(struct.packed) |
struct.exported = exported |
- return struct |
- def _AddUnionComputedData(self, union): |
- """Adds computed data to the given union. The data is computed once and |
- used repeatedly in the generation process.""" |
+ def _AddUnionComputedData(union): |
ordinal = 0 |
for field in union.fields: |
if field.ordinal is not None: |
ordinal = field.ordinal |
field.ordinal = ordinal |
ordinal += 1 |
- return union |
- def _AddInterfaceComputedData(self, interface): |
- """Adds computed data to the given interface. The data is computed once and |
- used repeatedly in the generation process.""" |
+ def _AddInterfaceComputedData(interface): |
+ next_ordinal = 0 |
interface.version = 0 |
for method in interface.methods: |
+ if method.ordinal is None: |
+ method.ordinal = next_ordinal |
+ next_ordinal = method.ordinal + 1 |
+ |
if method.min_version is not None: |
interface.version = max(interface.version, method.min_version) |
- method.param_struct = self._GetStructFromMethod(method) |
+ method.param_struct = _GetStructFromMethod(method) |
interface.version = max(interface.version, |
method.param_struct.versions[-1].version) |
if method.response_parameters is not None: |
- method.response_param_struct = self._GetResponseStructFromMethod(method) |
+ method.response_param_struct = _GetResponseStructFromMethod(method) |
interface.version = max( |
interface.version, |
method.response_param_struct.versions[-1].version) |
else: |
method.response_param_struct = None |
- return interface |
- def _GetStructFromMethod(self, method): |
+ def _GetStructFromMethod(method): |
"""Converts a method's parameters into the fields of a struct.""" |
params_class = "%s_%s_Params" % (method.interface.name, method.name) |
struct = mojom.Struct(params_class, module=method.interface.module) |
for param in method.parameters: |
struct.AddField(param.name, param.kind, param.ordinal, |
attributes=param.attributes) |
- return self._AddStructComputedData(False, struct) |
+ _AddStructComputedData(False, struct) |
+ return struct |
- def _GetResponseStructFromMethod(self, method): |
+ def _GetResponseStructFromMethod(method): |
"""Converts a method's response_parameters into the fields of a struct.""" |
params_class = "%s_%s_ResponseParams" % (method.interface.name, method.name) |
struct = mojom.Struct(params_class, module=method.interface.module) |
for param in method.response_parameters: |
struct.AddField(param.name, param.kind, param.ordinal, |
attributes=param.attributes) |
- return self._AddStructComputedData(False, struct) |
+ _AddStructComputedData(False, struct) |
+ return struct |
+ |
+ for struct in module.structs: |
+ _AddStructComputedData(True, struct) |
+ for union in module.unions: |
+ _AddUnionComputedData(union) |
+ for interface in module.interfaces: |
+ _AddInterfaceComputedData(interface) |
+ |
+ |
+class Generator(object): |
+ # Pass |output_dir| to emit files to disk. Omit |output_dir| to echo all |
+ # files to stdout. |
+ def __init__(self, module, output_dir=None, typemap=None, variant=None, |
+ bytecode_path=None, for_blink=False, use_once_callback=False, |
+ use_new_js_bindings=False, export_attribute=None, |
+ export_header=None, generate_non_variant_code=False): |
+ self.module = module |
+ self.output_dir = output_dir |
+ self.typemap = typemap or {} |
+ self.variant = variant |
+ self.bytecode_path = bytecode_path |
+ self.for_blink = for_blink |
+ self.use_once_callback = use_once_callback |
+ self.use_new_js_bindings = use_new_js_bindings |
+ self.export_attribute = export_attribute |
+ self.export_header = export_header |
+ self.generate_non_variant_code = generate_non_variant_code |
+ |
+ # Prepend the filename with a directory that matches the directory of the |
+ # original .mojom file, relative to the import root. |
+ def MatchMojomFilePath(self, filename): |
+ return os.path.join(os.path.dirname(self.module.path), filename) |
+ |
+ def Write(self, contents, filename): |
+ if self.output_dir is None: |
+ print contents |
+ return |
+ full_path = os.path.join(self.output_dir, filename) |
+ WriteFile(contents, full_path) |
+ |
+ def GenerateFiles(self, args): |
+ raise NotImplementedError("Subclasses must override/implement this method") |
+ |
+ def GetJinjaParameters(self): |
+ """Returns default constructor parameters for the jinja environment.""" |
+ return {} |
+ |
+ def GetGlobals(self): |
+ """Returns global mappings for the template generation.""" |
+ return {} |
+ |