Chromium Code Reviews| OLD | NEW |
|---|---|
| (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 | |
| 7 """ | |
| 8 | |
| 9 import os | |
| 10 import sys | |
| 11 import json | |
| 12 import utilities | |
| 13 | |
| 14 from blink_idl_parser import parse_file, BlinkIDLParser | |
| 15 | |
| 16 _class_name = 'Interface' | |
| 17 _partial = 'Partial' | |
| 18 | |
| 19 | |
| 20 def get_interfaces(path): | |
| 21 """Returns a generator which yields interface IDL nodes. | |
| 22 Args: | |
| 23 path_file: text file path | |
| 24 Returns: | |
| 25 a generator which yields interface node objects | |
| 26 """ | |
| 27 parser = BlinkIDLParser(debug=False) | |
| 28 for idl_path in path: | |
| 29 definitions = parse_file(parser, idl_path) | |
| 30 for definition in definitions.GetChildren(): | |
| 31 if definition.GetClass() == _class_name: | |
| 32 yield definition | |
| 33 | |
| 34 | |
| 35 def get_filepath(interface_node): | |
| 36 """Returns relative path to the IDL file in which the |interface_node| is de fined. | |
| 37 Args: | |
| 38 interface_node: IDL interface node | |
| 39 Returns: | |
| 40 str which is |interface_node| file path | |
| 41 """ | |
| 42 filename = interface_node.GetProperty('FILENAME') | |
| 43 return os.path.relpath(filename).strip('../chromium/src/third_party/WebKit') | |
| 44 | |
| 45 | |
| 46 def filter_partial(interface_node_list): | |
| 47 """Returns a generator which yields partial interface node. | |
| 48 Args: | |
| 49 interface_node_list: a generator which is interface IDL node | |
| 50 Return: | |
| 51 a generator which yields partial interface node | |
| 52 """ | |
| 53 for interface_node in interface_node_list: | |
| 54 if interface_node.GetProperty(_partial): | |
| 55 yield interface_node | |
| 56 | |
| 57 | |
| 58 def filter_non_partial(interface_node_list): | |
| 59 """Returns a generator which yields interface node. | |
| 60 Args: | |
| 61 interface_node_list: a generator which is interface IDL node | |
| 62 Returns: | |
| 63 a generator which yields interface node | |
| 64 """ | |
| 65 for interface_node in interface_node_list: | |
| 66 if not interface_node.GetProperty(_partial): | |
| 67 yield interface_node | |
| 68 | |
| 69 | |
| 70 def get_attributes(interface_node): | |
| 71 """Returns list of Attribute if the interface_node have one. | |
| 72 Args: | |
| 73 interface_node: interface node object | |
| 74 Returns: | |
| 75 a list of attribute | |
| 76 """ | |
| 77 return interface_node.GetListOf('Attribute') | |
| 78 | |
| 79 | |
| 80 def get_attribute_type(attribute): | |
| 81 """Returns type of attribute or operation's argument. | |
| 82 Args: | |
| 83 node: attribute node object | |
| 84 Returns: | |
| 85 str which is Attribute object type | |
| 86 """ | |
| 87 return attribute.GetOneOf('Type').GetChildren()[0].GetName() | |
| 88 | |
| 89 get_operation_type = get_attribute_type | |
| 90 get_argument_type = get_attribute_type | |
| 91 | |
| 92 | |
| 93 def get_extattributes(node): | |
| 94 """Returns a generator which yields list of ExtAttribute. | |
| 95 Args: | |
| 96 node which has ExtAttribute | |
| 97 Returns: | |
| 98 a generator which yields list of ExtAttribute | |
| 99 """ | |
| 100 extattributes = node.GetOneOf('ExtAttributes') | |
| 101 if extattributes: | |
| 102 for extattribute in extattributes.GetChildren(): | |
| 103 yield extattribute | |
| 104 | |
| 105 | |
| 106 def extattr_dict(extattribute): | |
|
Yuki
2015/09/17 05:45:06
extattr_to_dict
natsukoa
2015/09/17 07:34:59
Done.
| |
| 107 """Returns a generator which yields Extattribute's object dictionary | |
| 108 Args: | |
| 109 node: interface, attribute or operation node which has extattribute | |
| 110 Returns: | |
| 111 a generator which yields extattribute dictionary | |
| 112 """ | |
| 113 for extattr_node in extattribute: | |
| 114 yield { | |
| 115 'Name': extattr_node.GetName(), | |
| 116 } | |
| 117 | |
| 118 | |
| 119 def attributes_dict(attribute_list): | |
| 120 """Returns a generator which yields dictioary of Extattribute object informa tion. | |
| 121 Args: | |
| 122 interface_node: interface node object | |
| 123 Returns: | |
| 124 a generator which yields dictionary of attribite information | |
| 125 """ | |
| 126 for attribute in attribute_list: | |
| 127 yield { | |
| 128 'Name': attribute.GetName(), | |
| 129 'Type': get_attribute_type(attribute), | |
| 130 'ExtAttributes': [extattr for extattr in extattr_dict(get_extattribu tes(attribute))], | |
|
Yuki
2015/09/17 05:45:06
list(extattr_dict(...))
natsukoa
2015/09/17 07:34:59
Done.
| |
| 131 'Readonly': attribute.GetProperty('READONLY', default=False), | |
| 132 'Static': attribute.GetProperty('STATIC', default=False), | |
| 133 } | |
| 134 | |
| 135 | |
| 136 def get_operations(interface_node): | |
| 137 """Returns list of Operations object under the interface_node. | |
| 138 Args: | |
| 139 interface_node: interface node object | |
| 140 Returns: | |
| 141 list which is list of oparation object | |
| 142 """ | |
| 143 return interface_node.GetListOf('Operation') | |
| 144 | |
| 145 | |
| 146 def get_arguments(operation): | |
| 147 """Returns list of Arguments object under the operation object. | |
| 148 Args: | |
| 149 operation: interface node object | |
| 150 Returns: | |
| 151 list which is list of argument object | |
| 152 """ | |
| 153 argument_node = operation.GetOneOf('Arguments') | |
| 154 return argument_node.GetListOf('Argument') | |
| 155 | |
| 156 | |
| 157 def argument_dict(argument): | |
| 158 """Returns generator which yields dictionary of Argument object information. | |
| 159 Args: | |
| 160 argument: interface node object | |
| 161 Returns: | |
| 162 a generator which yields dictionary of argument information | |
| 163 """ | |
| 164 for arg_name in argument: | |
| 165 yield { | |
| 166 'Name': arg_name.GetName(), | |
| 167 'Type': get_argument_type(arg_name), | |
| 168 } | |
| 169 | |
| 170 | |
| 171 def get_operation_name(operation): | |
| 172 """Returns openration object name. | |
| 173 Args: | |
| 174 operation: operation object in interface node object | |
| 175 Returns: | |
| 176 str which is operation's name | |
| 177 """ | |
| 178 if operation.GetProperty('GETTER'): | |
| 179 return '__getter__' | |
| 180 elif operation.GetProperty('SETTER'): | |
| 181 return '__setter__' | |
| 182 elif operation.GetProperty('DELETER'): | |
| 183 return '__deleter__' | |
| 184 else: | |
| 185 return operation.GetName() | |
| 186 | |
| 187 | |
| 188 def operation_dict(operations): | |
| 189 """Returns a generator which yields dictionary of Operation object informati on. | |
| 190 Args: | |
| 191 interface_node: interface node object | |
| 192 Returns: | |
| 193 a generator which yields dictionary of operation's informantion | |
| 194 """ | |
| 195 for operation in operations: | |
| 196 yield { | |
| 197 'Name': get_operation_name(operation), | |
| 198 'Arguments': [args for args in argument_dict(get_arguments(operation ))], | |
| 199 'Type': get_operation_type(operation), | |
| 200 'ExtAttributes': [extattr for extattr in extattr_dict(get_extattribu tes(operation))], | |
| 201 'Static': operation.GetProperty('STATIC', default=False), | |
| 202 } | |
| 203 | |
| 204 | |
| 205 def get_inherit(interface_node): | |
|
Yuki
2015/09/17 05:45:06
Let's remove get_inherit and inherit_dict for the
natsukoa
2015/09/17 07:34:59
Done.
| |
| 206 return interface_node.GetOneOf('Inherit') | |
| 207 | |
| 208 | |
| 209 def inherit_dict(inherit): | |
| 210 if inherit is None: | |
| 211 return [] | |
| 212 else: | |
| 213 return {'Name': inherit.GetName()} | |
| 214 | |
| 215 | |
| 216 def get_consts(interface_node): | |
| 217 """Returns list of Constant object. | |
| 218 Args: | |
| 219 interface_node: interface node object | |
| 220 Returns: | |
| 221 list which is list of constant object | |
| 222 """ | |
| 223 return interface_node.GetListOf('Const') | |
| 224 | |
| 225 | |
| 226 def get_const_type(node): | |
| 227 """Returns constant's type. | |
| 228 Args: | |
| 229 node: interface node's attribute or operation object | |
| 230 Returns: | |
| 231 node.GetChildren()[0].GetName(): str, constant object's name | |
| 232 """ | |
| 233 return node.GetChildren()[0].GetName() | |
| 234 | |
| 235 | |
| 236 def get_const_value(node): | |
| 237 """Returns constant's value. | |
| 238 Args: | |
| 239 node: interface node's attribute or operation object | |
| 240 Returns: | |
| 241 node.GetChildren()[1].GetName(): list, list of oparation object | |
| 242 """ | |
| 243 return node.GetChildren()[1].GetName() | |
| 244 | |
| 245 | |
| 246 def const_dict(consts): | |
| 247 """Returns generator which yields dictionary of constant object information. | |
| 248 Args: | |
| 249 interface_node: interface node object | |
| 250 Returns: | |
| 251 a generator which yields dictionary of constant object information | |
| 252 """ | |
| 253 for const in consts: | |
| 254 yield { | |
| 255 'Name': const.GetName(), | |
| 256 'Type': get_const_type(const), | |
| 257 'Value': get_const_value(const), | |
| 258 'ExtAttributes': [extattr for extattr in extattr_dict(get_extattribu tes(const))], | |
| 259 } | |
| 260 | |
| 261 | |
| 262 def get_name(interface_node): | |
|
Yuki
2015/09/17 05:45:06
get_name(my_interface)
is not shorter or simpler
natsukoa
2015/09/17 07:34:59
Actually, I don't need it. I just removed it.
| |
| 263 return interface_node.GetName() | |
| 264 | |
| 265 | |
| 266 def get_dict(interface_node): | |
|
Yuki
2015/09/17 05:45:06
interface_to_dict
natsukoa
2015/09/17 07:34:59
Done.
| |
| 267 """Returns dictioary whose key is interface name and value is interface dict ioary. | |
| 268 Args: | |
| 269 dictirary_list: list, list of interface node dictionary | |
| 270 Returns: | |
| 271 dictionary, {interface_node name: interface node dictionary} | |
| 272 """ | |
| 273 | |
| 274 return { | |
| 275 'Attributes': [attr for attr in attributes_dict(get_attributes(interface _node))], | |
| 276 'Operations': [operation for operation in operation_dict(get_operations( interface_node))], | |
| 277 'ExtAttributes': [extattr for extattr in extattr_dict(get_extattributes( interface_node))], | |
| 278 'Consts': [const for const in const_dict(get_consts(interface_node))], | |
| 279 'Inherit': inherit_dict(get_inherit(interface_node)), | |
| 280 'FilePath': get_filepath(interface_node), | |
| 281 } | |
| 282 | |
| 283 | |
| 284 def merge_dict(interface_dict, partial_dict): | |
| 285 """Returns list of interface_node information dictioary. | |
| 286 Args: | |
| 287 interface_dict: interface node dictionary | |
| 288 partial_dict: partial interface node dictionary | |
| 289 Returns: | |
| 290 list which is list of interface node's dictionry merged with partial inter face node | |
| 291 """ | |
| 292 for key in partial_dict.keys(): | |
| 293 if key in interface_dict: | |
| 294 interface_dict[key]['Attributes'].append(partial_dict[key]['Attribut es']) | |
| 295 interface_dict[key]['Operations'].append(partial_dict[key]['Operatio ns']) | |
| 296 interface_dict[key]['Consts'].append(partial_dict[key]['Consts']) | |
| 297 interface_dict[key].setdefault('Partial_FilePaths', []).append(parti al_dict[key]['FilePath']) | |
| 298 return interface_dict | |
| 299 | |
| 300 | |
| 301 # TODO(natsukoa): Supports a command line flag to indent the json | |
| 302 def export_to_jsonfile(dictionary, json_file): | |
| 303 """Returns jsonfile which is dumped each interface_node information dictiona ry to json. | |
| 304 Args: | |
| 305 dictioary: dict, output of format_dictinatry | |
| 306 json_file: json file for output | |
| 307 Returns: | |
| 308 json file which is contained each interface node dictionary | |
| 309 """ | |
| 310 with open(json_file, 'w') as f: | |
| 311 json.dump(dictionary, f, sort_keys=True) | |
| 312 | |
| 313 | |
| 314 def main(args): | |
| 315 path_file = args[0] | |
| 316 json_file = args[1] | |
| 317 file_to_list = utilities.read_file_to_list(path_file) | |
| 318 interface_dict = {get_name(interface_node): get_dict(interface_node) for int erface_node in filter_non_partial(get_interfaces(file_to_list))} | |
| 319 partial_dict = {get_name(interface_node): get_dict(interface_node) for inter face_node in filter_partial(get_interfaces(file_to_list))} | |
| 320 dictionary = merge_dict(interface_dict, partial_dict) | |
| 321 export_to_jsonfile(dictionary, json_file) | |
| 322 | |
| 323 | |
| 324 if __name__ == '__main__': | |
| 325 main(sys.argv[1:]) | |
| OLD | NEW |