OLD | NEW |
1 # Copyright (C) 2013 Google Inc. All rights reserved. | 1 # Copyright (C) 2013 Google Inc. All rights reserved. |
2 # | 2 # |
3 # Redistribution and use in source and binary forms, with or without | 3 # Redistribution and use in source and binary forms, with or without |
4 # modification, are permitted provided that the following conditions are | 4 # modification, are permitted provided that the following conditions are |
5 # met: | 5 # met: |
6 # | 6 # |
7 # * Redistributions of source code must retain the above copyright | 7 # * Redistributions of source code must retain the above copyright |
8 # notice, this list of conditions and the following disclaimer. | 8 # notice, this list of conditions and the following disclaimer. |
9 # * Redistributions in binary form must reproduce the above | 9 # * Redistributions in binary form must reproduce the above |
10 # copyright notice, this list of conditions and the following disclaimer | 10 # copyright notice, this list of conditions and the following disclaimer |
(...skipping 29 matching lines...) Expand all Loading... |
40 | 40 |
41 IdlDefinitions | 41 IdlDefinitions |
42 IdlCallbackFunction < TypedObject | 42 IdlCallbackFunction < TypedObject |
43 IdlEnum :: FIXME: remove, just use a dict for enums | 43 IdlEnum :: FIXME: remove, just use a dict for enums |
44 IdlInterface | 44 IdlInterface |
45 IdlAttribute < TypedObject | 45 IdlAttribute < TypedObject |
46 IdlConstant < TypedObject | 46 IdlConstant < TypedObject |
47 IdlLiteral | 47 IdlLiteral |
48 IdlOperation < TypedObject | 48 IdlOperation < TypedObject |
49 IdlArgument < TypedObject | 49 IdlArgument < TypedObject |
| 50 IdlSerializer |
50 IdlStringifier | 51 IdlStringifier |
51 IdlIterable < IdlIterableOrMaplikeOrSetlike | 52 IdlIterable < IdlIterableOrMaplikeOrSetlike |
52 IdlMaplike < IdlIterableOrMaplikeOrSetlike | 53 IdlMaplike < IdlIterableOrMaplikeOrSetlike |
53 IdlSetlike < IdlIterableOrMaplikeOrSetlike | 54 IdlSetlike < IdlIterableOrMaplikeOrSetlike |
54 IdlException < IdlInterface | 55 IdlException < IdlInterface |
55 (same contents as IdlInterface) | 56 (same contents as IdlInterface) |
56 | 57 |
57 TypedObject :: Object with one or more attributes that is a type. | 58 TypedObject :: Object with one or more attributes that is a type. |
58 | 59 |
59 IdlArgument is 'picklable', as it is stored in interfaces_info. | 60 IdlArgument is 'picklable', as it is stored in interfaces_info. |
(...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
258 | 259 |
259 class IdlInterface(object): | 260 class IdlInterface(object): |
260 def __init__(self, idl_name, node=None): | 261 def __init__(self, idl_name, node=None): |
261 self.attributes = [] | 262 self.attributes = [] |
262 self.constants = [] | 263 self.constants = [] |
263 self.constructors = [] | 264 self.constructors = [] |
264 self.custom_constructors = [] | 265 self.custom_constructors = [] |
265 self.extended_attributes = {} | 266 self.extended_attributes = {} |
266 self.operations = [] | 267 self.operations = [] |
267 self.parent = None | 268 self.parent = None |
| 269 self.serializer = None |
268 self.stringifier = None | 270 self.stringifier = None |
269 self.iterable = None | 271 self.iterable = None |
270 self.maplike = None | 272 self.maplike = None |
271 self.setlike = None | 273 self.setlike = None |
272 self.original_interface = None | 274 self.original_interface = None |
273 self.partial_interfaces = [] | 275 self.partial_interfaces = [] |
274 if not node: # Early exit for IdlException.__init__ | 276 if not node: # Early exit for IdlException.__init__ |
275 return | 277 return |
276 | 278 |
277 self.is_callback = bool(node.GetProperty('CALLBACK')) | 279 self.is_callback = bool(node.GetProperty('CALLBACK')) |
(...skipping 14 matching lines...) Expand all Loading... |
292 elif child_class == 'ExtAttributes': | 294 elif child_class == 'ExtAttributes': |
293 extended_attributes = ext_attributes_node_to_extended_attributes
(idl_name, child) | 295 extended_attributes = ext_attributes_node_to_extended_attributes
(idl_name, child) |
294 self.constructors, self.custom_constructors = ( | 296 self.constructors, self.custom_constructors = ( |
295 extended_attributes_to_constructors(idl_name, extended_attri
butes)) | 297 extended_attributes_to_constructors(idl_name, extended_attri
butes)) |
296 clear_constructor_attributes(extended_attributes) | 298 clear_constructor_attributes(extended_attributes) |
297 self.extended_attributes = extended_attributes | 299 self.extended_attributes = extended_attributes |
298 elif child_class == 'Operation': | 300 elif child_class == 'Operation': |
299 self.operations.append(IdlOperation(idl_name, child)) | 301 self.operations.append(IdlOperation(idl_name, child)) |
300 elif child_class == 'Inherit': | 302 elif child_class == 'Inherit': |
301 self.parent = child.GetName() | 303 self.parent = child.GetName() |
| 304 elif child_class == 'Serializer': |
| 305 self.serializer = IdlSerializer(idl_name, child) |
| 306 self.process_serializer() |
302 elif child_class == 'Stringifier': | 307 elif child_class == 'Stringifier': |
303 self.stringifier = IdlStringifier(idl_name, child) | 308 self.stringifier = IdlStringifier(idl_name, child) |
304 self.process_stringifier() | 309 self.process_stringifier() |
305 elif child_class == 'Iterable': | 310 elif child_class == 'Iterable': |
306 self.iterable = IdlIterable(idl_name, child) | 311 self.iterable = IdlIterable(idl_name, child) |
307 elif child_class == 'Maplike': | 312 elif child_class == 'Maplike': |
308 self.maplike = IdlMaplike(idl_name, child) | 313 self.maplike = IdlMaplike(idl_name, child) |
309 elif child_class == 'Setlike': | 314 elif child_class == 'Setlike': |
310 self.setlike = IdlSetlike(idl_name, child) | 315 self.setlike = IdlSetlike(idl_name, child) |
311 else: | 316 else: |
(...skipping 14 matching lines...) Expand all Loading... |
326 custom_constructor.accept(visitor) | 331 custom_constructor.accept(visitor) |
327 for operation in self.operations: | 332 for operation in self.operations: |
328 operation.accept(visitor) | 333 operation.accept(visitor) |
329 if self.iterable: | 334 if self.iterable: |
330 self.iterable.accept(visitor) | 335 self.iterable.accept(visitor) |
331 elif self.maplike: | 336 elif self.maplike: |
332 self.maplike.accept(visitor) | 337 self.maplike.accept(visitor) |
333 elif self.setlike: | 338 elif self.setlike: |
334 self.setlike.accept(visitor) | 339 self.setlike.accept(visitor) |
335 | 340 |
| 341 def process_serializer(self): |
| 342 """Add the serializer's named operation child, if it has one, as a regul
ar |
| 343 operation of this interface.""" |
| 344 if self.serializer.operation: |
| 345 self.operations.append(self.serializer.operation) |
| 346 |
336 def process_stringifier(self): | 347 def process_stringifier(self): |
337 """Add the stringifier's attribute or named operation child, if it has | 348 """Add the stringifier's attribute or named operation child, if it has |
338 one, as a regular attribute/operation of this interface.""" | 349 one, as a regular attribute/operation of this interface.""" |
339 if self.stringifier.attribute: | 350 if self.stringifier.attribute: |
340 self.attributes.append(self.stringifier.attribute) | 351 self.attributes.append(self.stringifier.attribute) |
341 elif self.stringifier.operation: | 352 elif self.stringifier.operation: |
342 self.operations.append(self.stringifier.operation) | 353 self.operations.append(self.stringifier.operation) |
343 | 354 |
344 def merge(self, other): | 355 def merge(self, other): |
345 """Merge in another interface's members (e.g., partial interface)""" | 356 """Merge in another interface's members (e.g., partial interface)""" |
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
499 if idl_type == 'NULL': | 510 if idl_type == 'NULL': |
500 return IdlLiteralNull() | 511 return IdlLiteralNull() |
501 raise ValueError('Unrecognized default value type: %s' % idl_type) | 512 raise ValueError('Unrecognized default value type: %s' % idl_type) |
502 | 513 |
503 | 514 |
504 ################################################################################ | 515 ################################################################################ |
505 # Operations | 516 # Operations |
506 ################################################################################ | 517 ################################################################################ |
507 | 518 |
508 class IdlOperation(TypedObject): | 519 class IdlOperation(TypedObject): |
| 520 def __str__(self): |
| 521 return "%s %s(%s)" % (self.idl_type, self.name, ", ".join(str(a) for a i
n self.arguments)) |
| 522 |
509 def __init__(self, idl_name, node=None): | 523 def __init__(self, idl_name, node=None): |
510 self.arguments = [] | 524 self.arguments = [] |
511 self.extended_attributes = {} | 525 self.extended_attributes = {} |
512 self.specials = [] | 526 self.specials = [] |
513 self.is_constructor = False | 527 self.is_constructor = False |
514 self.idl_name = idl_name | 528 self.idl_name = idl_name |
515 self.idl_type = None | 529 self.idl_type = None |
516 self.is_static = False | 530 self.is_static = False |
517 | 531 |
518 if not node: | 532 if not node: |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
574 visitor.visit_operation(self) | 588 visitor.visit_operation(self) |
575 for argument in self.arguments: | 589 for argument in self.arguments: |
576 argument.accept(visitor) | 590 argument.accept(visitor) |
577 | 591 |
578 | 592 |
579 ################################################################################ | 593 ################################################################################ |
580 # Arguments | 594 # Arguments |
581 ################################################################################ | 595 ################################################################################ |
582 | 596 |
583 class IdlArgument(TypedObject): | 597 class IdlArgument(TypedObject): |
| 598 def __str__(self): |
| 599 return "%s %s" % (self.idl_type, self.name) |
| 600 |
584 def __init__(self, idl_name, node=None): | 601 def __init__(self, idl_name, node=None): |
585 self.extended_attributes = {} | 602 self.extended_attributes = {} |
586 self.idl_type = None | 603 self.idl_type = None |
587 self.is_optional = False # syntax: (optional T) | 604 self.is_optional = False # syntax: (optional T) |
588 self.is_variadic = False # syntax: (T...) | 605 self.is_variadic = False # syntax: (T...) |
589 self.idl_name = idl_name | 606 self.idl_name = idl_name |
590 self.default_value = None | 607 self.default_value = None |
591 | 608 |
592 if not node: | 609 if not node: |
593 return | 610 return |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
629 # have None instead of an arguments node, but have the same meaning as using | 646 # have None instead of an arguments node, but have the same meaning as using |
630 # an empty argument list, [Constructor()], so special-case this. | 647 # an empty argument list, [Constructor()], so special-case this. |
631 # http://www.w3.org/TR/WebIDL/#Constructor | 648 # http://www.w3.org/TR/WebIDL/#Constructor |
632 if node is None: | 649 if node is None: |
633 return [] | 650 return [] |
634 return [IdlArgument(idl_name, argument_node) | 651 return [IdlArgument(idl_name, argument_node) |
635 for argument_node in node.GetChildren()] | 652 for argument_node in node.GetChildren()] |
636 | 653 |
637 | 654 |
638 ################################################################################ | 655 ################################################################################ |
| 656 # Serializers |
| 657 ################################################################################ |
| 658 |
| 659 class IdlSerializer(object): |
| 660 def __init__(self, idl_name, node): |
| 661 self.attribute_name = node.GetProperty('ATTRIBUTE') |
| 662 self.attribute_names = None |
| 663 self.operation = None |
| 664 self.extended_attributes = {} |
| 665 self.is_attribute = False |
| 666 self.is_getter = False |
| 667 self.is_inherit = False |
| 668 self.is_list = False |
| 669 self.is_map = False |
| 670 self.idl_name = idl_name |
| 671 |
| 672 for child in node.GetChildren(): |
| 673 child_class = child.GetClass() |
| 674 if child_class == 'Operation': |
| 675 self.operation = IdlOperation(idl_name, child) |
| 676 elif child_class == 'List': |
| 677 self.is_list = True |
| 678 self.is_getter = bool(child.GetProperty('GETTER')) |
| 679 self.attributes = child.GetProperty('ATTRIBUTES') |
| 680 elif child_class == 'Map': |
| 681 self.is_map = True |
| 682 self.is_attribute = bool(child.GetProperty('ATTRIBUTE')) |
| 683 self.is_getter = bool(child.GetProperty('GETTER')) |
| 684 self.is_inherit = bool(child.GetProperty('INHERIT')) |
| 685 self.attributes = child.GetProperty('ATTRIBUTES') |
| 686 elif child_class == 'ExtAttributes': |
| 687 self.extended_attributes = ext_attributes_node_to_extended_attri
butes(idl_name, child) |
| 688 else: |
| 689 raise ValueError('Unrecognized node class: %s' % child_class) |
| 690 |
| 691 |
| 692 ################################################################################ |
639 # Stringifiers | 693 # Stringifiers |
640 ################################################################################ | 694 ################################################################################ |
641 | 695 |
642 class IdlStringifier(object): | 696 class IdlStringifier(object): |
643 def __init__(self, idl_name, node): | 697 def __init__(self, idl_name, node): |
644 self.attribute = None | 698 self.attribute = None |
645 self.operation = None | 699 self.operation = None |
646 self.extended_attributes = {} | 700 self.extended_attributes = {} |
647 self.idl_name = idl_name | 701 self.idl_name = idl_name |
648 | 702 |
(...skipping 364 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1013 self.visit_typed_object(argument) | 1067 self.visit_typed_object(argument) |
1014 | 1068 |
1015 def visit_iterable(self, iterable): | 1069 def visit_iterable(self, iterable): |
1016 self.visit_typed_object(iterable) | 1070 self.visit_typed_object(iterable) |
1017 | 1071 |
1018 def visit_maplike(self, maplike): | 1072 def visit_maplike(self, maplike): |
1019 self.visit_typed_object(maplike) | 1073 self.visit_typed_object(maplike) |
1020 | 1074 |
1021 def visit_setlike(self, setlike): | 1075 def visit_setlike(self, setlike): |
1022 self.visit_typed_object(setlike) | 1076 self.visit_typed_object(setlike) |
OLD | NEW |