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 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
55 IdlException < IdlInterface | 55 IdlException < IdlInterface |
56 (same contents as IdlInterface) | 56 (same contents as IdlInterface) |
57 | 57 |
58 TypedObject :: mixin for typedef resolution | 58 TypedObject :: mixin for typedef resolution |
59 | 59 |
60 Design doc: http://www.chromium.org/developers/design-documents/idl-compiler | 60 Design doc: http://www.chromium.org/developers/design-documents/idl-compiler |
61 """ | 61 """ |
62 | 62 |
63 import abc | 63 import abc |
64 | 64 |
65 from idl_types import IdlType, IdlUnionType, IdlArrayType, IdlSequenceType | 65 from idl_types import IdlType, IdlUnionType, IdlArrayType, IdlSequenceType, IdlN
ullableType |
66 | 66 |
67 SPECIAL_KEYWORD_LIST = ['GETTER', 'SETTER', 'DELETER'] | 67 SPECIAL_KEYWORD_LIST = ['GETTER', 'SETTER', 'DELETER'] |
68 STANDARD_TYPEDEFS = { | 68 STANDARD_TYPEDEFS = { |
69 # http://www.w3.org/TR/WebIDL/#common-DOMTimeStamp | 69 # http://www.w3.org/TR/WebIDL/#common-DOMTimeStamp |
70 'DOMTimeStamp': 'unsigned long long', | 70 'DOMTimeStamp': 'unsigned long long', |
71 } | 71 } |
72 | 72 |
73 | 73 |
74 ################################################################################ | 74 ################################################################################ |
75 # TypedObject (mixin for typedef resolution) | 75 # TypedObject (mixin for typedef resolution) |
(...skipping 554 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
630 | 630 |
631 | 631 |
632 ################################################################################ | 632 ################################################################################ |
633 # Extended attributes | 633 # Extended attributes |
634 ################################################################################ | 634 ################################################################################ |
635 | 635 |
636 def ext_attributes_node_to_extended_attributes(idl_name, node): | 636 def ext_attributes_node_to_extended_attributes(idl_name, node): |
637 """ | 637 """ |
638 Returns: | 638 Returns: |
639 Dictionary of {ExtAttributeName: ExtAttributeValue}. | 639 Dictionary of {ExtAttributeName: ExtAttributeValue}. |
640 Value is usually a string, with three exceptions: | 640 Value is usually a string, with these exceptions: |
641 Constructors: value is a list of Arguments nodes, corresponding to | 641 Constructors: value is a list of Arguments nodes, corresponding to |
642 possible signatures of the constructor. | 642 possible signatures of the constructor. |
643 CustomConstructors: value is a list of Arguments nodes, corresponding to | 643 CustomConstructors: value is a list of Arguments nodes, corresponding to |
644 possible signatures of the custom constructor. | 644 possible signatures of the custom constructor. |
645 NamedConstructor: value is a Call node, corresponding to the single | 645 NamedConstructor: value is a Call node, corresponding to the single |
646 signature of the named constructor. | 646 signature of the named constructor. |
| 647 SetWrapperReferenceTo: value is an Arguments node. |
647 """ | 648 """ |
648 # Primarily just make a dictionary from the children. | 649 # Primarily just make a dictionary from the children. |
649 # The only complexity is handling various types of constructors: | 650 # The only complexity is handling various types of constructors: |
650 # Constructors and Custom Constructors can have duplicate entries due to | 651 # Constructors and Custom Constructors can have duplicate entries due to |
651 # overloading, and thus are stored in temporary lists. | 652 # overloading, and thus are stored in temporary lists. |
652 # However, Named Constructors cannot be overloaded, and thus do not have | 653 # However, Named Constructors cannot be overloaded, and thus do not have |
653 # a list. | 654 # a list. |
654 # FIXME: move Constructor logic into separate function, instead of modifying | 655 # FIXME: move Constructor logic into separate function, instead of modifying |
655 # extended attributes in-place. | 656 # extended attributes in-place. |
656 constructors = [] | 657 constructors = [] |
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
748 | 749 |
749 ################################################################################ | 750 ################################################################################ |
750 # Types | 751 # Types |
751 ################################################################################ | 752 ################################################################################ |
752 | 753 |
753 def type_node_to_type(node): | 754 def type_node_to_type(node): |
754 children = node.GetChildren() | 755 children = node.GetChildren() |
755 if len(children) < 1 or len(children) > 2: | 756 if len(children) < 1 or len(children) > 2: |
756 raise ValueError('Type node expects 1 or 2 children (type + optional arr
ay []), got %s (multi-dimensional arrays are not supported).' % len(children)) | 757 raise ValueError('Type node expects 1 or 2 children (type + optional arr
ay []), got %s (multi-dimensional arrays are not supported).' % len(children)) |
757 | 758 |
758 is_nullable = node.GetProperty('NULLABLE') or False # syntax: T? | 759 base_type = type_node_inner_to_type(children[0]) |
759 type_node_child = children[0] | 760 |
760 base_type = type_node_inner_to_type(type_node_child, is_nullable=is_nullable
) | 761 if node.GetProperty('NULLABLE'): |
| 762 base_type = IdlNullableType(base_type) |
761 | 763 |
762 if len(children) == 2: | 764 if len(children) == 2: |
763 array_node = children[1] | 765 array_node = children[1] |
764 array_node_class = array_node.GetClass() | 766 array_node_class = array_node.GetClass() |
765 if array_node_class != 'Array': | 767 if array_node_class != 'Array': |
766 raise ValueError('Expected Array node as TypeSuffix, got %s node.' %
array_node_class) | 768 raise ValueError('Expected Array node as TypeSuffix, got %s node.' %
array_node_class) |
767 array_is_nullable = array_node.GetProperty('NULLABLE') or False | 769 array_type = IdlArrayType(base_type) |
768 return IdlArrayType(base_type, is_nullable=array_is_nullable) | 770 if array_node.GetProperty('NULLABLE'): |
| 771 return IdlNullableType(array_type) |
| 772 return array_type |
769 | 773 |
770 return base_type | 774 return base_type |
771 | 775 |
772 | 776 |
773 def type_node_inner_to_type(node, is_nullable=False): | 777 def type_node_inner_to_type(node): |
774 # FIXME: remove is_nullable once have IdlNullableType | |
775 node_class = node.GetClass() | 778 node_class = node.GetClass() |
776 # Note Type*r*ef, not Typedef, meaning the type is an identifier, thus | 779 # Note Type*r*ef, not Typedef, meaning the type is an identifier, thus |
777 # either a typedef shorthand (but not a Typedef declaration itself) or an | 780 # either a typedef shorthand (but not a Typedef declaration itself) or an |
778 # interface type. We do not distinguish these, and just use the type name. | 781 # interface type. We do not distinguish these, and just use the type name. |
779 if node_class in ['PrimitiveType', 'Typeref']: | 782 if node_class in ['PrimitiveType', 'Typeref']: |
780 # unrestricted syntax: unrestricted double | unrestricted float | 783 # unrestricted syntax: unrestricted double | unrestricted float |
781 is_unrestricted = node.GetProperty('UNRESTRICTED') or False | 784 is_unrestricted = node.GetProperty('UNRESTRICTED') or False |
782 return IdlType(node.GetName(), is_nullable=is_nullable, is_unrestricted=
is_unrestricted) | 785 return IdlType(node.GetName(), is_unrestricted=is_unrestricted) |
783 elif node_class == 'Any': | 786 elif node_class == 'Any': |
784 return IdlType('any', is_nullable=is_nullable) | 787 return IdlType('any') |
785 elif node_class == 'Sequence': | 788 elif node_class == 'Sequence': |
786 sequence_is_nullable = node.GetProperty('NULLABLE') or False | 789 return sequence_node_to_type(node) |
787 return sequence_node_to_type(node, is_nullable=sequence_is_nullable) | |
788 elif node_class == 'UnionType': | 790 elif node_class == 'UnionType': |
789 return union_type_node_to_idl_union_type(node, is_nullable=is_nullable) | 791 return union_type_node_to_idl_union_type(node) |
790 raise ValueError('Unrecognized node class: %s' % node_class) | 792 raise ValueError('Unrecognized node class: %s' % node_class) |
791 | 793 |
792 | 794 |
793 def sequence_node_to_type(node, is_nullable=False): | 795 def sequence_node_to_type(node): |
794 children = node.GetChildren() | 796 children = node.GetChildren() |
795 if len(children) != 1: | 797 if len(children) != 1: |
796 raise ValueError('Sequence node expects exactly 1 child, got %s' % len(c
hildren)) | 798 raise ValueError('Sequence node expects exactly 1 child, got %s' % len(c
hildren)) |
797 sequence_child = children[0] | 799 sequence_child = children[0] |
798 sequence_child_class = sequence_child.GetClass() | 800 sequence_child_class = sequence_child.GetClass() |
799 if sequence_child_class != 'Type': | 801 if sequence_child_class != 'Type': |
800 raise ValueError('Unrecognized node class: %s' % sequence_child_class) | 802 raise ValueError('Unrecognized node class: %s' % sequence_child_class) |
801 element_type = type_node_to_type(sequence_child) | 803 element_type = type_node_to_type(sequence_child) |
802 return IdlSequenceType(element_type, is_nullable=is_nullable) | 804 sequence_type = IdlSequenceType(element_type) |
| 805 if node.GetProperty('NULLABLE'): |
| 806 return IdlNullableType(sequence_type) |
| 807 return sequence_type |
803 | 808 |
804 | 809 |
805 def typedef_node_to_type(node): | 810 def typedef_node_to_type(node): |
806 children = node.GetChildren() | 811 children = node.GetChildren() |
807 if len(children) != 1: | 812 if len(children) != 1: |
808 raise ValueError('Typedef node with %s children, expected 1' % len(child
ren)) | 813 raise ValueError('Typedef node with %s children, expected 1' % len(child
ren)) |
809 child = children[0] | 814 child = children[0] |
810 child_class = child.GetClass() | 815 child_class = child.GetClass() |
811 if child_class != 'Type': | 816 if child_class != 'Type': |
812 raise ValueError('Unrecognized node class: %s' % child_class) | 817 raise ValueError('Unrecognized node class: %s' % child_class) |
813 return type_node_to_type(child) | 818 return type_node_to_type(child) |
814 | 819 |
815 | 820 |
816 def union_type_node_to_idl_union_type(node, is_nullable=False): | 821 def union_type_node_to_idl_union_type(node): |
817 member_types = [type_node_to_type(member_type_node) | 822 member_types = [type_node_to_type(member_type_node) |
818 for member_type_node in node.GetChildren()] | 823 for member_type_node in node.GetChildren()] |
819 return IdlUnionType(member_types, is_nullable=is_nullable) | 824 return IdlUnionType(member_types) |
OLD | NEW |