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

Side by Side Diff: tools/dom/scripts/idlnode.py

Issue 2875773003: Roll 50: Updated for push to origin/master. (Closed)
Patch Set: Roll 50: Updated to latest Created 3 years, 7 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
OLDNEW
1 #!/usr/bin/python 1 #!/usr/bin/python
2 # Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file 2 # Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file
3 # for details. All rights reserved. Use of this source code is governed by a 3 # for details. All rights reserved. Use of this source code is governed by a
4 # BSD-style license that can be found in the LICENSE file. 4 # BSD-style license that can be found in the LICENSE file.
5 5
6 import os 6 import os
7 import sys 7 import sys
8 8
9 import idl_definitions 9 import idl_definitions
10 from idl_types import IdlType, IdlNullableType, IdlUnionType, IdlArrayOrSequence Type 10 from idl_types import IdlType, IdlNullableType, IdlUnionType, IdlArrayOrSequence Type
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
51 '__delete__': "Deleter", 51 '__delete__': "Deleter",
52 } 52 }
53 53
54 class IDLNode(object): 54 class IDLNode(object):
55 """Base class for all IDL elements. 55 """Base class for all IDL elements.
56 IDLNode may contain various child nodes, and have properties. Examples 56 IDLNode may contain various child nodes, and have properties. Examples
57 of IDLNode are interfaces, interface members, function arguments, 57 of IDLNode are interfaces, interface members, function arguments,
58 etc. 58 etc.
59 """ 59 """
60 60
61 def __init__(self, ast): 61 def __init__(self, ast, id=None):
62 """Initializes an IDLNode from a PegParser AST output.""" 62 """Initializes an IDLNode from a PegParser AST output."""
63 self.id = self._find_first(ast, 'Id') if ast is not None else None 63 if ast:
64 64 self.id = self._find_first(ast, 'Id') if ast is not None else None
65 else:
66 # Support synthesized IDLNode created w/o an AST (e.g., setlike support).
67 self.id = id
65 68
66 def __repr__(self): 69 def __repr__(self):
67 """Generates string of the form <class id extra extra ... 0x12345678>.""" 70 """Generates string of the form <class id extra extra ... 0x12345678>."""
68 extras = self._extra_repr() 71 extras = self._extra_repr()
69 if isinstance(extras, list): 72 if isinstance(extras, list):
70 extras = ' '.join([str(e) for e in extras]) 73 extras = ' '.join([str(e) for e in extras])
71 try: 74 try:
72 if self.id: 75 if self.id:
73 return '<%s %s 0x%x>' % ( 76 return '<%s %s 0x%x>' % (
74 type(self).__name__, 77 type(self).__name__,
(...skipping 488 matching lines...) Expand 10 before | Expand all | Expand 10 after
563 self.arguments = [] 566 self.arguments = []
564 for argument in arg_list_ast: 567 for argument in arg_list_ast:
565 self.arguments.append(IDLArgument(argument)) 568 self.arguments.append(IDLArgument(argument))
566 else: 569 else:
567 self.arguments = self._convert_all(arg_list_ast, 'Argument', IDLArgument) 570 self.arguments = self._convert_all(arg_list_ast, 'Argument', IDLArgument)
568 571
569 572
570 class IDLType(IDLNode): 573 class IDLType(IDLNode):
571 """IDLType is used to describe constants, attributes and operations' 574 """IDLType is used to describe constants, attributes and operations'
572 return and input types. IDLType matches AST labels such as ScopedName, 575 return and input types. IDLType matches AST labels such as ScopedName,
573 StringType, VoidType, IntegerType, etc.""" 576 StringType, VoidType, IntegerType, etc.
577 NOTE: AST of None implies synthesize IDLType the id is passed in used by
578 setlike."""
574 579
575 def __init__(self, ast): 580 def __init__(self, ast, id=None):
576 global _unions_to_any 581 global _unions_to_any
577 582
578 IDLNode.__init__(self, ast) 583 IDLNode.__init__(self, ast, id)
579 584
580 if ast: 585 if not ast:
581 self.nullable = self._has(ast, 'Nullable') 586 # Support synthesized IDLType with no AST (e.g., setlike support).
582 # Search for a 'ScopedName' or any label ending with 'Type'. 587 return
583 if isinstance(ast, list): 588
584 self.id = self._find_first(ast, 'ScopedName') 589 self.nullable = self._has(ast, 'Nullable')
585 if not self.id: 590 # Search for a 'ScopedName' or any label ending with 'Type'.
586 # FIXME: use regexp search instead 591 if isinstance(ast, list):
587 def findType(ast): 592 self.id = self._find_first(ast, 'ScopedName')
588 for label, childAst in ast: 593 if not self.id:
589 if label.endswith('Type'): 594 # FIXME: use regexp search instead
590 type = self._label_to_type(label, ast) 595 def findType(ast):
591 if type != 'sequence': 596 for label, childAst in ast:
592 return type 597 if label.endswith('Type'):
593 type_ast = self._find_first(childAst, 'Type') 598 type = self._label_to_type(label, ast)
594 if not type_ast: 599 if type != 'sequence':
595 return type 600 return type
596 return 'sequence<%s>' % findType(type_ast) 601 type_ast = self._find_first(childAst, 'Type')
597 raise Exception('No type declaration found in %s' % ast) 602 if not type_ast:
598 self.id = findType(ast) 603 return type
599 # TODO(terry): Remove array_modifiers id has [] appended, keep for old 604 return 'sequence<%s>' % findType(type_ast)
600 # parsing. 605 raise Exception('No type declaration found in %s' % ast)
601 array_modifiers = self._find_first(ast, 'ArrayModifiers') 606 self.id = findType(ast)
602 if array_modifiers: 607 # TODO(terry): Remove array_modifiers id has [] appended, keep for old
603 self.id += array_modifiers 608 # parsing.
604 elif isinstance(ast, tuple): 609 array_modifiers = self._find_first(ast, 'ArrayModifiers')
605 (label, value) = ast 610 if array_modifiers:
606 if label == 'ScopedName': 611 self.id += array_modifiers
607 self.id = value 612 elif isinstance(ast, tuple):
613 (label, value) = ast
614 if label == 'ScopedName':
615 self.id = value
616 else:
617 self.id = self._label_to_type(label, ast)
618 elif isinstance(ast, str):
619 self.id = ast
620 # New blink handling.
621 elif ast.__module__ == "idl_types":
622 if isinstance(ast, IdlType) or isinstance(ast, IdlArrayOrSequenceType) or \
623 isinstance(ast, IdlNullableType):
624 if isinstance(ast, IdlNullableType) and ast.inner_type.is_union_type:
625 # Report of union types mapped to any.
626 if not(self.id in _unions_to_any):
627 _unions_to_any.append(self.id)
628 # TODO(terry): For union types use any otherwise type is unionType is
629 # not found and is removed during merging.
630 self.id = 'any'
608 else: 631 else:
609 self.id = self._label_to_type(label, ast) 632 type_name = str(ast)
610 elif isinstance(ast, str): 633 # TODO(terry): For now don't handle unrestricted types see
611 self.id = ast 634 # https://code.google.com/p/chromium/issues/detail?id=354 298
612 # New blink handling. 635 type_name = type_name.replace('unrestricted ', '', 1);
613 elif ast.__module__ == "idl_types": 636
614 if isinstance(ast, IdlType) or isinstance(ast, IdlArrayOrSequenceType) o r \ 637 # TODO(terry): Handled USVString as a DOMString.
615 isinstance(ast, IdlNullableType): 638 type_name = type_name.replace('USVString', 'DOMString', 1)
616 if isinstance(ast, IdlNullableType) and ast.inner_type.is_union_type: 639
617 # Report of union types mapped to any. 640 # TODO(terry); WindowTimers setInterval/setTimeout overloads with a
618 if not(self.id in _unions_to_any): 641 # Function type - map to any until the IDL uses union.
619 _unions_to_any.append(self.id) 642 type_name = type_name.replace('Function', 'any', 1)
620 # TODO(terry): For union types use any otherwise type is unionType i s 643
621 # not found and is removed during merging. 644 self.id = type_name
622 self.id = 'any' 645 else:
623 else: 646 # IdlUnionType
624 type_name = str(ast) 647 if ast.is_union_type:
625 # TODO(terry): For now don't handle unrestricted types see 648 if not(self.id in _unions_to_any):
626 # https://code.google.com/p/chromium/issues/detail?id=3 54298 649 _unions_to_any.append(self.id)
627 type_name = type_name.replace('unrestricted ', '', 1); 650 # TODO(terry): For union types use any otherwise type is unionType is
628 651 # not found and is removed during merging.
629 # TODO(terry): Handled USVString as a DOMString. 652 self.id = 'any'
630 type_name = type_name.replace('USVString', 'DOMString', 1) 653 # TODO(terry): Any union type e.g. 'type1 or type2 or type2',
631 654 # 'typedef (Type1 or Type2) UnionType'
632 # TODO(terry); WindowTimers setInterval/setTimeout overloads with a 655 # Is a problem we need to extend IDLType and IDLTypeDef to handle more
633 # Function type - map to any until the IDL uses union. 656 # than one type.
634 type_name = type_name.replace('Function', 'any', 1) 657 #
635 658 # Also for typedef's e.g.,
636 self.id = type_name 659 # typedef (Type1 or Type2) UnionType
637 else: 660 # should consider synthesizing a new interface (e.g., UnionType) that' s
638 # IdlUnionType 661 # both Type1 and Type2.
639 if ast.is_union_type: 662 if not self.id:
640 if not(self.id in _unions_to_any): 663 print '>>>> __module__ %s' % ast.__module__
641 _unions_to_any.append(self.id) 664 raise SyntaxError('Could not parse type %s' % (ast))
642 # TODO(terry): For union types use any otherwise type is unionType i s
643 # not found and is removed during merging.
644 self.id = 'any'
645 # TODO(terry): Any union type e.g. 'type1 or type2 or type2',
646 # 'typedef (Type1 or Type2) UnionType'
647 # Is a problem we need to extend IDLType and IDLTypeDef to handle mo re
648 # than one type.
649 #
650 # Also for typedef's e.g.,
651 # typedef (Type1 or Type2) UnionType
652 # should consider synthesizing a new interface (e.g., UnionType) tha t's
653 # both Type1 and Type2.
654 if not self.id:
655 print '>>>> __module__ %s' % ast.__module__
656 raise SyntaxError('Could not parse type %s' % (ast))
657 665
658 def _label_to_type(self, label, ast): 666 def _label_to_type(self, label, ast):
659 if label == 'LongLongType': 667 if label == 'LongLongType':
660 label = 'long long' 668 label = 'long long'
661 elif label.endswith('Type'): 669 elif label.endswith('Type'):
662 # Omit 'Type' suffix and lowercase the rest. 670 # Omit 'Type' suffix and lowercase the rest.
663 label = '%s%s' % (label[0].lower(), label[1:-4]) 671 label = '%s%s' % (label[0].lower(), label[1:-4])
664 672
665 # Add unsigned qualifier. 673 # Add unsigned qualifier.
666 if self._has(ast, 'Unsigned'): 674 if self._has(ast, 'Unsigned'):
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
710 def __init__(self, ast=None, js_name=None): 718 def __init__(self, ast=None, js_name=None):
711 IDLDictNode.__init__(self, ast) 719 IDLDictNode.__init__(self, ast)
712 self.id = None 720 self.id = None
713 if not ast: 721 if not ast:
714 return 722 return
715 for member in self._find_all(ast, 'Member'): 723 for member in self._find_all(ast, 'Member'):
716 name = self._find_first(member, 'Id') 724 name = self._find_first(member, 'Id')
717 value = IDLDictionaryMember(member, js_name) 725 value = IDLDictionaryMember(member, js_name)
718 self[name] = value 726 self[name] = value
719 727
728 def generate_operation(interface_name, result_type_name, oper_name, arguments):
729 """ Synthesize an IDLOperation with no AST used for support of setlike."""
730 """ Arguments is a list of argument where each argument is:
731 [IDLType, argument_name, optional_boolean] """
732
733 syn_op = IDLOperation(None, interface_name, oper_name)
734
735 syn_op.type = IDLType(None, result_type_name)
736 syn_op.type = resolveTypedef(syn_op.type)
737
738 for argument in arguments:
739 arg = IDLArgument(None, argument[1]);
740 arg.type = argument[0];
741 arg.optional = argument[2] if len(argument) > 2 else False
742 syn_op.arguments.append(arg)
743
744 return syn_op
745
746 def generate_setLike_operations_properties(interface, set_like):
747 """
748 Need to create (in our database) a number of operations. This is a new IDL
749 syntax, the implied operations for a set now use setlike<T> where T is a known
750 type e.g., setlike<FontFace> setlike implies these operations are generated:
751
752 void forEach(any callback, optional any thisArg);
753 boolean has(FontFace fontFace);
754 boolean has(FontFace fontFace);
755
756 if setlike is not read-only these operations are generated:
757
758 FontFaceSet add(FontFace value);
759 boolean delete(FontFace value);
760 void clear();
761 """
762 setlike_ops = []
763 """
764 Need to create a typedef for a function callback e.g.,
765 a setlike will need a callback that has the proper args in FontFaceSet that is
766 three arguments, etc.
767
768 typedef void FontFaceSetForEachCallback(
769 FontFace fontFace, FontFace fontFaceAgain, FontFaceSet set);
770
771 void forEach(FontFaceSetForEachCallback callback, [Object thisArg]);
772 """
773 callback_name = '%sForEachCallback' % interface.id
774 set_op = generate_operation(interface.id, 'void', 'forEach',
775 [[IDLType(None, callback_name), 'callback'],
776 [IDLType(None, 'any'), 'thisArg', True]])
777 setlike_ops.append(set_op)
778
779 set_op = generate_operation(interface.id, 'boolean', 'has',
780 [[IDLType(None, set_like.value_type.base_type), 'a rg']])
781 setlike_ops.append(set_op)
782
783 if not set_like.is_read_only:
784 set_op = generate_operation(interface.id, interface.id, 'add',
785 [[IDLType(None, set_like.value_type.base_type), 'arg']])
786 setlike_ops.append(set_op)
787 set_op = generate_operation(interface.id, 'boolean', 'delete',
788 [[IDLType(None, set_like.value_type.base_type), 'arg']])
789 setlike_ops.append(set_op)
790 set_op = generate_operation(interface.id, 'void', 'clear', [])
791 setlike_ops.append(set_op)
792
793 return setlike_ops
720 794
721 class IDLInterface(IDLNode): 795 class IDLInterface(IDLNode):
722 """IDLInterface node contains operations, attributes, constants, 796 """IDLInterface node contains operations, attributes, constants,
723 as well as parent references.""" 797 as well as parent references."""
724 798
725 def __init__(self, ast): 799 def __init__(self, ast):
726 IDLNode.__init__(self, ast) 800 IDLNode.__init__(self, ast)
727 self._convert_ext_attrs(ast) 801 self._convert_ext_attrs(ast)
728 self._convert_annotations(ast) 802 self._convert_annotations(ast)
729 803
730 self.parents = self._convert_all(ast, 'ParentInterface', 804 self.parents = self._convert_all(ast, 'ParentInterface',
731 IDLParentInterface) 805 IDLParentInterface)
732 806
733 javascript_interface_name = self.ext_attrs.get('InterfaceName', self.id) 807 javascript_interface_name = self.ext_attrs.get('InterfaceName', self.id)
734 self.javascript_binding_name = javascript_interface_name 808 self.javascript_binding_name = javascript_interface_name
735 self.doc_js_name = javascript_interface_name 809 self.doc_js_name = javascript_interface_name
736 810
737 if not (self._find_first(ast, 'Callback') is None): 811 if not (self._find_first(ast, 'Callback') is None):
738 self.ext_attrs['Callback'] = None 812 self.ext_attrs['Callback'] = None
739 if not (self._find_first(ast, 'Partial') is None): 813 if not (self._find_first(ast, 'Partial') is None):
740 self.is_supplemental = True 814 self.is_supplemental = True
741 self.ext_attrs['DartSupplemental'] = None 815 self.ext_attrs['DartSupplemental'] = None
742 816
743 self.operations = self._convert_all(ast, 'Operation', 817 self.operations = self._convert_all(ast, 'Operation',
744 lambda ast: IDLOperation(ast, self.doc_js_name)) 818 lambda ast: IDLOperation(ast, self.doc_js_name))
819
820 if ast.setlike:
821 setlike_ops = generate_setLike_operations_properties(self, ast.setlike)
822 for op in setlike_ops:
823 self.operations.append(op)
824
745 self.attributes = self._convert_all(ast, 'Attribute', 825 self.attributes = self._convert_all(ast, 'Attribute',
746 lambda ast: IDLAttribute(ast, self.doc_js_name)) 826 lambda ast: IDLAttribute(ast, self.doc_js_name))
747 self.constants = self._convert_all(ast, 'Const', 827 self.constants = self._convert_all(ast, 'Const',
748 lambda ast: IDLConstant(ast, self.doc_js_name)) 828 lambda ast: IDLConstant(ast, self.doc_js_name))
749 self.is_supplemental = 'DartSupplemental' in self.ext_attrs 829 self.is_supplemental = 'DartSupplemental' in self.ext_attrs
750 self.is_no_interface_object = 'NoInterfaceObject' in self.ext_attrs 830 self.is_no_interface_object = 'NoInterfaceObject' in self.ext_attrs
751 # TODO(terry): Can eliminate Suppressed when we're only using blink parser. 831 # TODO(terry): Can eliminate Suppressed when we're only using blink parser.
752 self.is_fc_suppressed = 'Suppressed' in self.ext_attrs or \ 832 self.is_fc_suppressed = 'Suppressed' in self.ext_attrs or \
753 'DartSuppress' in self.ext_attrs 833 'DartSuppress' in self.ext_attrs
754 834
755
756 def reset_id(self, new_id): 835 def reset_id(self, new_id):
757 """Reset the id of the Interface and corresponding the JS names.""" 836 """Reset the id of the Interface and corresponding the JS names."""
758 if self.id != new_id: 837 if self.id != new_id:
759 self.id = new_id 838 self.id = new_id
760 self.doc_js_name = new_id 839 self.doc_js_name = new_id
761 self.javascript_binding_name = new_id 840 self.javascript_binding_name = new_id
762 for member in self.operations: 841 for member in self.operations:
763 member.doc_js_interface_name = new_id 842 member.doc_js_interface_name = new_id
764 for member in self.attributes: 843 for member in self.attributes:
765 member.doc_js_interface_name = new_id 844 member.doc_js_interface_name = new_id
(...skipping 12 matching lines...) Expand all
778 """This IDLNode specialization is for 'Interface Child : Parent {}' 857 """This IDLNode specialization is for 'Interface Child : Parent {}'
779 declarations.""" 858 declarations."""
780 def __init__(self, ast): 859 def __init__(self, ast):
781 IDLNode.__init__(self, ast) 860 IDLNode.__init__(self, ast)
782 self._convert_annotations(ast) 861 self._convert_annotations(ast)
783 self.type = self._convert_first(ast, 'InterfaceType', IDLType) 862 self.type = self._convert_first(ast, 'InterfaceType', IDLType)
784 863
785 864
786 class IDLMember(IDLNode): 865 class IDLMember(IDLNode):
787 """A base class for constants, attributes and operations.""" 866 """A base class for constants, attributes and operations."""
788 867 def __init__(self, ast, doc_js_interface_name, member_id=None):
789 def __init__(self, ast, doc_js_interface_name): 868 if ast:
790 IDLNode.__init__(self, ast) 869 IDLNode.__init__(self, ast)
870 else:
871 # The ast is None to support synthesizing an IDLMember, member_id is only
872 # used when ast is None.
873 IDLNode.__init__(self, ast, member_id)
874 self.type = None
875 self.doc_js_interface_name = doc_js_interface_name
876 return
791 877
792 self.type = self._convert_first(ast, 'Type', IDLType) 878 self.type = self._convert_first(ast, 'Type', IDLType)
793 self.type = resolveTypedef(self.type) 879 self.type = resolveTypedef(self.type)
794 880
795 self._convert_ext_attrs(ast) 881 self._convert_ext_attrs(ast)
796 self._convert_annotations(ast) 882 self._convert_annotations(ast)
797 self.doc_js_interface_name = doc_js_interface_name 883 self.doc_js_interface_name = doc_js_interface_name
798 # TODO(terry): Can eliminate Suppressed when we're only using blink parser. 884 # TODO(terry): Can eliminate Suppressed when we're only using blink parser.
799 self.is_fc_suppressed = 'Suppressed' in self.ext_attrs or \ 885 self.is_fc_suppressed = 'Suppressed' in self.ext_attrs or \
800 'DartSuppress' in self.ext_attrs 886 'DartSuppress' in self.ext_attrs
801 self.is_static = self._has(ast, 'Static') 887 self.is_static = self._has(ast, 'Static')
802 888
803 class IDLOperation(IDLMember): 889 class IDLOperation(IDLMember):
804 """IDLNode specialization for 'type name(args)' declarations.""" 890 """IDLNode specialization for 'type name(args)' declarations."""
805 def __init__(self, ast, doc_js_interface_name): 891 def __init__(self, ast, doc_js_interface_name, id=None):
806 IDLMember.__init__(self, ast, doc_js_interface_name) 892 IDLMember.__init__(self, ast, doc_js_interface_name, id)
893
894 if not ast:
895 # Synthesize an IDLOperation with no ast used for setlike.
896 self.ext_attrs = IDLExtAttrs()
897 self.annotations = IDLAnnotations()
898 self.is_fc_suppressed = False
899 self.specials = []
900 self.is_static = False
901 self.arguments = []
902 return;
807 903
808 self.type = self._convert_first(ast, 'ReturnType', IDLType) 904 self.type = self._convert_first(ast, 'ReturnType', IDLType)
809 self.type = resolveTypedef(self.type) 905 self.type = resolveTypedef(self.type)
810 906
811 self.arguments = self._convert_all(ast, 'Argument', IDLArgument) 907 self.arguments = self._convert_all(ast, 'Argument', IDLArgument)
812 self.specials = self._find_all(ast, 'Special') 908 self.specials = self._find_all(ast, 'Special')
813 # Special case: there are getters of the form 909 # Special case: there are getters of the form
814 # getter <ReturnType>(args). For now force the name to be __getter__, 910 # getter <ReturnType>(args). For now force the name to be __getter__,
815 # but it should be operator[] later. 911 # but it should be operator[] later.
816 if self.id is None: 912 if self.id is None:
(...skipping 13 matching lines...) Expand all
830 elif self.specials == ['deleter']: 926 elif self.specials == ['deleter']:
831 self.id = '__delete__' 927 self.id = '__delete__'
832 else: 928 else:
833 raise Exception('Cannot handle %s: operation has no id' % ast) 929 raise Exception('Cannot handle %s: operation has no id' % ast)
834 930
835 if len(self.arguments) >= 1 and (self.id in _operation_suffix_map) and not self.ext_attrs.get('ImplementedAs'): 931 if len(self.arguments) >= 1 and (self.id in _operation_suffix_map) and not self.ext_attrs.get('ImplementedAs'):
836 arg = self.arguments[0] 932 arg = self.arguments[0]
837 operation_category = 'Named' if arg.type.id == 'DOMString' else 'Indexed ' 933 operation_category = 'Named' if arg.type.id == 'DOMString' else 'Indexed '
838 self.ext_attrs.setdefault('ImplementedAs', 'anonymous%s%s' % (operation_ category, _operation_suffix_map[self.id])) 934 self.ext_attrs.setdefault('ImplementedAs', 'anonymous%s%s' % (operation_ category, _operation_suffix_map[self.id]))
839 935
936 def __repr__(self):
937 return '<IDLOperation(id = %s)>' % (self.id)
938
840 def _extra_repr(self): 939 def _extra_repr(self):
841 return [self.arguments] 940 return [self.arguments]
842 941
843 def SameSignatureAs(self, operation): 942 def SameSignatureAs(self, operation):
844 if self.type != operation.type: 943 if self.type != operation.type:
845 return False 944 return False
846 return [a.type for a in self.arguments] == [a.type for a in operation.argume nts] 945 return [a.type for a in self.arguments] == [a.type for a in operation.argume nts]
847 946
848 class IDLAttribute(IDLMember): 947 class IDLAttribute(IDLMember):
849 """IDLNode specialization for 'attribute type name' declarations.""" 948 """IDLNode specialization for 'attribute type name' declarations."""
(...skipping 10 matching lines...) Expand all
860 959
861 class IDLConstant(IDLMember): 960 class IDLConstant(IDLMember):
862 """IDLNode specialization for 'const type name = value' declarations.""" 961 """IDLNode specialization for 'const type name = value' declarations."""
863 def __init__(self, ast, doc_js_interface_name): 962 def __init__(self, ast, doc_js_interface_name):
864 IDLMember.__init__(self, ast, doc_js_interface_name) 963 IDLMember.__init__(self, ast, doc_js_interface_name)
865 self.value = self._find_first(ast, 'ConstExpr') 964 self.value = self._find_first(ast, 'ConstExpr')
866 965
867 966
868 class IDLArgument(IDLNode): 967 class IDLArgument(IDLNode):
869 """IDLNode specialization for operation arguments.""" 968 """IDLNode specialization for operation arguments."""
870 def __init__(self, ast): 969 def __init__(self, ast, id=None):
871 IDLNode.__init__(self, ast) 970 if ast:
971 IDLNode.__init__(self, ast)
972 else:
973 # Synthesize an IDLArgument with no ast used for setlike.
974 IDLNode.__init__(self, ast, id)
975 self.ext_attrs = IDLExtAttrs()
976 self.default_value = None
977 self.default_value_is_null = False
978 return
872 979
873 self.default_value = None 980 self.default_value = None
874 self.default_value_is_null = False 981 self.default_value_is_null = False
875 # Handle the 'argType arg = default'. IDL syntax changed from 982 # Handle the 'argType arg = default'. IDL syntax changed from
876 # [default=NullString]. 983 # [default=NullString].
877 if not isinstance(ast, list): 984 if not isinstance(ast, list):
878 if isinstance(ast.default_value, idl_definitions.IdlLiteral) and ast.defau lt_value: 985 if isinstance(ast.default_value, idl_definitions.IdlLiteral) and ast.defau lt_value:
879 self.default_value = ast.default_value.value 986 self.default_value = ast.default_value.value
880 self.default_value_is_null = ast.default_value.is_null 987 self.default_value_is_null = ast.default_value.is_null
881 elif 'Default' in ast.extended_attributes: 988 elif 'Default' in ast.extended_attributes:
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
931 """IDLDictNode specialization for one annotation.""" 1038 """IDLDictNode specialization for one annotation."""
932 def __init__(self, ast=None): 1039 def __init__(self, ast=None):
933 IDLDictNode.__init__(self, ast) 1040 IDLDictNode.__init__(self, ast)
934 self.id = None 1041 self.id = None
935 if not ast: 1042 if not ast:
936 return 1043 return
937 for arg in self._find_all(ast, 'AnnotationArg'): 1044 for arg in self._find_all(ast, 'AnnotationArg'):
938 name = self._find_first(arg, 'Id') 1045 name = self._find_first(arg, 'Id')
939 value = self._find_first(arg, 'AnnotationArgValue') 1046 value = self._find_first(arg, 'AnnotationArgValue')
940 self[name] = value 1047 self[name] = value
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698