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 """This module generates Dart APIs from the IDL database.""" | 6 """This module generates Dart APIs from the IDL database.""" |
7 | 7 |
8 import emitter | 8 import emitter |
9 import idlnode | 9 import idlnode |
10 import logging | 10 import logging |
(...skipping 677 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
688 info.arg_infos = args | 688 info.arg_infos = args |
689 return info | 689 return info |
690 | 690 |
691 | 691 |
692 def Flush(self): | 692 def Flush(self): |
693 """Write out all pending files.""" | 693 """Write out all pending files.""" |
694 _logger.info('Flush...') | 694 _logger.info('Flush...') |
695 self._emitters.Flush() | 695 self._emitters.Flush() |
696 | 696 |
697 | 697 |
698 def FilePathForDartInterface(self, interface_name): | |
699 """Returns the file path of the Dart interface definition.""" | |
700 return os.path.join(self._output_dir, 'src', 'interface', | |
701 '%s.dart' % interface_name) | |
702 | |
703 | |
704 def FilePathForDartWrappingImpl(self, interface_name): | |
705 """Returns the file path of the Dart wrapping implementation.""" | |
706 return os.path.join(self._output_dir, 'src', 'wrapping', | |
707 '_%sWrappingImplementation.dart' % interface_name) | |
708 | |
709 def FilePathForFrogImpl(self, interface_name): | |
710 """Returns the file path of the Frog implementation.""" | |
711 return os.path.join(self._output_dir, 'src', 'frog', | |
712 '%s.dart' % interface_name) | |
713 | |
714 | |
715 def _ComputeInheritanceClosure(self): | 698 def _ComputeInheritanceClosure(self): |
716 def Collect(interface, seen, collected): | 699 def Collect(interface, seen, collected): |
717 name = interface.id | 700 name = interface.id |
718 if '<' in name: | 701 if '<' in name: |
719 # TODO(sra): Handle parameterized types. | 702 # TODO(sra): Handle parameterized types. |
720 return | 703 return |
721 if not name in seen: | 704 if not name in seen: |
722 seen.add(name) | 705 seen.add(name) |
723 collected.append(name) | 706 collected.append(name) |
724 for parent in interface.parents: | 707 for parent in interface.parents: |
(...skipping 10 matching lines...) Expand all Loading... |
735 Collect(interface, seen, collected) | 718 Collect(interface, seen, collected) |
736 self._inheritance_closure[interface.id] = collected | 719 self._inheritance_closure[interface.id] = collected |
737 | 720 |
738 def _AllImplementedInterfaces(self, interface): | 721 def _AllImplementedInterfaces(self, interface): |
739 """Returns a list of the names of all interfaces implemented by 'interface'. | 722 """Returns a list of the names of all interfaces implemented by 'interface'. |
740 List includes the name of 'interface'. | 723 List includes the name of 'interface'. |
741 """ | 724 """ |
742 return self._inheritance_closure[interface.id] | 725 return self._inheritance_closure[interface.id] |
743 | 726 |
744 | 727 |
745 | |
746 def _GenerateJavaScriptExternInterfaces(self, | |
747 database, | |
748 namespace, | |
749 window_code, | |
750 prop_code): | |
751 """Generate externs for JavaScript patch code. | |
752 """ | |
753 | |
754 props = set() | |
755 | |
756 for interface in database.GetInterfaces(): | |
757 self._GatherInterfacePropertyNames(interface, props) | |
758 | |
759 for name in sorted(list(props)): | |
760 prop_code.Emit('$NAMESPACE.prototype.$NAME;\n', | |
761 NAMESPACE=namespace, NAME=name) | |
762 | |
763 for interface in database.GetInterfaces(): | |
764 window_code.Emit('Window.prototype.$CLASSREF;\n', | |
765 CLASSREF=interface.id) | |
766 | |
767 | |
768 def _GatherInterfacePropertyNames(self, interface, props): | |
769 """Gather the properties that will be defined on the interface. | |
770 """ | |
771 | |
772 # Define getters and setters. | |
773 getters = [attr.id for attr in interface.attributes if attr.is_fc_getter] | |
774 setters = [attr.id for attr in interface.attributes if attr.is_fc_setter] | |
775 | |
776 for name in getters: | |
777 props.add(name + '$getter') | |
778 | |
779 for name in setters: | |
780 props.add(name + '$setter') | |
781 | |
782 # Define members. | |
783 operations = [op.ext_attrs.get('DartName', op.id) | |
784 for op in interface.operations] | |
785 members = sorted(set(operations)) | |
786 for name in members: | |
787 props.add(name + '$member') | |
788 | |
789 | |
790 class OperationInfo(object): | 728 class OperationInfo(object): |
791 """Holder for various derived information from a set of overloaded operations. | 729 """Holder for various derived information from a set of overloaded operations. |
792 | 730 |
793 Attributes: | 731 Attributes: |
794 overloads: A list of IDL operation overloads with the same name. | 732 overloads: A list of IDL operation overloads with the same name. |
795 name: A string, the simple name of the operation. | 733 name: A string, the simple name of the operation. |
796 type_name: A string, the name of the return type of the operation. | 734 type_name: A string, the name of the return type of the operation. |
797 arg_declarations: A list of strings, Dart argument declarations for the | 735 arg_declarations: A list of strings, Dart argument declarations for the |
798 member that implements the set of overloads. Each string is of the form | 736 member that implements the set of overloads. Each string is of the form |
799 "T arg" or "T arg = null". | 737 "T arg" or "T arg = null". |
(...skipping 1274 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2074 Arguments: | 2012 Arguments: |
2075 info: An OperationInfo object. | 2013 info: An OperationInfo object. |
2076 """ | 2014 """ |
2077 # TODO(vsm): Handle overloads. | 2015 # TODO(vsm): Handle overloads. |
2078 self._members_emitter.Emit( | 2016 self._members_emitter.Emit( |
2079 '\n' | 2017 '\n' |
2080 ' $TYPE $NAME($ARGS) native;\n', | 2018 ' $TYPE $NAME($ARGS) native;\n', |
2081 TYPE=info.type_name, | 2019 TYPE=info.type_name, |
2082 NAME=info.name, | 2020 NAME=info.name, |
2083 ARGS=info.arg_implementation_declaration) | 2021 ARGS=info.arg_implementation_declaration) |
OLD | NEW |