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

Side by Side Diff: mojo/public/tools/bindings/pylib/mojom/parse/translate.py

Issue 391003003: Mojo: Mojom: Add AST type for struct fields. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 5 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 | Annotate | Revision Log
OLDNEW
1 # Copyright 2014 The Chromium Authors. All rights reserved. 1 # Copyright 2014 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 """Translates parse tree to Mojom IR.""" 5 """Translates parse tree to Mojom IR."""
6 6
7 7
8 import ast 8 import ast
9 import re 9 import re
10 10
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
60 return 'x:' + kind 60 return 'x:' + kind
61 61
62 def _AttributeListToDict(attribute_list): 62 def _AttributeListToDict(attribute_list):
63 if attribute_list is None: 63 if attribute_list is None:
64 return {} 64 return {}
65 assert isinstance(attribute_list, ast.AttributeList) 65 assert isinstance(attribute_list, ast.AttributeList)
66 # TODO(vtl): Check for duplicate keys here. 66 # TODO(vtl): Check for duplicate keys here.
67 return dict([(attribute.key, attribute.value) 67 return dict([(attribute.key, attribute.value)
68 for attribute in attribute_list]) 68 for attribute in attribute_list])
69 69
70 def _MapField(tree):
71 assert tree[3] is None or isinstance(tree[3], ast.Ordinal)
72 return {'name': tree[2],
73 'kind': _MapKind(tree[1]),
74 'ordinal': tree[3].value if tree[3] else None,
75 'default': tree[4]}
76
77 def _MapMethod(tree): 70 def _MapMethod(tree):
78 assert isinstance(tree[2], ast.ParameterList) 71 assert isinstance(tree[2], ast.ParameterList)
79 assert tree[3] is None or isinstance(tree[3], ast.Ordinal) 72 assert tree[3] is None or isinstance(tree[3], ast.Ordinal)
80 assert tree[4] is None or isinstance(tree[2], ast.ParameterList) 73 assert tree[4] is None or isinstance(tree[2], ast.ParameterList)
81 74
82 def ParameterToDict(param): 75 def ParameterToDict(param):
83 assert isinstance(param, ast.Parameter) 76 assert isinstance(param, ast.Parameter)
84 return {'name': param.name, 77 return {'name': param.name,
85 'kind': _MapKind(param.typename), 78 'kind': _MapKind(param.typename),
86 'ordinal': param.ordinal.value if param.ordinal else None} 79 'ordinal': param.ordinal.value if param.ordinal else None}
87 80
88 method = {'name': tree[1], 81 method = {'name': tree[1],
89 'parameters': map(ParameterToDict, tree[2]), 82 'parameters': map(ParameterToDict, tree[2]),
90 'ordinal': tree[3].value if tree[3] else None} 83 'ordinal': tree[3].value if tree[3] else None}
91 if tree[4]: 84 if tree[4]:
92 method['response_parameters'] = map(ParameterToDict, tree[4]) 85 method['response_parameters'] = map(ParameterToDict, tree[4])
93 return method 86 return method
94 87
95 def _MapStruct(tree): 88 def _MapStruct(tree):
89 def StructFieldToDict(struct_field):
90 assert isinstance(struct_field, ast.StructField)
91 return {'name': struct_field.name,
92 'kind': _MapKind(struct_field.typename),
93 'ordinal': struct_field.ordinal.value \
94 if struct_field.ordinal else None,
95 'default': struct_field.default_value}
96
96 struct = {} 97 struct = {}
97 struct['name'] = tree[1] 98 struct['name'] = tree[1]
98 struct['attributes'] = _AttributeListToDict(tree[2]) 99 struct['attributes'] = _AttributeListToDict(tree[2])
99 struct['fields'] = _MapTreeForName(_MapField, tree[3], 'FIELD') 100 struct['fields'] = _MapTreeForType(StructFieldToDict, tree[3],
101 ast.StructField)
100 struct['enums'] = _MapTreeForType(_MapEnum, tree[3], ast.Enum) 102 struct['enums'] = _MapTreeForType(_MapEnum, tree[3], ast.Enum)
101 struct['constants'] = _MapTreeForType(_MapConstant, tree[3], ast.Const) 103 struct['constants'] = _MapTreeForType(_MapConstant, tree[3], ast.Const)
102 return struct 104 return struct
103 105
104 def _MapInterface(tree): 106 def _MapInterface(tree):
105 interface = {} 107 interface = {}
106 interface['name'] = tree[1] 108 interface['name'] = tree[1]
107 interface['attributes'] = _AttributeListToDict(tree[2]) 109 interface['attributes'] = _AttributeListToDict(tree[2])
108 interface['client'] = interface['attributes'].get('Client') 110 interface['client'] = interface['attributes'].get('Client')
109 interface['methods'] = _MapTreeForName(_MapMethod, tree[3], 'METHOD') 111 interface['methods'] = _MapTreeForName(_MapMethod, tree[3], 'METHOD')
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
146 _MapTreeForName(_MapInterface, tree.definition_list, 'INTERFACE') 148 _MapTreeForName(_MapInterface, tree.definition_list, 'INTERFACE')
147 self.mojom['enums'] = \ 149 self.mojom['enums'] = \
148 _MapTreeForType(_MapEnum, tree.definition_list, ast.Enum) 150 _MapTreeForType(_MapEnum, tree.definition_list, ast.Enum)
149 self.mojom['constants'] = \ 151 self.mojom['constants'] = \
150 _MapTreeForType(_MapConstant, tree.definition_list, ast.Const) 152 _MapTreeForType(_MapConstant, tree.definition_list, ast.Const)
151 return self.mojom 153 return self.mojom
152 154
153 155
154 def Translate(tree, name): 156 def Translate(tree, name):
155 return _MojomBuilder().Build(tree, name) 157 return _MojomBuilder().Build(tree, name)
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698