OLD | NEW |
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 |
11 import dependency | 11 import dependency |
12 | 12 |
13 new_asts = {} | 13 new_asts = {} |
14 | 14 |
15 # Report of union types mapped to any. | 15 # Report of union types mapped to any. |
16 _unions_to_any = [] | 16 _unions_to_any = [] |
17 | 17 |
18 def report_unions_to_any(): | 18 def report_unions_to_any(): |
19 global _unions_to_any | 19 global _unions_to_any |
20 | 20 |
21 warnings = [] | 21 warnings = [] |
22 for union_id in sorted(_unions_to_any): | 22 for union_id in sorted(_unions_to_any): |
23 warnings.append('Union type %s is mapped to \'any\'' % union_id) | 23 warnings.append('Union type %s is mapped to \'any\'' % union_id) |
24 | 24 |
25 return warnings | 25 return warnings |
26 | 26 |
27 # Ugly but Chrome IDLs can reference typedefs in any IDL w/o an include. So we | 27 # Ugly but Chrome IDLs can reference typedefs in any IDL w/o an include. So we |
28 # need to remember any typedef seen then alias any reference to a typedef. | 28 # need to remember any typedef seen then alias any reference to a typedef. |
29 typeDefsFixup = [] | 29 _typeDefsFixup = [] |
30 | 30 |
31 def _resolveTypedef(type): | 31 def _addTypedef(typedef): |
| 32 _typeDefsFixup.append(typedef) |
| 33 |
| 34 def resolveTypedef(type): |
32 """ Given a type if it's a known typedef (only typedef's that aren't union) | 35 """ Given a type if it's a known typedef (only typedef's that aren't union) |
33 are remembered for fixup. typedefs that are union type are mapped to | 36 are remembered for fixup. typedefs that are union type are mapped to |
34 any so those we don't need to alias. typedefs referenced in the file | 37 any so those we don't need to alias. typedefs referenced in the file |
35 where the typedef was defined are automatically aliased to the real type. | 38 where the typedef was defined are automatically aliased to the real type. |
36 This resolves typedef where the declaration is in another IDL file. | 39 This resolves typedef where the declaration is in another IDL file. |
37 """ | 40 """ |
38 for typedef in typeDefsFixup: | 41 for typedef in _typeDefsFixup: |
39 if typedef.id == type.id: | 42 if typedef.id == type.id: |
40 return typedef.type | 43 return typedef.type |
41 | 44 |
42 return type | 45 return type |
43 | 46 |
44 | 47 |
45 _operation_suffix_map = { | 48 _operation_suffix_map = { |
46 '__getter__': "Getter", | 49 '__getter__': "Getter", |
47 '__setter__': "Setter", | 50 '__setter__': "Setter", |
48 '__delete__': "Deleter", | 51 '__delete__': "Deleter", |
(...skipping 383 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
432 # Hack to record typedefs that are unions. | 435 # Hack to record typedefs that are unions. |
433 for typedefName in ast.typedefs: | 436 for typedefName in ast.typedefs: |
434 typedef_type = ast.typedefs[typedefName] | 437 typedef_type = ast.typedefs[typedefName] |
435 if isinstance(typedef_type.idl_type, IdlUnionType): | 438 if isinstance(typedef_type.idl_type, IdlUnionType): |
436 self.typeDefs.append(IDLTypeDef(typedef_type)) | 439 self.typeDefs.append(IDLTypeDef(typedef_type)) |
437 elif typedef_type.idl_type.base_type == 'Dictionary': | 440 elif typedef_type.idl_type.base_type == 'Dictionary': |
438 dictionary = IDLDictionary(typedef_type, True) | 441 dictionary = IDLDictionary(typedef_type, True) |
439 self.dictionaries.append(dictionary) | 442 self.dictionaries.append(dictionary) |
440 else: | 443 else: |
441 # All other typedefs we record | 444 # All other typedefs we record |
442 typeDefsFixup.append(IDLTypeDef(typedef_type)) | 445 _addTypedef(IDLTypeDef(typedef_type)) |
443 | 446 |
444 self.enums = self._convert_all(ast, 'Enum', IDLEnum) | 447 self.enums = self._convert_all(ast, 'Enum', IDLEnum) |
445 | 448 |
446 def _createImplementsStatement(self, implementor, implemented_name): | 449 def _createImplementsStatement(self, implementor, implemented_name): |
447 implemented = new_asts[implemented_name].interfaces.get(implemented_name) | 450 implemented = new_asts[implemented_name].interfaces.get(implemented_name) |
448 | 451 |
449 implement_statement = IDLImplementsStatement(implemented) | 452 implement_statement = IDLImplementsStatement(implemented) |
450 | 453 |
451 implement_statement.implementor = IDLType(implementor) | 454 implement_statement.implementor = IDLType(implementor) |
452 implement_statement.implemented = IDLType(implemented) | 455 implement_statement.implemented = IDLType(implemented) |
(...skipping 327 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
780 self.type = self._convert_first(ast, 'InterfaceType', IDLType) | 783 self.type = self._convert_first(ast, 'InterfaceType', IDLType) |
781 | 784 |
782 | 785 |
783 class IDLMember(IDLNode): | 786 class IDLMember(IDLNode): |
784 """A base class for constants, attributes and operations.""" | 787 """A base class for constants, attributes and operations.""" |
785 | 788 |
786 def __init__(self, ast, doc_js_interface_name): | 789 def __init__(self, ast, doc_js_interface_name): |
787 IDLNode.__init__(self, ast) | 790 IDLNode.__init__(self, ast) |
788 | 791 |
789 self.type = self._convert_first(ast, 'Type', IDLType) | 792 self.type = self._convert_first(ast, 'Type', IDLType) |
790 self.type = _resolveTypedef(self.type) | 793 self.type = resolveTypedef(self.type) |
791 | 794 |
792 self._convert_ext_attrs(ast) | 795 self._convert_ext_attrs(ast) |
793 self._convert_annotations(ast) | 796 self._convert_annotations(ast) |
794 self.doc_js_interface_name = doc_js_interface_name | 797 self.doc_js_interface_name = doc_js_interface_name |
795 # TODO(terry): Can eliminate Suppressed when we're only using blink parser. | 798 # TODO(terry): Can eliminate Suppressed when we're only using blink parser. |
796 self.is_fc_suppressed = 'Suppressed' in self.ext_attrs or \ | 799 self.is_fc_suppressed = 'Suppressed' in self.ext_attrs or \ |
797 'DartSuppress' in self.ext_attrs | 800 'DartSuppress' in self.ext_attrs |
798 self.is_static = self._has(ast, 'Static') | 801 self.is_static = self._has(ast, 'Static') |
799 | 802 |
800 class IDLOperation(IDLMember): | 803 class IDLOperation(IDLMember): |
801 """IDLNode specialization for 'type name(args)' declarations.""" | 804 """IDLNode specialization for 'type name(args)' declarations.""" |
802 def __init__(self, ast, doc_js_interface_name): | 805 def __init__(self, ast, doc_js_interface_name): |
803 IDLMember.__init__(self, ast, doc_js_interface_name) | 806 IDLMember.__init__(self, ast, doc_js_interface_name) |
804 | 807 |
805 self.type = self._convert_first(ast, 'ReturnType', IDLType) | 808 self.type = self._convert_first(ast, 'ReturnType', IDLType) |
806 self.type = _resolveTypedef(self.type) | 809 self.type = resolveTypedef(self.type) |
| 810 |
807 self.arguments = self._convert_all(ast, 'Argument', IDLArgument) | 811 self.arguments = self._convert_all(ast, 'Argument', IDLArgument) |
808 self.specials = self._find_all(ast, 'Special') | 812 self.specials = self._find_all(ast, 'Special') |
809 # Special case: there are getters of the form | 813 # Special case: there are getters of the form |
810 # getter <ReturnType>(args). For now force the name to be __getter__, | 814 # getter <ReturnType>(args). For now force the name to be __getter__, |
811 # but it should be operator[] later. | 815 # but it should be operator[] later. |
812 if self.id is None: | 816 if self.id is None: |
813 if self.specials == ['getter']: | 817 if self.specials == ['getter']: |
814 if self.ext_attrs.get('Custom') == 'PropertyQuery': | 818 if self.ext_attrs.get('Custom') == 'PropertyQuery': |
815 # Handling __propertyQuery__ the extended attribute is: | 819 # Handling __propertyQuery__ the extended attribute is: |
816 # [Custom=PropertyQuery] getter boolean (DOMString name); | 820 # [Custom=PropertyQuery] getter boolean (DOMString name); |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
874 if isinstance(ast.default_value, idl_definitions.IdlLiteral) and ast.defau
lt_value: | 878 if isinstance(ast.default_value, idl_definitions.IdlLiteral) and ast.defau
lt_value: |
875 self.default_value = ast.default_value.value | 879 self.default_value = ast.default_value.value |
876 self.default_value_is_null = ast.default_value.is_null | 880 self.default_value_is_null = ast.default_value.is_null |
877 elif 'Default' in ast.extended_attributes: | 881 elif 'Default' in ast.extended_attributes: |
878 # Work around [Default=Undefined] for arguments - only look in the model
's | 882 # Work around [Default=Undefined] for arguments - only look in the model
's |
879 # default_value | 883 # default_value |
880 self.default_value = ast.extended_attributes.get('Default') | 884 self.default_value = ast.extended_attributes.get('Default') |
881 self.default_value_is_null = False | 885 self.default_value_is_null = False |
882 | 886 |
883 self.type = self._convert_first(ast, 'Type', IDLType) | 887 self.type = self._convert_first(ast, 'Type', IDLType) |
884 self.type = _resolveTypedef(self.type) | 888 self.type = resolveTypedef(self.type) |
885 | 889 |
886 self.optional = self._has(ast, 'Optional') | 890 self.optional = self._has(ast, 'Optional') |
887 self._convert_ext_attrs(ast) | 891 self._convert_ext_attrs(ast) |
888 # TODO(vsm): Recover this from the type instead. | 892 # TODO(vsm): Recover this from the type instead. |
889 if 'Callback' in self.type.id: | 893 if 'Callback' in self.type.id: |
890 self.ext_attrs['Callback'] = None | 894 self.ext_attrs['Callback'] = None |
891 | 895 |
892 def __repr__(self): | 896 def __repr__(self): |
893 return '<IDLArgument(type = %s, id = %s)>' % (self.type, self.id) | 897 return '<IDLArgument(type = %s, id = %s)>' % (self.type, self.id) |
894 | 898 |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
927 """IDLDictNode specialization for one annotation.""" | 931 """IDLDictNode specialization for one annotation.""" |
928 def __init__(self, ast=None): | 932 def __init__(self, ast=None): |
929 IDLDictNode.__init__(self, ast) | 933 IDLDictNode.__init__(self, ast) |
930 self.id = None | 934 self.id = None |
931 if not ast: | 935 if not ast: |
932 return | 936 return |
933 for arg in self._find_all(ast, 'AnnotationArg'): | 937 for arg in self._find_all(ast, 'AnnotationArg'): |
934 name = self._find_first(arg, 'Id') | 938 name = self._find_first(arg, 'Id') |
935 value = self._find_first(arg, 'AnnotationArgValue') | 939 value = self._find_first(arg, 'AnnotationArgValue') |
936 self[name] = value | 940 self[name] = value |
OLD | NEW |