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

Side by Side Diff: third_party/WebKit/Source/bindings/scripts/collect_idls_into_json.py

Issue 1376673003: Collect idls and organize interface node (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Created 5 years, 2 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
« no previous file with comments | « no previous file | third_party/WebKit/Source/bindings/scripts/interface_node_path.py » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 #!/usr/bin/env python
2 # Copyright 2015 The Chromium Authors. All rights reserved.
3 # Use of this source code is governed by a BSD-style license that can be
4 # found in the LICENSE file.
5
6 """Usage: collect_idls_into_json.py path_file.txt json_file.json
bashi 2015/09/30 03:13:15 Please add a description (What this script does).
natsukoa 2015/10/05 01:47:11 Done.
7 """
8
9 import os
10 import sys
11 import json
bashi 2015/09/30 03:13:15 nit: sort imports in alphabetical order.
natsukoa 2015/10/05 01:47:10 Done.
12 import utilities
13
14 from blink_idl_parser import parse_file, BlinkIDLParser
15
16 _class_name = 'Interface'
bashi 2015/09/30 03:13:15 nit: use upper case for consts. _class_name -> _C
natsukoa 2015/10/05 01:47:10 Done.
17 _partial = 'Partial'
bashi 2015/09/30 03:13:16 _partial -> _PARTIAL
natsukoa 2015/10/05 01:47:11 Done.
18
19
20 def get_definitions(paths):
21 """Returns interface IDL node.
bashi 2015/09/30 03:13:15 Is this function used? If not, remove it.
natsukoa 2015/10/05 01:47:11 I forgot to change the description, but I'm using
22 Args:
23 paths: list of IDL file path
24 Returns:
25 a generator which yields interface node objects
26 """
27 parser = BlinkIDLParser(debug=False)
bashi 2015/09/30 03:13:16 nit: you can omit debug=False
natsukoa 2015/10/05 01:47:10 Really? I couldn't remove it because debug informa
bashi 2015/10/05 07:23:05 The default value of |debug| is False, which means
natsukoa 2015/10/05 08:59:04 oh... I got it.
28 for path in paths:
29 definitions = parse_file(parser, path)
30 for definition in definitions.GetChildren():
31 yield definition
32
33
34 def get_interface_node(definition):
bashi 2015/09/30 03:13:15 Please add a comment to describe what this functio
natsukoa 2015/10/05 01:47:11 Done.
35 if definition.GetClass() == _class_name:
36 return definition
bashi 2015/09/30 03:13:16 What should be a return value when definition.GetC
37
38
39 def get_implements_node(definition):
40 if definition.GetClass() == 'Implements':
41 return definition
bashi 2015/09/30 03:13:16 ditto.
natsukoa 2015/10/05 01:47:11 Done.
42
43
44 def get_filepath(interface_node):
45 """Returns relative path under the WebKit directory which |interface_node| i s defined.
46 Args:
47 interface_node: IDL interface
48 Returns:
49 str which is |interface_node| file path
50 """
51 filename = interface_node.GetProperty('FILENAME')
52 return os.path.relpath(filename).strip('../chromium/src/third_party/WebKit')
53
54
55 def filter_partial(interface_nodes):
56 """Returns partial interface node.
57 Args:
58 interface_nodes: a generator which is interface IDL
59 Return:
60 a generator which yields partial interface node
61 """
62 for interface_node in interface_nodes:
63 if interface_node.GetProperty(_partial):
64 yield interface_node
65
66
67 def filter_non_partial(interface_nodes):
68 """Returns interface node.
69 Args:
70 interface_nodes: a generator which is interface IDL node
71 Returns:
72 a generator which yields interface node
73 """
74 for interface_node in interface_nodes:
75 if not interface_node.GetProperty(_partial):
76 yield interface_node
77
78
79 def get_attribute_node(interface_node):
Yuki 2015/09/30 04:24:21 I'd recommend to name this function get_attribute_
Yuki 2015/10/05 04:33:43 Could you address this comment, too?
natsukoa 2015/10/05 08:59:04 Done.
80 """Returns list of Attribute if the interface have one.
81 Args:
82 interface_node: interface node object
83 Returns:
84 a list of attribute
85 """
86 return interface_node.GetListOf('Attribute')
87
88
89 def get_attribute_type(attribute_node):
90 """Returns type of attribute.
91 Args:
92 attribute_node: attribute node object
93 Returns:
94 str which is type of Attribute
95 """
96 return attribute_node.GetOneOf('Type').GetChildren()[0].GetName()
97
98
99 get_operation_type = get_attribute_type
100 get_argument_type = get_attribute_type
101
102
103 def get_extattribute_node(node):
104 """Returns list of ExtAttribute.
105 Args:
106 IDL node object
107 Returns:
108 a list of ExtAttrbute
109 """
110 if node.GetOneOf('ExtAttributes'):
111 return node.GetOneOf('ExtAttributes').GetListOf('ExtAttribute')
112 else:
113 return []
114
115
116 def extattr_node_to_dict(extattr):
117 """Returns a generator which yields Extattribute's object dictionary
118 Args:
119 extattribute_nodes: list of extended attribute
120 Returns:
121 a generator which yields extattribute dictionary
122 """
123 return {
124 'Name': extattr.GetName(),
125 }
126
127
128 def attribute_node_to_dict(attribute_node):
129 """Returns dictioary of attribute object information.
130 Args:
131 attribute_nodes: list of attribute node object
132 Returns:
133 a generator which yields dictionary of attribite information
134 """
135 return {
136 'Name': attribute_node.GetName(),
137 'Type': get_attribute_type(attribute_node),
138 'ExtAttributes': [extattr_node_to_dict(extattr) for extattr in get_extat tribute_node(attribute_node) if extattr_node_to_dict(extattr)],
Yuki 2015/09/30 04:24:22 Do we need |if extattr_node_to_dict(extattr)| ? D
natsukoa 2015/10/05 01:47:10 I checked the difference between with |if extattr_
139 'Readonly': attribute_node.GetProperty('READONLY', default=False),
140 'Static': attribute_node.GetProperty('STATIC', default=False),
141 }
142
143
144 def get_operation_node(interface_node):
145 """Returns Operations object under the interface.
146 Args:
147 interface: interface node object
148 Returns:
149 list which is list of oparation object
150 """
151 return interface_node.GetListOf('Operation')
152
153
154 def get_argument_node(operation_node):
155 """Returns Argument object under the operation object.
156 Args:
157 operation_node: operation node object
158 Returns:
159 list of argument object
160 """
161 return operation_node.GetOneOf('Arguments').GetListOf('Argument')
162
163
164 def argument_node_to_dict(argument_node):
165 """Returns generator which yields dictionary of Argument object information.
166 Args:
167 arguments: list of argument node object
168 Returns:
169 a generator which yields dictionary of argument information
170 """
171 return {
172 'Name': argument_node.GetName(),
173 'Type': get_argument_type(argument_node),
174 }
175
176
177 def get_operation_name(operation_node):
178 """Returns openration object name.
179 Args:
180 operation_node: operation node object
181 Returns:
182 str which is operation's name
183 """
184 if operation_node.GetProperty('GETTER'):
185 return '__getter__'
186 elif operation_node.GetProperty('SETTER'):
187 return '__setter__'
188 elif operation_node.GetProperty('DELETER'):
189 return '__deleter__'
190 else:
191 return operation_node.GetName()
192
193
194 def operation_node_to_dict(operation_node):
195 """Returns dictionary of Operation object information.
196 Args:
197 operation_nodes: list of operation node object
198 Returns:
199 dictionary of operation's informantion
200 """
201 return {
202 'Name': get_operation_name(operation_node),
203 'Arguments': [argument_node_to_dict(argument) for argument in get_argume nt_node(operation_node) if argument_node_to_dict(argument)],
204 'Type': get_operation_type(operation_node),
205 'ExtAttributes': [extattr_node_to_dict(extattr) for extattr in get_extat tribute_node(operation_node) if extattr_node_to_dict(extattr)],
206 'Static': operation_node.GetProperty('STATIC', default=False),
207 }
208
209
210 def get_inherit_node(interface_node):
Yuki 2015/09/30 04:24:21 By definition, there must be at most one parent in
Yuki 2015/10/05 04:33:43 Could you address this comment, too?
natsukoa 2015/10/05 08:59:04 I know there is no interface that have number of i
Yuki 2015/10/05 10:03:20 If you think so, then you should reject such wrong
211 if interface_node.GetListOf('Inherit'):
212 return interface_node.GetListOf('Inherit')
213 else:
214 return []
215
216
217 def inherit_node_to_dict(inherit):
218 return {'Name': inherit.GetName()}
219
220
221 def get_const_node(interface_node):
222 """Returns Constant object.
223 Args:
224 interface_node: interface node object
225 Returns:
226 list which is list of constant object
227 """
228 return interface_node.GetListOf('Const')
229
230
231 def get_const_type(const_node):
232 """Returns constant's type.
233 Args:
234 const_node: constant node object
235 Returns:
236 node.GetChildren()[0].GetName(): str, constant object's name
237 """
238 return const_node.GetChildren()[0].GetName()
239
240
241 def get_const_value(const_node):
242 """Returns constant's value.
243 Args:
244 const_node: constant node object
245 Returns:
246 node.GetChildren()[1].GetName(): list, list of oparation object
247 """
248 return const_node.GetChildren()[1].GetName()
249
250
251 def const_node_to_dict(const_node):
252 """Returns dictionary of constant object information.
253 Args:
254 const_nodes: list of interface node object which has constant
255 Returns:
256 a generator which yields dictionary of constant object information
257 """
258 return {
259 'Name': const_node.GetName(),
260 'Type': get_const_type(const_node),
261 'Value': get_const_value(const_node),
262 'ExtAttributes': [extattr_node_to_dict(extattr) for extattr in get_extat tribute_node(const_node) if extattr_node_to_dict(extattr)],
263 }
264
265
266 def interface_node_to_dict(interface_node):
267 """Returns dictioary whose key is interface name and value is interface dict ioary.
268 Args:
269 interface_node: interface node
270 Returns:
271 dictionary, {interface name: interface node dictionary}
272 """
273 return {
274 'Name': interface_node.GetName(),
275 'Attributes': [attribute_node_to_dict(attr) for attr in get_attribute_no de(interface_node) if attribute_node_to_dict(attr)],
276 'Operations': [operation_node_to_dict(operation) for operation in get_op eration_node(interface_node) if operation_node_to_dict(operation)],
277 'ExtAttributes': [extattr_node_to_dict(extattr) for extattr in get_extat tribute_node(interface_node) if extattr_node_to_dict(extattr)],
278 'Consts': [const_node_to_dict(const) for const in get_const_node(interfa ce_node)],
Yuki 2015/09/30 04:24:21 Please choose the order carefully. Why are they s
natsukoa 2015/10/05 01:47:11 I changed the order that 1. Constants 2. Attribu
279 'Inherit': [inherit_node_to_dict(inherit) for inherit in get_inherit_nod e(interface_node)],
280 'FilePath': get_filepath(interface_node),
281 }
282
283
284 def merge_dict(interface_dict, partial_dict):
bashi 2015/09/30 03:13:16 merge_dict -> merge_partial_dicts ? interface_dict
natsukoa 2015/10/05 01:47:11 Done.
285 """Returns interface information dictioary.
286 Args:
287 interface_dict: interface node dictionary
288 partial_dict: partial interface node dictionary
289 Returns:
290 a dictronary merged with interface_dict and partial_dict
291 """
292 for key in partial_dict.keys():
bashi 2015/09/30 03:13:16 key -> interface_name ?
natsukoa 2015/10/05 01:47:10 Done.
293 interface_dict[key]['Attributes'].extend(partial_dict[key]['Attributes'] ) if partial_dict[key]['Attributes'] != [] else None
bashi 2015/09/30 03:13:16 (1) What if |interface_dict| doesn't have |key|? D
natsukoa 2015/10/05 01:47:10 I didn't define any specific Consts, but I could m
294 interface_dict[key]['Operations'].extend(partial_dict[key]['Operations'] )if partial_dict[key]['Operations'] else None
295 interface_dict[key]['Consts'].extend(partial_dict[key]['Consts']) if par tial_dict[key]['Consts'] else None
296 interface_dict[key].setdefault('Partial_FilePaths', []).append(partial_d ict[key]['FilePath'])
297 return interface_dict
298
299
300 def merge_implement_nodes(interface_dict, implement_nodes):
301 for key in implement_nodes:
bashi 2015/09/30 03:13:15 See comment on merge_dict(). Almost the same can b
302 interface_dict[key.GetName()]['Attributes'].extend(interface_dict[key.Ge tProperty('REFERENCE')]['Attributes'])
303 interface_dict[key.GetName()]['Operations'].extend(interface_dict[key.Ge tProperty('REFERENCE')]['Operations'])
304 interface_dict[key.GetName()]['Consts'].extend(interface_dict[key.GetPro perty('REFERENCE')]['Consts'])
305 return interface_dict
306
307
308 def export_to_jsonfile(dictionary, json_file):
309 """Returns jsonfile which is dumped each interface information dictionary to json.
310 Args:
311 dictioary: interface dictionary
312 json_file: json file for output
313 Returns:
314 json file which is contained each interface node dictionary
315 """
316 with open(json_file, 'w') as f:
317 # TODO(natsukoa): Remove indent
318 json.dump(dictionary, f, sort_keys=True, indent=4)
319
320
321 def main(args):
322 path_file = args[0]
323 json_file = args[1]
324 file_to_list = utilities.read_file_to_list(path_file)
325 implement_nodes = [get_implements_node(definition) for definition in get_def initions(file_to_list) if get_implements_node(definition)]
bashi 2015/09/30 03:13:16 Could you format this (and below dicts) so that we
natsukoa 2015/10/05 01:47:11 I misunderstood 'predicate'. I fixed it.
326 interface_dict = {get_interface_node(definition).GetName(): interface_node_t o_dict(get_interface_node(definition)) for definition in filter_non_partial(get_ definitions(file_to_list)) if get_interface_node(definition)}
327 interface_dict = merge_implement_nodes(interface_dict, implement_nodes)
328 partial_dict = {get_interface_node(definition).GetName(): interface_node_to_ dict(get_interface_node(definition)) for definition in filter_partial(get_defini tions(file_to_list)) if get_interface_node(definition)}
329 dictionary = merge_dict(interface_dict, partial_dict)
330 export_to_jsonfile(dictionary, json_file)
331
332
333 if __name__ == '__main__':
334 main(sys.argv[1:])
OLDNEW
« no previous file with comments | « no previous file | third_party/WebKit/Source/bindings/scripts/interface_node_path.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698