| 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 wrapping binding from the IDL database.""" | 7 wrapping binding from the IDL database.""" |
| 8 | 8 |
| 9 import os | 9 import os |
| 10 from generator import * | 10 from generator import * |
| (...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 164 | 164 |
| 165 def _AddGetter(self, attr): | 165 def _AddGetter(self, attr): |
| 166 # FIXME: Instead of injecting the interface name into the method when it is | 166 # FIXME: Instead of injecting the interface name into the method when it is |
| 167 # also implemented in the base class, suppress the method altogether if it | 167 # also implemented in the base class, suppress the method altogether if it |
| 168 # has the same signature. I.e., let the JS do the virtual dispatch instead. | 168 # has the same signature. I.e., let the JS do the virtual dispatch instead. |
| 169 method_name = self._MethodName('_get_', attr.id) | 169 method_name = self._MethodName('_get_', attr.id) |
| 170 self._members_emitter.Emit( | 170 self._members_emitter.Emit( |
| 171 '\n' | 171 '\n' |
| 172 ' $TYPE get $NAME() { return $METHOD(this); }\n' | 172 ' $TYPE get $NAME() { return $METHOD(this); }\n' |
| 173 ' static $TYPE $METHOD(var _this) native;\n', | 173 ' static $TYPE $METHOD(var _this) native;\n', |
| 174 NAME=attr.id, TYPE=attr.type.id, METHOD=method_name) | 174 NAME=attr.id, TYPE=DartType(attr.type.id), METHOD=method_name) |
| 175 | 175 |
| 176 def _AddSetter(self, attr): | 176 def _AddSetter(self, attr): |
| 177 # FIXME: See comment on getter. | 177 # FIXME: See comment on getter. |
| 178 method_name = self._MethodName('_set_', attr.id) | 178 method_name = self._MethodName('_set_', attr.id) |
| 179 self._members_emitter.Emit( | 179 self._members_emitter.Emit( |
| 180 '\n' | 180 '\n' |
| 181 ' void set $NAME($TYPE value) { $METHOD(this, value); }\n' | 181 ' void set $NAME($TYPE value) { $METHOD(this, value); }\n' |
| 182 ' static void $METHOD(var _this, $TYPE value) native;\n', | 182 ' static void $METHOD(var _this, $TYPE value) native;\n', |
| 183 NAME=attr.id, TYPE=attr.type.id, METHOD=method_name) | 183 NAME=attr.id, TYPE=DartType(attr.type.id), METHOD=method_name) |
| 184 | 184 |
| 185 def AddSecondaryAttribute(self, interface, getter, setter): | 185 def AddSecondaryAttribute(self, interface, getter, setter): |
| 186 self._SecondaryContext(interface) | 186 self._SecondaryContext(interface) |
| 187 self.AddAttribute(getter, setter) | 187 self.AddAttribute(getter, setter) |
| 188 | 188 |
| 189 def AddSecondaryOperation(self, interface, info): | 189 def AddSecondaryOperation(self, interface, info): |
| 190 self._SecondaryContext(interface) | 190 self._SecondaryContext(interface) |
| 191 self.AddOperation(info) | 191 self.AddOperation(info) |
| 192 | 192 |
| 193 def AddEventAttributes(self, event_attrs): | 193 def AddEventAttributes(self, event_attrs): |
| (...skipping 16 matching lines...) Expand all Loading... |
| 210 # interface Y extends X, List<T> ... | 210 # interface Y extends X, List<T> ... |
| 211 # | 211 # |
| 212 # In the non-root case we have to choose between: | 212 # In the non-root case we have to choose between: |
| 213 # | 213 # |
| 214 # class YImpl extends XImpl { add List<T> methods; } | 214 # class YImpl extends XImpl { add List<T> methods; } |
| 215 # | 215 # |
| 216 # and | 216 # and |
| 217 # | 217 # |
| 218 # class YImpl extends ListBase<T> { copies of transitive XImpl methods; } | 218 # class YImpl extends ListBase<T> { copies of transitive XImpl methods; } |
| 219 # | 219 # |
| 220 dart_element_type = DartType(element_type) |
| 220 if self._HasNativeIndexGetter(self._interface): | 221 if self._HasNativeIndexGetter(self._interface): |
| 221 self._EmitNativeIndexGetter(self._interface, element_type) | 222 self._EmitNativeIndexGetter(self._interface, dart_element_type) |
| 222 else: | 223 else: |
| 223 self._members_emitter.Emit( | 224 self._members_emitter.Emit( |
| 224 '\n' | 225 '\n' |
| 225 ' $TYPE operator[](int index) {\n' | 226 ' $TYPE operator[](int index) {\n' |
| 226 ' return item(index);\n' | 227 ' return item(index);\n' |
| 227 ' }\n', | 228 ' }\n', |
| 228 TYPE=element_type) | 229 TYPE=dart_element_type) |
| 229 | 230 |
| 230 if self._HasNativeIndexSetter(self._interface): | 231 if self._HasNativeIndexSetter(self._interface): |
| 231 self._EmitNativeIndexSetter(self._interface, element_type) | 232 self._EmitNativeIndexSetter(self._interface, dart_element_type) |
| 232 else: | 233 else: |
| 233 self._members_emitter.Emit( | 234 self._members_emitter.Emit( |
| 234 '\n' | 235 '\n' |
| 235 ' void operator[]=(int index, $TYPE value) {\n' | 236 ' void operator[]=(int index, $TYPE value) {\n' |
| 236 ' throw new UnsupportedOperationException("Cannot assign element of
immutable List.");\n' | 237 ' throw new UnsupportedOperationException("Cannot assign element of
immutable List.");\n' |
| 237 ' }\n', | 238 ' }\n', |
| 238 TYPE=element_type) | 239 TYPE=dart_element_type) |
| 239 | 240 |
| 240 self._members_emitter.Emit( | 241 self._members_emitter.Emit( |
| 241 '\n' | 242 '\n' |
| 242 ' void add($TYPE value) {\n' | 243 ' void add($TYPE value) {\n' |
| 243 ' throw new UnsupportedOperationException("Cannot add to immutable Li
st.");\n' | 244 ' throw new UnsupportedOperationException("Cannot add to immutable Li
st.");\n' |
| 244 ' }\n' | 245 ' }\n' |
| 245 '\n' | 246 '\n' |
| 246 ' void addLast($TYPE value) {\n' | 247 ' void addLast($TYPE value) {\n' |
| 247 ' throw new UnsupportedOperationException("Cannot add to immutable Li
st.");\n' | 248 ' throw new UnsupportedOperationException("Cannot add to immutable Li
st.");\n' |
| 248 ' }\n' | 249 ' }\n' |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 317 ' throw new NotImplementedException();\n' | 318 ' throw new NotImplementedException();\n' |
| 318 ' }\n' | 319 ' }\n' |
| 319 '\n' | 320 '\n' |
| 320 ' bool isEmpty() {\n' | 321 ' bool isEmpty() {\n' |
| 321 ' return length == 0;\n' | 322 ' return length == 0;\n' |
| 322 ' }\n' | 323 ' }\n' |
| 323 '\n' | 324 '\n' |
| 324 ' Iterator<$TYPE> iterator() {\n' | 325 ' Iterator<$TYPE> iterator() {\n' |
| 325 ' return new _FixedSizeListIterator<$TYPE>(this);\n' | 326 ' return new _FixedSizeListIterator<$TYPE>(this);\n' |
| 326 ' }\n', | 327 ' }\n', |
| 327 TYPE=element_type) | 328 TYPE=dart_element_type) |
| 328 | 329 |
| 329 def _HasNativeIndexGetter(self, interface): | 330 def _HasNativeIndexGetter(self, interface): |
| 330 return ('IndexedGetter' in interface.ext_attrs or | 331 return ('IndexedGetter' in interface.ext_attrs or |
| 331 'NumericIndexedGetter' in interface.ext_attrs) | 332 'NumericIndexedGetter' in interface.ext_attrs) |
| 332 | 333 |
| 333 def _EmitNativeIndexGetter(self, interface, element_type): | 334 def _EmitNativeIndexGetter(self, interface, dart_element_type): |
| 334 method_name = '_index' | 335 method_name = '_index' |
| 335 self._members_emitter.Emit( | 336 self._members_emitter.Emit( |
| 336 '\n' | 337 '\n' |
| 337 ' $TYPE operator[](int index) { return $METHOD(this, index); }\n' | 338 ' $TYPE operator[](int index) { return $METHOD(this, index); }\n' |
| 338 ' static $TYPE $METHOD(var _this, int index) native;\n', | 339 ' static $TYPE $METHOD(var _this, int index) native;\n', |
| 339 TYPE=element_type, METHOD=method_name) | 340 TYPE=dart_element_type, METHOD=method_name) |
| 340 | 341 |
| 341 def _HasNativeIndexSetter(self, interface): | 342 def _HasNativeIndexSetter(self, interface): |
| 342 return 'CustomIndexedSetter' in interface.ext_attrs | 343 return 'CustomIndexedSetter' in interface.ext_attrs |
| 343 | 344 |
| 344 def _EmitNativeIndexSetter(self, interface, element_type): | 345 def _EmitNativeIndexSetter(self, interface, dart_element_type): |
| 345 method_name = '_set_index' | 346 method_name = '_set_index' |
| 346 self._members_emitter.Emit( | 347 self._members_emitter.Emit( |
| 347 '\n' | 348 '\n' |
| 348 ' void operator[]=(int index, $TYPE value) {\n' | 349 ' void operator[]=(int index, $TYPE value) {\n' |
| 349 ' return $METHOD(this, index, value);\n' | 350 ' return $METHOD(this, index, value);\n' |
| 350 ' }\n' | 351 ' }\n' |
| 351 ' static $METHOD(_this, index, value) native;\n', | 352 ' static $METHOD(_this, index, value) native;\n', |
| 352 TYPE=element_type, METHOD=method_name) | 353 TYPE=dart_element_type, METHOD=method_name) |
| 353 | 354 |
| 354 def AddOperation(self, info): | 355 def AddOperation(self, info): |
| 355 """ | 356 """ |
| 356 Arguments: | 357 Arguments: |
| 357 info: An OperationInfo object. | 358 info: An OperationInfo object. |
| 358 """ | 359 """ |
| 359 body = self._members_emitter.Emit( | 360 body = self._members_emitter.Emit( |
| 360 '\n' | 361 '\n' |
| 361 ' $TYPE $NAME($PARAMS) {\n' | 362 ' $TYPE $NAME($PARAMS) {\n' |
| 362 '$!BODY' | 363 '$!BODY' |
| (...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 457 positive = [] | 458 positive = [] |
| 458 negative = [] | 459 negative = [] |
| 459 first_overload = overloads[0] | 460 first_overload = overloads[0] |
| 460 (param_name, param_type, param_default) = info.arg_infos[position] | 461 (param_name, param_type, param_default) = info.arg_infos[position] |
| 461 | 462 |
| 462 if position < len(first_overload.arguments): | 463 if position < len(first_overload.arguments): |
| 463 # FIXME: This will not work if the second overload has a more | 464 # FIXME: This will not work if the second overload has a more |
| 464 # precise type than the first. E.g., | 465 # precise type than the first. E.g., |
| 465 # void foo(Node x); | 466 # void foo(Node x); |
| 466 # void foo(Element x); | 467 # void foo(Element x); |
| 467 type = first_overload.arguments[position].type.id | 468 type = DartType(first_overload.arguments[position].type.id) |
| 468 test = TypeCheck(param_name, type) | 469 test = TypeCheck(param_name, type) |
| 469 pred = lambda op: len(op.arguments) > position and op.arguments[position].
type.id == type | 470 pred = lambda op: len(op.arguments) > position and DartType(op.arguments[p
osition].type.id) == type |
| 470 else: | 471 else: |
| 471 type = None | 472 type = None |
| 472 test = NullCheck(param_name) | 473 test = NullCheck(param_name) |
| 473 pred = lambda op: position >= len(op.arguments) | 474 pred = lambda op: position >= len(op.arguments) |
| 474 | 475 |
| 475 for overload in overloads: | 476 for overload in overloads: |
| 476 if pred(overload): | 477 if pred(overload): |
| 477 positive.append(overload) | 478 positive.append(overload) |
| 478 else: | 479 else: |
| 479 negative.append(overload) | 480 negative.append(overload) |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 511 # dispatch has removed f(X), leaving only f(Y), but there is no guarantee | 512 # dispatch has removed f(X), leaving only f(Y), but there is no guarantee |
| 512 # that Y = Z-X, so we need to check for Y. | 513 # that Y = Z-X, so we need to check for Y. |
| 513 true_code = emitter.Emit( | 514 true_code = emitter.Emit( |
| 514 '$(INDENT)if ($COND) {\n' | 515 '$(INDENT)if ($COND) {\n' |
| 515 '$!TRUE' | 516 '$!TRUE' |
| 516 '$(INDENT)}\n', | 517 '$(INDENT)}\n', |
| 517 COND=test, INDENT=indent) | 518 COND=test, INDENT=indent) |
| 518 self.GenerateDispatch( | 519 self.GenerateDispatch( |
| 519 true_code, info, indent + ' ', position + 1, positive) | 520 true_code, info, indent + ' ', position + 1, positive) |
| 520 return True | 521 return True |
| OLD | NEW |