Index: third_party/mojo/src/mojo/public/tools/bindings/pylib/mojom/parse/translate.py |
diff --git a/third_party/mojo/src/mojo/public/tools/bindings/pylib/mojom/parse/translate.py b/third_party/mojo/src/mojo/public/tools/bindings/pylib/mojom/parse/translate.py |
index 88bd2698ade8e5a1e06e7f654187f877bef1a9c3..8fbc86d154f1a1c115e2b5c23435e1d6bdc88825 100644 |
--- a/third_party/mojo/src/mojo/public/tools/bindings/pylib/mojom/parse/translate.py |
+++ b/third_party/mojo/src/mojo/public/tools/bindings/pylib/mojom/parse/translate.py |
@@ -55,9 +55,13 @@ def _MapKind(kind): |
return map_to_kind[kind] |
return 'x:' + kind |
+def _AddOptional(dictionary, key, value): |
+ if value is not None: |
+ dictionary[key] = value; |
+ |
def _AttributeListToDict(attribute_list): |
if attribute_list is None: |
- return {} |
+ return None |
assert isinstance(attribute_list, ast.AttributeList) |
# TODO(vtl): Check for duplicate keys here. |
return dict([(attribute.key, attribute.value) |
@@ -66,12 +70,17 @@ def _AttributeListToDict(attribute_list): |
def _EnumToDict(enum): |
def EnumValueToDict(enum_value): |
assert isinstance(enum_value, ast.EnumValue) |
- return {'name': enum_value.name, |
- 'value': enum_value.value} |
+ data = {'name': enum_value.name} |
+ _AddOptional(data, 'value', enum_value.value) |
+ _AddOptional(data, 'attributes', |
+ _AttributeListToDict(enum_value.attribute_list)) |
+ return data |
assert isinstance(enum, ast.Enum) |
- return {'name': enum.name, |
+ data = {'name': enum.name, |
'fields': map(EnumValueToDict, enum.enum_value_list)} |
+ _AddOptional(data, 'attributes', _AttributeListToDict(enum.attribute_list)) |
+ return data |
def _ConstToDict(const): |
assert isinstance(const, ast.Const) |
@@ -88,71 +97,90 @@ class _MojomBuilder(object): |
def StructToDict(struct): |
def StructFieldToDict(struct_field): |
assert isinstance(struct_field, ast.StructField) |
- return {'name': struct_field.name, |
- 'kind': _MapKind(struct_field.typename), |
- 'ordinal': struct_field.ordinal.value \ |
- if struct_field.ordinal else None, |
- 'default': struct_field.default_value} |
+ data = {'name': struct_field.name, |
+ 'kind': _MapKind(struct_field.typename)} |
+ _AddOptional(data, 'ordinal', |
+ struct_field.ordinal.value |
+ if struct_field.ordinal else None) |
+ _AddOptional(data, 'default', struct_field.default_value) |
+ _AddOptional(data, 'attributes', |
+ _AttributeListToDict(struct_field.attribute_list)) |
+ return data |
assert isinstance(struct, ast.Struct) |
- return {'name': struct.name, |
- 'attributes': _AttributeListToDict(struct.attribute_list), |
+ data = {'name': struct.name, |
'fields': _MapTreeForType(StructFieldToDict, struct.body, |
ast.StructField), |
'enums': _MapTreeForType(_EnumToDict, struct.body, ast.Enum), |
'constants': _MapTreeForType(_ConstToDict, struct.body, |
ast.Const)} |
+ _AddOptional(data, 'attributes', |
+ _AttributeListToDict(struct.attribute_list)) |
+ return data |
def UnionToDict(union): |
def UnionFieldToDict(union_field): |
assert isinstance(union_field, ast.UnionField) |
- return {'name': union_field.name, |
- 'kind': _MapKind(union_field.typename), |
- 'ordinal': union_field.ordinal.value \ |
- if union_field.ordinal else None} |
+ data = {'name': union_field.name, |
+ 'kind': _MapKind(union_field.typename)} |
+ _AddOptional(data, 'ordinal', |
+ union_field.ordinal.value |
+ if union_field.ordinal else None) |
+ _AddOptional(data, 'attributes', |
+ _AttributeListToDict(union_field.attribute_list)) |
+ return data |
+ |
assert isinstance(union, ast.Union) |
- return {'name': union.name, |
+ data = {'name': union.name, |
'fields': _MapTreeForType(UnionFieldToDict, union.body, |
ast.UnionField)} |
+ _AddOptional(data, 'attributes', |
+ _AttributeListToDict(union.attribute_list)) |
+ return data |
def InterfaceToDict(interface): |
def MethodToDict(method): |
def ParameterToDict(param): |
assert isinstance(param, ast.Parameter) |
- return {'name': param.name, |
- 'kind': _MapKind(param.typename), |
- 'ordinal': param.ordinal.value if param.ordinal else None} |
+ data = {'name': param.name, |
+ 'kind': _MapKind(param.typename)} |
+ _AddOptional(data, 'ordinal', |
+ param.ordinal.value if param.ordinal else None) |
+ _AddOptional(data, 'attributes', |
+ _AttributeListToDict(param.attribute_list)) |
+ return data |
assert isinstance(method, ast.Method) |
- rv = {'name': method.name, |
- 'parameters': map(ParameterToDict, method.parameter_list), |
- 'ordinal': method.ordinal.value if method.ordinal else None} |
+ data = {'name': method.name, |
+ 'parameters': map(ParameterToDict, method.parameter_list)} |
if method.response_parameter_list is not None: |
- rv['response_parameters'] = map(ParameterToDict, |
- method.response_parameter_list) |
- return rv |
+ data['response_parameters'] = map(ParameterToDict, |
+ method.response_parameter_list) |
+ _AddOptional(data, 'ordinal', |
+ method.ordinal.value if method.ordinal else None) |
+ _AddOptional(data, 'attributes', |
+ _AttributeListToDict(method.attribute_list)) |
+ return data |
assert isinstance(interface, ast.Interface) |
- attributes = _AttributeListToDict(interface.attribute_list) |
- return {'name': interface.name, |
- 'attributes': attributes, |
- 'client': attributes.get('Client'), |
+ data = {'name': interface.name, |
'methods': _MapTreeForType(MethodToDict, interface.body, |
ast.Method), |
'enums': _MapTreeForType(_EnumToDict, interface.body, ast.Enum), |
'constants': _MapTreeForType(_ConstToDict, interface.body, |
ast.Const)} |
+ _AddOptional(data, 'attributes', |
+ _AttributeListToDict(interface.attribute_list)) |
+ return data |
assert isinstance(tree, ast.Mojom) |
self.mojom['name'] = name |
self.mojom['namespace'] = tree.module.name[1] if tree.module else '' |
self.mojom['imports'] = \ |
[{'filename': imp.import_filename} for imp in tree.import_list] |
- self.mojom['attributes'] = \ |
- _AttributeListToDict(tree.module.attribute_list) if tree.module else {} |
self.mojom['structs'] = \ |
_MapTreeForType(StructToDict, tree.definition_list, ast.Struct) |
- self.mojom['union'] = \ |
+ self.mojom['unions'] = \ |
_MapTreeForType(UnionToDict, tree.definition_list, ast.Union) |
self.mojom['interfaces'] = \ |
_MapTreeForType(InterfaceToDict, tree.definition_list, ast.Interface) |
@@ -160,6 +188,9 @@ class _MojomBuilder(object): |
_MapTreeForType(_EnumToDict, tree.definition_list, ast.Enum) |
self.mojom['constants'] = \ |
_MapTreeForType(_ConstToDict, tree.definition_list, ast.Const) |
+ _AddOptional(self.mojom, 'attributes', |
+ _AttributeListToDict(tree.module.attribute_list) |
+ if tree.module else None) |
return self.mojom |