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
3 # found in the LICENSE file.
5 """Translates parse tree to Mojom IR."""
11 def _MapTree(func, tree, name):
14 return [func(subtree) for subtree in tree if subtree[0] == name]
17 map_to_kind = { 'bool': 'b',
30 'handle<data_pipe_consumer>': 'h:d:c',
31 'handle<data_pipe_producer>': 'h:d:p',
32 'handle<message_pipe>': 'h:m',
33 'handle<shared_buffer>': 'h:s'}
34 if kind.endswith('[]'):
35 return 'a:' + _MapKind(kind[0:len(kind)-2])
36 if kind in map_to_kind:
37 return map_to_kind[kind]
40 def _MapAttributes(attributes):
43 return dict([(attribute[1], attribute[2])
44 for attribute in attributes if attribute[0] == 'ATTRIBUTE'])
46 def _GetAttribute(attributes, name):
49 for attribute in attributes:
50 if attribute[0] == 'ATTRIBUTE' and attribute[1] == name:
55 assert type(tree[3]) is ast.Ordinal
56 return {'name': tree[2],
57 'kind': _MapKind(tree[1]),
58 'ordinal': tree[3].value,
61 def _MapParameter(tree):
62 assert type(tree[3]) is ast.Ordinal
63 return {'name': tree[2],
64 'kind': _MapKind(tree[1]),
65 'ordinal': tree[3].value}
68 assert type(tree[3]) is ast.Ordinal
69 method = {'name': tree[1],
70 'parameters': _MapTree(_MapParameter, tree[2], 'PARAM'),
71 'ordinal': tree[3].value}
73 method['response_parameters'] = _MapTree(_MapParameter, tree[4], 'PARAM')
76 def _MapEnumField(tree):
77 return {'name': tree[1],
82 struct['name'] = tree[1]
83 struct['attributes'] = _MapAttributes(tree[2])
84 struct['fields'] = _MapTree(_MapField, tree[3], 'FIELD')
85 struct['enums'] = _MapTree(_MapEnum, tree[3], 'ENUM')
88 def _MapInterface(tree):
90 interface['name'] = tree[1]
91 interface['client'] = _GetAttribute(tree[2], 'Client')
92 interface['methods'] = _MapTree(_MapMethod, tree[3], 'METHOD')
93 interface['enums'] = _MapTree(_MapEnum, tree[3], 'ENUM')
98 enum['name'] = tree[1]
99 enum['fields'] = _MapTree(_MapEnumField, tree[2], 'ENUM_FIELD')
102 def _MapModule(tree, name):
105 mojom['namespace'] = tree[1]
106 mojom['attributes'] = _MapAttributes(tree[2])
107 mojom['structs'] = _MapTree(_MapStruct, tree[3], 'STRUCT')
108 mojom['interfaces'] = _MapTree(_MapInterface, tree[3], 'INTERFACE')
109 mojom['enums'] = _MapTree(_MapEnum, tree[3], 'ENUM')
112 def _MapImport(tree):
114 import_item['filename'] = tree[1]
118 class _MojomBuilder(object):
122 def Build(self, tree, name):
123 modules = [_MapModule(item, name) for item in tree if item[0] == 'MODULE']
124 if len(modules) != 1:
125 raise Exception('A mojom file must contain exactly 1 module.')
126 self.mojom = modules[0]
127 self.mojom['imports'] = _MapTree(_MapImport, tree, 'IMPORT')
131 def Translate(tree, name):
132 return _MojomBuilder().Build(tree, name)