| 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 provides shared functionality for the systems to generate | 6 """This module provides shared functionality for the systems to generate |
| 7 frog binding from the IDL database.""" | 7 frog binding from the IDL database.""" |
| 8 | 8 |
| 9 import os | 9 import os |
| 10 from generator import * | 10 from generator import * |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 104 elif native_spec[0] == '=': | 104 elif native_spec[0] == '=': |
| 105 # The implementation is a singleton with no prototype. | 105 # The implementation is a singleton with no prototype. |
| 106 extends = '' | 106 extends = '' |
| 107 else: | 107 else: |
| 108 extends = ' extends _DOMTypeJs' | 108 extends = ' extends _DOMTypeJs' |
| 109 | 109 |
| 110 # TODO: Include all implemented interfaces, including other Lists. | 110 # TODO: Include all implemented interfaces, including other Lists. |
| 111 implements = [interface_name] | 111 implements = [interface_name] |
| 112 element_type = MaybeTypedArrayElementType(self._interface) | 112 element_type = MaybeTypedArrayElementType(self._interface) |
| 113 if element_type: | 113 if element_type: |
| 114 implements.append('List<%s>' % DartType(element_type)) | 114 implements.append('List<%s>' % self._DartType(element_type)) |
| 115 | 115 |
| 116 self._members_emitter = self._dart_code.Emit( | 116 self._members_emitter = self._dart_code.Emit( |
| 117 self._template, | 117 self._template, |
| 118 #class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC { | 118 #class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC { |
| 119 #$!MEMBERS | 119 #$!MEMBERS |
| 120 #} | 120 #} |
| 121 CLASSNAME=self._class_name, | 121 CLASSNAME=self._class_name, |
| 122 EXTENDS=extends, | 122 EXTENDS=extends, |
| 123 IMPLEMENTS=' implements ' + ', '.join(implements), | 123 IMPLEMENTS=' implements ' + ', '.join(implements), |
| 124 NATIVESPEC=' native "' + native_spec + '"') | 124 NATIVESPEC=' native "' + native_spec + '"') |
| (...skipping 16 matching lines...) Expand all Loading... |
| 141 template = self._system._templates.TryLoad(template_file) | 141 template = self._system._templates.TryLoad(template_file) |
| 142 if not template: | 142 if not template: |
| 143 template = self._system._templates.Load('factoryprovider.darttemplate') | 143 template = self._system._templates.Load('factoryprovider.darttemplate') |
| 144 | 144 |
| 145 factory_provider = '_' + interface_name + 'FactoryProvider' | 145 factory_provider = '_' + interface_name + 'FactoryProvider' |
| 146 emitter = self._system._ImplFileEmitter(factory_provider) | 146 emitter = self._system._ImplFileEmitter(factory_provider) |
| 147 emitter.Emit( | 147 emitter.Emit( |
| 148 template, | 148 template, |
| 149 FACTORYPROVIDER=factory_provider, | 149 FACTORYPROVIDER=factory_provider, |
| 150 CONSTRUCTOR=interface_name, | 150 CONSTRUCTOR=interface_name, |
| 151 PARAMETERS=constructor_info.ParametersImplementationDeclaration(), | 151 PARAMETERS=constructor_info.ParametersImplementationDeclaration(self._Da
rtType), |
| 152 NAMEDCONSTRUCTOR=constructor_info.name or interface_name, | 152 NAMEDCONSTRUCTOR=constructor_info.name or interface_name, |
| 153 ARGUMENTS=constructor_info.ParametersAsArgumentList()) | 153 ARGUMENTS=constructor_info.ParametersAsArgumentList()) |
| 154 | 154 |
| 155 def _ShouldNarrowToImplementationType(self, type_name): | 155 def _ShouldNarrowToImplementationType(self, type_name): |
| 156 # TODO(sra): Move into the 'system' and cache the result. | 156 # TODO(sra): Move into the 'system' and cache the result. |
| 157 if type_name == 'EventListener': | 157 do_not_narrow = ['DOMStringList', 'DOMStringMap', 'EventListener', |
| 158 # Callbacks are typedef functions so don't have a class. | 158 'IDBAny', 'IDBKey', 'MediaQueryListListener'] |
| 159 if type_name in do_not_narrow: |
| 159 return False | 160 return False |
| 160 if self._system._database.HasInterface(type_name): | 161 if self._system._database.HasInterface(type_name): |
| 161 interface = self._system._database.GetInterface(type_name) | 162 interface = self._system._database.GetInterface(type_name) |
| 162 if RecognizeCallback(interface): | 163 if RecognizeCallback(interface): |
| 163 # Callbacks are typedef functions so don't have a class. | 164 # Callbacks are typedef functions so don't have a class. |
| 164 return False | 165 return False |
| 165 elif type_name == 'MediaQueryListListener': | 166 return True |
| 166 # Somewhat like a callback. See Issue 3338. | |
| 167 return False | |
| 168 else: | |
| 169 return True | |
| 170 return False | 167 return False |
| 171 | 168 |
| 172 def _NarrowToImplementationType(self, type_name): | 169 def _NarrowToImplementationType(self, type_name): |
| 173 if self._ShouldNarrowToImplementationType(type_name): | 170 if self._ShouldNarrowToImplementationType(type_name): |
| 174 return self._ImplClassName(type_name) | 171 return self._ImplClassName(self._DartType(type_name)) |
| 175 return type_name | 172 return self._DartType(type_name) |
| 176 | 173 |
| 177 def _NarrowInputType(self, type_name): | 174 def _NarrowInputType(self, type_name): |
| 178 return self._NarrowToImplementationType(DartType(type_name)) | 175 return self._NarrowToImplementationType(type_name) |
| 179 | 176 |
| 180 def _NarrowOutputType(self, type_name): | 177 def _NarrowOutputType(self, type_name): |
| 181 return self._NarrowToImplementationType(DartType(type_name)) | 178 return self._NarrowToImplementationType(type_name) |
| 182 | 179 |
| 183 def AddConstant(self, constant): | 180 def AddConstant(self, constant): |
| 184 # Since we are currently generating native classes without interfaces, | 181 # Since we are currently generating native classes without interfaces, |
| 185 # generate the constants as part of the class. This will need to go away | 182 # generate the constants as part of the class. This will need to go away |
| 186 # if we revert back to generating interfaces. | 183 # if we revert back to generating interfaces. |
| 187 self._members_emitter.Emit('\n static final $TYPE $NAME = $VALUE;\n', | 184 self._members_emitter.Emit('\n static final $TYPE $NAME = $VALUE;\n', |
| 188 NAME=constant.id, | 185 NAME=constant.id, |
| 189 TYPE=DartType(constant.type.id), | 186 TYPE=self._DartType(constant.type.id), |
| 190 VALUE=constant.value) | 187 VALUE=constant.value) |
| 191 | 188 |
| 192 pass | 189 pass |
| 193 | 190 |
| 194 def OverrideMember(self, member): | 191 def OverrideMember(self, member): |
| 195 return self._interface.id + '.' + member in _dom_frog_omitted_members | 192 return self._interface.id + '.' + member in _dom_frog_omitted_members |
| 196 | 193 |
| 197 def AddAttribute(self, attribute): | 194 def AddAttribute(self, attribute): |
| 198 getter = attribute | 195 getter = attribute |
| 199 setter = attribute if not IsReadOnly(attribute) else None | 196 setter = attribute if not IsReadOnly(attribute) else None |
| 200 if getter and self.OverrideMember('get:' + getter.id): | 197 if getter and self.OverrideMember('get:' + getter.id): |
| 201 getter = None | 198 getter = None |
| 202 if setter and self.OverrideMember('set:' + setter.id): | 199 if setter and self.OverrideMember('set:' + setter.id): |
| 203 setter = None | 200 setter = None |
| 204 if not getter and not setter: | 201 if not getter and not setter: |
| 205 return | 202 return |
| 206 | 203 |
| 207 output_type = getter and self._NarrowOutputType(getter.type.id) | 204 output_type = getter and self._NarrowOutputType(getter.type.id) |
| 208 input_type = setter and self._NarrowInputType(setter.type.id) | 205 input_type = setter and self._NarrowInputType(setter.type.id) |
| 209 | 206 |
| 210 # If the (getter, setter) pair is shadowing, we can't generate a shadowing | 207 # If the (getter, setter) pair is shadowing, we can't generate a shadowing |
| 211 # field (Issue 1633). | 208 # field (Issue 1633). |
| 212 (super_getter, super_getter_interface) = self._FindShadowedAttribute(getter) | 209 (super_getter, super_getter_interface) = self._FindShadowedAttribute(getter) |
| 213 (super_setter, super_setter_interface) = self._FindShadowedAttribute(setter) | 210 (super_setter, super_setter_interface) = self._FindShadowedAttribute(setter) |
| 214 if super_getter or super_setter: | 211 if super_getter or super_setter: |
| 215 if getter and not setter and super_getter and not super_setter: | 212 if getter and not setter and super_getter and not super_setter: |
| 216 if DartType(getter.type.id) == DartType(super_getter.type.id): | 213 if self._DartType(getter.type.id) == self._DartType(super_getter.type.id
): |
| 217 # Compatible getter, use the superclass property. This works because | 214 # Compatible getter, use the superclass property. This works because |
| 218 # JavaScript will do its own dynamic dispatch. | 215 # JavaScript will do its own dynamic dispatch. |
| 219 self._members_emitter.Emit( | 216 self._members_emitter.Emit( |
| 220 '\n' | 217 '\n' |
| 221 ' // Use implementation from $SUPER.\n' | 218 ' // Use implementation from $SUPER.\n' |
| 222 ' // final $TYPE $NAME;\n', | 219 ' // final $TYPE $NAME;\n', |
| 223 SUPER=super_getter_interface, | 220 SUPER=super_getter_interface, |
| 224 NAME=DartDomNameOfAttribute(getter), | 221 NAME=DartDomNameOfAttribute(getter), |
| 225 TYPE=output_type) | 222 TYPE=output_type) |
| 226 return | 223 return |
| (...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 360 '\n' | 357 '\n' |
| 361 ' void operator[]=(int index, $TYPE value) {\n' | 358 ' void operator[]=(int index, $TYPE value) {\n' |
| 362 ' throw new UnsupportedOperationException("Cannot assign element of
immutable List.");\n' | 359 ' throw new UnsupportedOperationException("Cannot assign element of
immutable List.");\n' |
| 363 ' }\n', | 360 ' }\n', |
| 364 TYPE=self._NarrowInputType(element_type)) | 361 TYPE=self._NarrowInputType(element_type)) |
| 365 | 362 |
| 366 # TODO(sra): Use separate mixins for mutable implementations of List<T>. | 363 # TODO(sra): Use separate mixins for mutable implementations of List<T>. |
| 367 # TODO(sra): Use separate mixins for typed array implementations of List<T>. | 364 # TODO(sra): Use separate mixins for typed array implementations of List<T>. |
| 368 template_file = 'immutable_list_mixin.darttemplate' | 365 template_file = 'immutable_list_mixin.darttemplate' |
| 369 template = self._system._templates.Load(template_file) | 366 template = self._system._templates.Load(template_file) |
| 370 self._members_emitter.Emit(template, E=DartType(element_type)) | 367 self._members_emitter.Emit(template, E=self._DartType(element_type)) |
| 371 | 368 |
| 372 def AddOperation(self, info): | 369 def AddOperation(self, info): |
| 373 """ | 370 """ |
| 374 Arguments: | 371 Arguments: |
| 375 info: An OperationInfo object. | 372 info: An OperationInfo object. |
| 376 """ | 373 """ |
| 377 # TODO(vsm): Handle overloads. | 374 # TODO(vsm): Handle overloads. |
| 378 params = info.ParametersImplementationDeclaration( | 375 params = info.ParametersImplementationDeclaration( |
| 379 lambda type_name: self._NarrowInputType(type_name)) | 376 lambda type_name: self._NarrowInputType(type_name)) |
| 380 | 377 |
| 381 native_string = '' | 378 native_string = '' |
| 382 if info.declared_name != info.name: | 379 if info.declared_name != info.name: |
| 383 native_string = " '%s'" % info.declared_name | 380 native_string = " '%s'" % info.declared_name |
| 384 | 381 |
| 385 native_body = dom_frog_native_bodies.get( | 382 native_body = dom_frog_native_bodies.get( |
| 386 self._interface.id + '.' + info.name, '') | 383 self._interface.id + '.' + info.name, '') |
| 387 if native_body: | 384 if native_body: |
| 388 native_string = " '''" + native_body + "'''" | 385 native_string = " '''" + native_body + "'''" |
| 389 | 386 |
| 390 self._members_emitter.Emit( | 387 self._members_emitter.Emit( |
| 391 '\n' | 388 '\n' |
| 392 ' $TYPE $NAME($PARAMS) native$NATIVESTRING;\n', | 389 ' $TYPE $NAME($PARAMS) native$NATIVESTRING;\n', |
| 393 TYPE=self._NarrowOutputType(info.type_name), | 390 TYPE=self._NarrowOutputType(info.type_name), |
| 394 NAME=info.name, | 391 NAME=info.name, |
| 395 PARAMS=params, | 392 PARAMS=params, |
| 396 NATIVESTRING=native_string) | 393 NATIVESTRING=native_string) |
| OLD | NEW |