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

Side by Side Diff: lib/dom/scripts/generator.py

Issue 10584031: Proper support for IDL arrays in generators. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Next iteration Created 8 years, 6 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 | Annotate | Revision Log
« no previous file with comments | « lib/dom/scripts/dartgenerator.py ('k') | lib/dom/scripts/systemnative.py » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 #!/usr/bin/python 1 #!/usr/bin/python
2 # Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 2 # Copyright (c) 2012, 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 """This module provides shared functionality for systems to generate 6 """This module provides shared functionality for systems to generate
7 Dart APIs from the IDL database.""" 7 Dart APIs from the IDL database."""
8 8
9 import copy 9 import copy
10 import re 10 import re
(...skipping 584 matching lines...) Expand 10 before | Expand all | Expand 10 after
595 else: 595 else:
596 include = self._idl_type 596 include = self._idl_type
597 return ['"%s.h"' % include] + _svg_supplemental_includes 597 return ['"%s.h"' % include] + _svg_supplemental_includes
598 598
599 def receiver(self): 599 def receiver(self):
600 return 'receiver->' 600 return 'receiver->'
601 601
602 def conversion_includes(self): 602 def conversion_includes(self):
603 return ['"Dart%s.h"' % include for include in self._conversion_includes] 603 return ['"Dart%s.h"' % include for include in self._conversion_includes]
604 604
605 def to_native_includes(self):
606 return ['"Dart%s.h"' % self.idl_type()]
607
605 def to_dart_conversion(self, value, interface_name=None, attributes=None): 608 def to_dart_conversion(self, value, interface_name=None, attributes=None):
606 return 'Dart%s::toDart(%s)' % (self._idl_type, value) 609 return 'Dart%s::toDart(%s)' % (self._idl_type, value)
607 610
608 def custom_to_dart(self): 611 def custom_to_dart(self):
609 return self._custom_to_dart 612 return self._custom_to_dart
610 613
611 614
612 class SequenceIDLTypeInfo(IDLTypeInfo): 615 class SequenceIDLTypeInfo(IDLTypeInfo):
613 def __init__(self, idl_type, item_info): 616 def __init__(self, idl_type, item_info):
614 super(SequenceIDLTypeInfo, self).__init__(idl_type) 617 super(SequenceIDLTypeInfo, self).__init__(idl_type)
615 self._item_info = item_info 618 self._item_info = item_info
616 619
617 def dart_type(self): 620 def dart_type(self):
618 return 'List<%s>' % self._item_info.dart_type() 621 return 'List<%s>' % self._item_info.dart_type()
619 622
620 def to_dart_conversion(self, value, interface_name=None, attributes=None): 623 def to_dart_conversion(self, value, interface_name=None, attributes=None):
621 return 'DartDOMWrapper::vectorToDart<Dart%s>(%s)' % (self._item_info.native_ type(), value) 624 return 'DartDOMWrapper::vectorToDart<Dart%s>(%s)' % (self._item_info.native_ type(), value)
622 625
623 def conversion_includes(self): 626 def conversion_includes(self):
624 return self._item_info.conversion_includes() 627 return self._item_info.conversion_includes()
625 628
626 629
630 class DOMStringArrayTypeInfo(SequenceIDLTypeInfo):
631 def __init__(self):
632 super(DOMStringArrayTypeInfo, self).__init__('DOMString[]', _dom_string_type _info)
633
634 def emit_to_native(self, emitter, idl_node, name, handle, interface_name):
635 emitter.Emit(
636 '\n'
637 ' RefPtr<DOMStringList> $NAME = DartDOMStringList::toNative($HAND LE, exception);\n'
638 ' if (exception)\n'
639 ' goto fail;\n',
640 NAME=name,
641 HANDLE=handle)
642 return name
643
644 def to_native_includes(self):
645 return ['"DartDOMStringList.h"']
646
647
627 class PrimitiveIDLTypeInfo(IDLTypeInfo): 648 class PrimitiveIDLTypeInfo(IDLTypeInfo):
628 def __init__(self, idl_type, dart_type, native_type=None, 649 def __init__(self, idl_type, dart_type, native_type=None,
629 webcore_getter_name='getAttribute', 650 webcore_getter_name='getAttribute',
630 webcore_setter_name='setAttribute'): 651 webcore_setter_name='setAttribute'):
631 super(PrimitiveIDLTypeInfo, self).__init__(idl_type, dart_type=dart_type, 652 super(PrimitiveIDLTypeInfo, self).__init__(idl_type, dart_type=dart_type,
632 native_type=native_type) 653 native_type=native_type)
633 self._webcore_getter_name = webcore_getter_name 654 self._webcore_getter_name = webcore_getter_name
634 self._webcore_setter_name = webcore_setter_name 655 self._webcore_setter_name = webcore_setter_name
635 656
636 def emit_to_native(self, emitter, idl_node, name, handle, interface_name): 657 def emit_to_native(self, emitter, idl_node, name, handle, interface_name):
(...skipping 13 matching lines...) Expand all
650 return name 671 return name
651 672
652 def parameter_type(self): 673 def parameter_type(self):
653 if self.native_type() == 'String': 674 if self.native_type() == 'String':
654 return 'const String&' 675 return 'const String&'
655 return self.native_type() 676 return self.native_type()
656 677
657 def conversion_includes(self): 678 def conversion_includes(self):
658 return [] 679 return []
659 680
681 def to_native_includes(sefl):
682 return []
683
660 def to_dart_conversion(self, value, interface_name=None, attributes=None): 684 def to_dart_conversion(self, value, interface_name=None, attributes=None):
661 conversion_arguments = [value] 685 conversion_arguments = [value]
662 if attributes and 'TreatReturnedNullStringAs' in attributes: 686 if attributes and 'TreatReturnedNullStringAs' in attributes:
663 conversion_arguments.append('DartUtilities::ConvertNullToDefaultValue') 687 conversion_arguments.append('DartUtilities::ConvertNullToDefaultValue')
664 function_name = re.sub(r' [a-z]', lambda x: x.group(0)[1:].upper(), self.nat ive_type()) 688 function_name = re.sub(r' [a-z]', lambda x: x.group(0)[1:].upper(), self.nat ive_type())
665 function_name = function_name[0].lower() + function_name[1:] 689 function_name = function_name[0].lower() + function_name[1:]
666 function_name = 'DartUtilities::%sToDart' % function_name 690 function_name = 'DartUtilities::%sToDart' % function_name
667 return '%s(%s)' % (function_name, ', '.join(conversion_arguments)) 691 return '%s(%s)' % (function_name, ', '.join(conversion_arguments))
668 692
669 def webcore_getter_name(self): 693 def webcore_getter_name(self):
(...skipping 30 matching lines...) Expand all
700 conversion_cast = '%s::create(receiver, %s)' 724 conversion_cast = '%s::create(receiver, %s)'
701 elif interface_name.endswith('List'): 725 elif interface_name.endswith('List'):
702 conversion_cast = 'static_cast<%s*>(%s.get())' 726 conversion_cast = 'static_cast<%s*>(%s.get())'
703 elif self.idl_type() in svg_primitive_types: 727 elif self.idl_type() in svg_primitive_types:
704 conversion_cast = '%s::create(%s)' 728 conversion_cast = '%s::create(%s)'
705 else: 729 else:
706 conversion_cast = 'static_cast<%s*>(%s)' 730 conversion_cast = 'static_cast<%s*>(%s)'
707 conversion_cast = conversion_cast % (self.native_type(), value) 731 conversion_cast = conversion_cast % (self.native_type(), value)
708 return 'Dart%s::toDart(%s)' % (self._idl_type, conversion_cast) 732 return 'Dart%s::toDart(%s)' % (self._idl_type, conversion_cast)
709 733
734 _dom_string_type_info = PrimitiveIDLTypeInfo(
735 'DOMString', dart_type='String', native_type='String')
736
710 _idl_type_registry = { 737 _idl_type_registry = {
711 'boolean': PrimitiveIDLTypeInfo('boolean', dart_type='bool', native_type='bo ol', 738 'boolean': PrimitiveIDLTypeInfo('boolean', dart_type='bool', native_type='bo ol',
712 webcore_getter_name='hasAttribute', 739 webcore_getter_name='hasAttribute',
713 webcore_setter_name='setBooleanAttribute'), 740 webcore_setter_name='setBooleanAttribute'),
714 'byte': PrimitiveIDLTypeInfo('byte', dart_type='int', native_type='int'), 741 'byte': PrimitiveIDLTypeInfo('byte', dart_type='int', native_type='int'),
715 'octet': PrimitiveIDLTypeInfo('octet', dart_type='int', native_type='int'), 742 'octet': PrimitiveIDLTypeInfo('octet', dart_type='int', native_type='int'),
716 'short': PrimitiveIDLTypeInfo('short', dart_type='int', native_type='int'), 743 'short': PrimitiveIDLTypeInfo('short', dart_type='int', native_type='int'),
717 'unsigned short': PrimitiveIDLTypeInfo('unsigned short', dart_type='int', 744 'unsigned short': PrimitiveIDLTypeInfo('unsigned short', dart_type='int',
718 native_type='int'), 745 native_type='int'),
719 'int': PrimitiveIDLTypeInfo('int', dart_type='int'), 746 'int': PrimitiveIDLTypeInfo('int', dart_type='int'),
720 'unsigned int': PrimitiveIDLTypeInfo('unsigned int', dart_type='int', 747 'unsigned int': PrimitiveIDLTypeInfo('unsigned int', dart_type='int',
721 native_type='unsigned'), 748 native_type='unsigned'),
722 'long': PrimitiveIDLTypeInfo('long', dart_type='int', native_type='int', 749 'long': PrimitiveIDLTypeInfo('long', dart_type='int', native_type='int',
723 webcore_getter_name='getIntegralAttribute', 750 webcore_getter_name='getIntegralAttribute',
724 webcore_setter_name='setIntegralAttribute'), 751 webcore_setter_name='setIntegralAttribute'),
725 'unsigned long': PrimitiveIDLTypeInfo('unsigned long', dart_type='int', 752 'unsigned long': PrimitiveIDLTypeInfo('unsigned long', dart_type='int',
726 native_type='unsigned', 753 native_type='unsigned',
727 webcore_getter_name='getUnsignedIntegralAttribute', 754 webcore_getter_name='getUnsignedIntegralAttribute',
728 webcore_setter_name='setUnsignedIntegralAttribute'), 755 webcore_setter_name='setUnsignedIntegralAttribute'),
729 'long long': PrimitiveIDLTypeInfo('long long', dart_type='int'), 756 'long long': PrimitiveIDLTypeInfo('long long', dart_type='int'),
730 'unsigned long long': PrimitiveIDLTypeInfo('unsigned long long', dart_type=' int'), 757 'unsigned long long': PrimitiveIDLTypeInfo('unsigned long long', dart_type=' int'),
731 'float': PrimitiveIDLTypeInfo('float', dart_type='num', native_type='double' ), 758 'float': PrimitiveIDLTypeInfo('float', dart_type='num', native_type='double' ),
732 'double': PrimitiveIDLTypeInfo('double', dart_type='num'), 759 'double': PrimitiveIDLTypeInfo('double', dart_type='num'),
733 760
734 'any': PrimitiveIDLTypeInfo('any', dart_type='Object'), 761 'any': PrimitiveIDLTypeInfo('any', dart_type='Object'),
735 'any[]': PrimitiveIDLTypeInfo('any[]', dart_type='List'),
736 'Array': PrimitiveIDLTypeInfo('Array', dart_type='List'), 762 'Array': PrimitiveIDLTypeInfo('Array', dart_type='List'),
737 'custom': PrimitiveIDLTypeInfo('custom', dart_type='Dynamic'), 763 'custom': PrimitiveIDLTypeInfo('custom', dart_type='Dynamic'),
738 'Date': PrimitiveIDLTypeInfo('Date', dart_type='Date', native_type='double') , 764 'Date': PrimitiveIDLTypeInfo('Date', dart_type='Date', native_type='double') ,
739 'DOMObject': PrimitiveIDLTypeInfo('DOMObject', dart_type='Object', native_ty pe='ScriptValue'), 765 'DOMObject': PrimitiveIDLTypeInfo('DOMObject', dart_type='Object', native_ty pe='ScriptValue'),
740 'DOMString': PrimitiveIDLTypeInfo('DOMString', dart_type='String', native_ty pe='String'), 766 'DOMString': _dom_string_type_info,
741 # TODO(vsm): This won't actually work until we convert the Map to 767 # TODO(vsm): This won't actually work until we convert the Map to
742 # a native JS Map for JS DOM. 768 # a native JS Map for JS DOM.
743 'Dictionary': PrimitiveIDLTypeInfo('Dictionary', dart_type='Map'), 769 'Dictionary': PrimitiveIDLTypeInfo('Dictionary', dart_type='Map'),
744 # TODO(sra): Flags is really a dictionary: {create:bool, exclusive:bool} 770 # TODO(sra): Flags is really a dictionary: {create:bool, exclusive:bool}
745 # http://dev.w3.org/2009/dap/file-system/file-dir-sys.html#the-flags-interfa ce 771 # http://dev.w3.org/2009/dap/file-system/file-dir-sys.html#the-flags-interfa ce
746 'Flags': PrimitiveIDLTypeInfo('Flags', dart_type='Object'), 772 'Flags': PrimitiveIDLTypeInfo('Flags', dart_type='Object'),
747 'DOMTimeStamp': PrimitiveIDLTypeInfo('DOMTimeStamp', dart_type='int', native _type='unsigned long long'), 773 'DOMTimeStamp': PrimitiveIDLTypeInfo('DOMTimeStamp', dart_type='int', native _type='unsigned long long'),
748 'object': PrimitiveIDLTypeInfo('object', dart_type='Object', native_type='Sc riptValue'), 774 'object': PrimitiveIDLTypeInfo('object', dart_type='Object', native_type='Sc riptValue'),
749 'PositionOptions': PrimitiveIDLTypeInfo('PositionOptions', dart_type='Object '), 775 'PositionOptions': PrimitiveIDLTypeInfo('PositionOptions', dart_type='Object '),
750 # TODO(sra): Come up with some meaningful name so that where this appears in 776 # TODO(sra): Come up with some meaningful name so that where this appears in
751 # the documentation, the user is made aware that only a limited subset of 777 # the documentation, the user is made aware that only a limited subset of
752 # serializable types are actually permitted. 778 # serializable types are actually permitted.
753 'SerializedScriptValue': PrimitiveIDLTypeInfo('SerializedScriptValue', dart_ type='Dynamic'), 779 'SerializedScriptValue': PrimitiveIDLTypeInfo('SerializedScriptValue', dart_ type='Dynamic'),
754 # TODO(sra): Flags is really a dictionary: {create:bool, exclusive:bool} 780 # TODO(sra): Flags is really a dictionary: {create:bool, exclusive:bool}
755 # http://dev.w3.org/2009/dap/file-system/file-dir-sys.html#the-flags-interfa ce 781 # http://dev.w3.org/2009/dap/file-system/file-dir-sys.html#the-flags-interfa ce
756 'WebKitFlags': PrimitiveIDLTypeInfo('WebKitFlags', dart_type='Object'), 782 'WebKitFlags': PrimitiveIDLTypeInfo('WebKitFlags', dart_type='Object'),
757 783
758 'sequence': PrimitiveIDLTypeInfo('sequence', dart_type='List'), 784 'sequence': PrimitiveIDLTypeInfo('sequence', dart_type='List'),
759 'void': PrimitiveIDLTypeInfo('void', dart_type='void'), 785 'void': PrimitiveIDLTypeInfo('void', dart_type='void'),
760 786
761 'CSSRule': IDLTypeInfo('CSSRule', conversion_includes=['CSSImportRule']), 787 'CSSRule': IDLTypeInfo('CSSRule', conversion_includes=['CSSImportRule']),
762 'DOMException': IDLTypeInfo('DOMException', native_type='DOMCoreException'), 788 'DOMException': IDLTypeInfo('DOMException', native_type='DOMCoreException'),
789 'DOMString[]': DOMStringArrayTypeInfo(),
podivilov 2012/06/21 08:33:57 Up to you, but I really prefer a special case in G
763 'DOMStringList': IDLTypeInfo('DOMStringList', dart_type='List<String>', cust om_to_native=True), 790 'DOMStringList': IDLTypeInfo('DOMStringList', dart_type='List<String>', cust om_to_native=True),
764 'DOMStringMap': IDLTypeInfo('DOMStringMap', dart_type='Map<String, String>') , 791 'DOMStringMap': IDLTypeInfo('DOMStringMap', dart_type='Map<String, String>') ,
765 'DOMWindow': IDLTypeInfo('DOMWindow', custom_to_dart=True), 792 'DOMWindow': IDLTypeInfo('DOMWindow', custom_to_dart=True),
766 'Element': IDLTypeInfo('Element', custom_to_dart=True), 793 'Element': IDLTypeInfo('Element', custom_to_dart=True),
767 'EventListener': IDLTypeInfo('EventListener', custom_to_native=True), 794 'EventListener': IDLTypeInfo('EventListener', custom_to_native=True),
768 'EventTarget': IDLTypeInfo('EventTarget', custom_to_native=True), 795 'EventTarget': IDLTypeInfo('EventTarget', custom_to_native=True),
769 'HTMLElement': IDLTypeInfo('HTMLElement', custom_to_dart=True), 796 'HTMLElement': IDLTypeInfo('HTMLElement', custom_to_dart=True),
770 'IDBAny': IDLTypeInfo('IDBAny', dart_type='Dynamic', custom_to_native=True), 797 'IDBAny': IDLTypeInfo('IDBAny', dart_type='Dynamic', custom_to_native=True),
771 'IDBKey': IDLTypeInfo('IDBKey', dart_type='Dynamic', custom_to_native=True), 798 'IDBKey': IDLTypeInfo('IDBKey', dart_type='Dynamic', custom_to_native=True),
772 'StyleSheet': IDLTypeInfo('StyleSheet', conversion_includes=['CSSStyleSheet' ]), 799 'StyleSheet': IDLTypeInfo('StyleSheet', conversion_includes=['CSSStyleSheet' ]),
(...skipping 18 matching lines...) Expand all
791 _svg_supplemental_includes = [ 818 _svg_supplemental_includes = [
792 '"SVGAnimatedPropertyTearOff.h"', 819 '"SVGAnimatedPropertyTearOff.h"',
793 '"SVGAnimatedListPropertyTearOff.h"', 820 '"SVGAnimatedListPropertyTearOff.h"',
794 '"SVGStaticListPropertyTearOff.h"', 821 '"SVGStaticListPropertyTearOff.h"',
795 '"SVGAnimatedListPropertyTearOff.h"', 822 '"SVGAnimatedListPropertyTearOff.h"',
796 '"SVGTransformListPropertyTearOff.h"', 823 '"SVGTransformListPropertyTearOff.h"',
797 '"SVGPathSegListPropertyTearOff.h"', 824 '"SVGPathSegListPropertyTearOff.h"',
798 ] 825 ]
799 826
800 def GetIDLTypeInfo(idl_type_name): 827 def GetIDLTypeInfo(idl_type_name):
828 type_info = _idl_type_registry.get(idl_type_name)
829 if type_info is not None:
830 return type_info
831
801 match = re.match(r'sequence<(\w+)>$', idl_type_name) 832 match = re.match(r'sequence<(\w+)>$', idl_type_name)
802 if match: 833 if match:
803 return SequenceIDLTypeInfo(idl_type_name, GetIDLTypeInfo(match.group(1))) 834 return SequenceIDLTypeInfo(idl_type_name, GetIDLTypeInfo(match.group(1)))
804 return _idl_type_registry.get(idl_type_name, IDLTypeInfo(idl_type_name)) 835
836 match = re.match(r'(\w+)\[\]$', idl_type_name)
837 if match:
838 return SequenceIDLTypeInfo(idl_type_name, GetIDLTypeInfo(match.group(1)))
839
840 return IDLTypeInfo(idl_type_name)
OLDNEW
« no previous file with comments | « lib/dom/scripts/dartgenerator.py ('k') | lib/dom/scripts/systemnative.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698