OLD | NEW |
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 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 707 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
718 if optional: | 718 if optional: |
719 raise Exception('Optional arguments cannot precede required ones: ' | 719 raise Exception('Optional arguments cannot precede required ones: ' |
720 + str(args)) | 720 + str(args)) |
721 required.append((name, type, None)) | 721 required.append((name, type, None)) |
722 argtexts = map(FormatArg, required) | 722 argtexts = map(FormatArg, required) |
723 if optional: | 723 if optional: |
724 argtexts.append('[' + ', '.join(map(FormatArg, optional)) + ']') | 724 argtexts.append('[' + ', '.join(map(FormatArg, optional)) + ']') |
725 return ', '.join(argtexts) | 725 return ', '.join(argtexts) |
726 | 726 |
727 | 727 |
728 def MaybeListElementTypeName(type_name): | |
729 """Returns the List element type T from string of form "List<T>", or None.""" | |
730 match = re.match(r'List<(\w*)>$', type_name) | |
731 if match: | |
732 return match.group(1) | |
733 return None | |
734 | |
735 def MaybeListElementType(interface): | 728 def MaybeListElementType(interface): |
736 """Returns the List element type T, or None in interface does not implement | 729 """Returns the List element type T, or None in interface does not implement |
737 List<T>. | 730 List<T>. |
738 """ | 731 """ |
739 for parent in interface.parents: | 732 for parent in interface.parents: |
740 element_type = MaybeListElementTypeName(parent.type.id) | 733 match = re.match(r'List<(\w*)>$', parent.type.id) |
741 if element_type: | 734 if match: |
742 return element_type | 735 return match.group(1) |
743 return None | 736 return None |
744 | 737 |
745 def MaybeTypedArrayElementType(interface): | 738 def MaybeTypedArrayElementType(interface): |
746 """Returns the typed array element type, or None in interface is not a | 739 """Returns the typed array element type, or None in interface is not a |
747 TypedArray. | 740 TypedArray. |
748 """ | 741 """ |
749 # Typed arrays implement ArrayBufferView and List<T>. | 742 # Typed arrays implement ArrayBufferView and List<T>. |
750 for parent in interface.parents: | 743 for parent in interface.parents: |
751 if parent.type.id == 'ArrayBufferView': | 744 if parent.type.id == 'ArrayBufferView': |
752 return MaybeListElementType(interface) | 745 return MaybeListElementType(interface) |
(...skipping 1104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1857 native_spec = _frog_dom_custom_native_specs[interface_name] | 1850 native_spec = _frog_dom_custom_native_specs[interface_name] |
1858 else: | 1851 else: |
1859 # Make the class 'hidden' so it is dynamically patched at runtime. This | 1852 # Make the class 'hidden' so it is dynamically patched at runtime. This |
1860 # is useful not only for browser compat, but to allow code that links | 1853 # is useful not only for browser compat, but to allow code that links |
1861 # against dart:dom to load in a worker isolate. | 1854 # against dart:dom to load in a worker isolate. |
1862 native_spec = '*' + interface_name | 1855 native_spec = '*' + interface_name |
1863 | 1856 |
1864 if base: | 1857 if base: |
1865 extends = ' extends ' + base | 1858 extends = ' extends ' + base |
1866 elif native_spec[0] == '=': | 1859 elif native_spec[0] == '=': |
1867 # The implementation is a singleton with no prototype. | |
1868 extends = '' | 1860 extends = '' |
1869 else: | 1861 else: |
1870 extends = ' extends DOMTypeJs' | 1862 extends = ' extends DOMTypeJs' |
1871 | 1863 |
1872 # TODO: Include all implemented interfaces, including other Lists. | 1864 # TODO: Include all implemented interfaces, including other Lists. |
1873 implements = [interface_name] | 1865 implements = [interface_name] |
1874 element_type = MaybeTypedArrayElementType(self._interface) | 1866 element_type = MaybeTypedArrayElementType(self._interface) |
1875 if element_type: | 1867 if element_type: |
1876 implements.append('List<' + element_type + '>') | 1868 implements.append('List<' + element_type + '>') |
1877 | 1869 |
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1977 # In the non-root case we have to choose between: | 1969 # In the non-root case we have to choose between: |
1978 # | 1970 # |
1979 # class YImpl extends XImpl { add List<T> methods; } | 1971 # class YImpl extends XImpl { add List<T> methods; } |
1980 # | 1972 # |
1981 # and | 1973 # and |
1982 # | 1974 # |
1983 # class YImpl extends ListBase<T> { copies of transitive XImpl methods; } | 1975 # class YImpl extends ListBase<T> { copies of transitive XImpl methods; } |
1984 # | 1976 # |
1985 self._members_emitter.Emit( | 1977 self._members_emitter.Emit( |
1986 '\n' | 1978 '\n' |
1987 ' $TYPE operator[](int index) native "return this[index];";\n', | 1979 ' $TYPE operator[](int index) native;\n', |
1988 TYPE=self._NarrowOutputType(element_type)) | 1980 TYPE=self._NarrowOutputType(element_type)) |
1989 | 1981 |
1990 if 'HasCustomIndexSetter' in self._interface.ext_attrs: | 1982 if 'HasCustomIndexSetter' in self._interface.ext_attrs: |
1991 self._members_emitter.Emit( | 1983 self._members_emitter.Emit( |
1992 '\n' | 1984 '\n' |
1993 ' void operator[]=(int index, $TYPE value) native "this[index] = valu
e";\n', | 1985 ' void operator[]=(int index, $TYPE value) native;\n', |
1994 TYPE=self._NarrowInputType(element_type)) | 1986 TYPE=self._NarrowInputType(element_type)) |
1995 else: | 1987 else: |
1996 self._members_emitter.Emit( | 1988 self._members_emitter.Emit( |
1997 '\n' | 1989 '\n' |
1998 ' void operator[]=(int index, $TYPE value) {\n' | 1990 ' void operator[]=(int index, $TYPE value) {\n' |
1999 ' throw new UnsupportedOperationException("Cannot assign element of
immutable List.");\n' | 1991 ' throw new UnsupportedOperationException("Cannot assign element of
immutable List.");\n' |
2000 ' }\n', | 1992 ' }\n', |
2001 TYPE=self._NarrowInputType(element_type)) | 1993 TYPE=self._NarrowInputType(element_type)) |
2002 | 1994 |
2003 # TODO(sra): Use separate mixins for mutable implementations of List<T>. | |
2004 # TODO(sra): Use separate mixins for typed array implementations of List<T>. | |
2005 template_file = 'immutable_list_mixin.darttemplate' | |
2006 template = self._system._templates.Load(template_file) | |
2007 self._members_emitter.Emit(template, E=element_type) | |
2008 | |
2009 | 1995 |
2010 def AddTypedArrayConstructors(self, element_type): | 1996 def AddTypedArrayConstructors(self, element_type): |
2011 self._members_emitter.Emit( | 1997 self._members_emitter.Emit( |
2012 '\n' | 1998 '\n' |
2013 ' factory $CTOR(int length) => _construct(length);\n' | 1999 ' factory $CTOR(int length) => _construct(length);\n' |
2014 '\n' | 2000 '\n' |
2015 ' factory $CTOR.fromList(List<$TYPE> list) => _construct(list);\n' | 2001 ' factory $CTOR.fromList(List<$TYPE> list) => _construct(list);\n' |
2016 '\n' | 2002 '\n' |
2017 ' factory $CTOR.fromBuffer(ArrayBuffer buffer) => _construct(buffer);\n
' | 2003 ' factory $CTOR.fromBuffer(ArrayBuffer buffer) => _construct(buffer);\n
' |
2018 '\n' | 2004 '\n' |
2019 ' static _construct(arg) native \'return new $CTOR(arg);\';\n', | 2005 ' static _construct(arg) native \'return new $CTOR(arg);\';\n', |
2020 CTOR=self._interface.id, | 2006 CTOR=self._interface.id, |
2021 TYPE=element_type) | 2007 TYPE=element_type) |
2022 | 2008 |
2023 | 2009 |
2024 def AddOperation(self, info): | 2010 def AddOperation(self, info): |
2025 """ | 2011 """ |
2026 Arguments: | 2012 Arguments: |
2027 info: An OperationInfo object. | 2013 info: An OperationInfo object. |
2028 """ | 2014 """ |
2029 # TODO(vsm): Handle overloads. | 2015 # TODO(vsm): Handle overloads. |
2030 self._members_emitter.Emit( | 2016 self._members_emitter.Emit( |
2031 '\n' | 2017 '\n' |
2032 ' $TYPE $NAME($PARAMS) native;\n', | 2018 ' $TYPE $NAME($PARAMS) native;\n', |
2033 TYPE=self._NarrowOutputType(info.type_name), | 2019 TYPE=self._NarrowOutputType(info.type_name), |
2034 NAME=info.name, | 2020 NAME=info.name, |
2035 PARAMS=info.ParametersImplementationDeclaration( | 2021 PARAMS=info.ParametersImplementationDeclaration( |
2036 lambda type_name: self._NarrowInputType(type_name))) | 2022 lambda type_name: self._NarrowInputType(type_name))) |
OLD | NEW |