Chromium Code Reviews| 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 472 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 483 source_filter) | 483 source_filter) |
| 484 for system in self._systems] | 484 for system in self._systems] |
| 485 | 485 |
| 486 for generator in generators: | 486 for generator in generators: |
| 487 generator.StartInterface() | 487 generator.StartInterface() |
| 488 | 488 |
| 489 for const in sorted(interface.constants, ConstantOutputOrder): | 489 for const in sorted(interface.constants, ConstantOutputOrder): |
| 490 for generator in generators: | 490 for generator in generators: |
| 491 generator.AddConstant(const) | 491 generator.AddConstant(const) |
| 492 | 492 |
| 493 for attr in sorted(interface.attributes, AttributeOutputOrder): | 493 attributes = [attr for attr in interface.attributes |
| 494 if attr.type.id == 'EventListener': | 494 if not self._OmitAttribute(interface, attr)] |
| 495 # Remove EventListener attributes like 'onclick' when addEventListener | 495 for (getter, setter) in _PairUpAttributes(attributes): |
| 496 # is available. | 496 for generator in generators: |
| 497 if 'EventTarget' in self._AllImplementedInterfaces(interface): | 497 generator.AddAttribute(getter, setter) |
| 498 continue | |
| 499 if attr.is_fc_getter: | |
| 500 for generator in generators: | |
| 501 generator.AddGetter(attr) | |
| 502 elif attr.is_fc_setter: | |
| 503 for generator in generators: | |
| 504 generator.AddSetter(attr) | |
| 505 | 498 |
| 506 # The implementation should define an indexer if the interface directly | 499 # The implementation should define an indexer if the interface directly |
| 507 # extends List. | 500 # extends List. |
| 508 element_type = MaybeListElementType(interface) | 501 element_type = MaybeListElementType(interface) |
| 509 if element_type: | 502 if element_type: |
| 510 for generator in generators: | 503 for generator in generators: |
| 511 generator.AddIndexer(element_type) | 504 generator.AddIndexer(element_type) |
| 512 | 505 |
| 513 # Group overloaded operations by id | 506 # Group overloaded operations by id |
| 514 operationsById = {} | 507 operationsById = {} |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 525 generator.AddOperation(info) | 518 generator.AddOperation(info) |
| 526 | 519 |
| 527 # With multiple inheritance, attributes and operations of non-first | 520 # With multiple inheritance, attributes and operations of non-first |
| 528 # interfaces need to be added. Sometimes the attribute or operation is | 521 # interfaces need to be added. Sometimes the attribute or operation is |
| 529 # defined in the current interface as well as a parent. In that case we | 522 # defined in the current interface as well as a parent. In that case we |
| 530 # avoid making a duplicate definition and pray that the signatures match. | 523 # avoid making a duplicate definition and pray that the signatures match. |
| 531 | 524 |
| 532 for parent_interface in self._TransitiveSecondaryParents(interface): | 525 for parent_interface in self._TransitiveSecondaryParents(interface): |
| 533 if isinstance(parent_interface, str): # _IsDartCollectionType(parent_inte rface) | 526 if isinstance(parent_interface, str): # _IsDartCollectionType(parent_inte rface) |
| 534 continue | 527 continue |
| 535 attributes = sorted(parent_interface.attributes, | 528 attributes = [attr for attr in parent_interface.attributes |
| 536 AttributeOutputOrder) | 529 if not self._DefinesSameAttribute(interface, attr)] |
| 537 for attr in attributes: | 530 for (getter, setter) in _PairUpAttributes(attributes): |
| 538 if not self._DefinesSameAttribute(interface, attr): | 531 for generator in generators: |
| 539 if attr.is_fc_getter: | 532 generator.AddSecondaryAttribute(parent_interface, getter, setter) |
| 540 for generator in generators: | |
| 541 generator.AddSecondaryGetter(parent_interface, attr) | |
| 542 elif attr.is_fc_setter: | |
| 543 for generator in generators: | |
| 544 generator.AddSecondarySetter(parent_interface, attr) | |
| 545 | 533 |
| 546 # Group overloaded operations by id | 534 # Group overloaded operations by id |
| 547 operationsById = {} | 535 operationsById = {} |
| 548 for operation in parent_interface.operations: | 536 for operation in parent_interface.operations: |
| 549 if operation.id not in operationsById: | 537 if operation.id not in operationsById: |
| 550 operationsById[operation.id] = [] | 538 operationsById[operation.id] = [] |
| 551 operationsById[operation.id].append(operation) | 539 operationsById[operation.id].append(operation) |
| 552 | 540 |
| 553 # Generate operations | 541 # Generate operations |
| 554 for id in sorted(operationsById.keys()): | 542 for id in sorted(operationsById.keys()): |
| 555 if not any(op.id == id for op in interface.operations): | 543 if not any(op.id == id for op in interface.operations): |
| 556 operations = operationsById[id] | 544 operations = operationsById[id] |
| 557 info = _AnalyzeOperation(interface, operations) | 545 info = _AnalyzeOperation(interface, operations) |
| 558 for generator in generators: | 546 for generator in generators: |
| 559 generator.AddSecondaryOperation(parent_interface, info) | 547 generator.AddSecondaryOperation(parent_interface, info) |
| 560 | 548 |
| 561 for generator in generators: | 549 for generator in generators: |
| 562 generator.FinishInterface() | 550 generator.FinishInterface() |
| 563 return | 551 return |
| 564 | 552 |
| 553 def _OmitAttribute(self, interface, attr): | |
| 554 # Remove EventListener attributes like 'onclick' when addEventListener | |
| 555 # is available. | |
| 556 if attr.type.id == 'EventListener': | |
| 557 if 'EventTarget' in self._AllImplementedInterfaces(interface): | |
| 558 return True | |
| 559 return False | |
| 560 | |
| 565 def _DefinesSameAttribute(self, interface, attr1): | 561 def _DefinesSameAttribute(self, interface, attr1): |
| 566 return any(attr1.id == attr2.id | 562 return any(attr1.id == attr2.id |
| 567 and attr1.is_fc_getter == attr2.is_fc_getter | 563 and attr1.is_fc_getter == attr2.is_fc_getter |
| 568 and attr1.is_fc_setter == attr2.is_fc_setter | 564 and attr1.is_fc_setter == attr2.is_fc_setter |
| 569 for attr2 in interface.attributes) | 565 for attr2 in interface.attributes) |
| 570 | 566 |
| 571 def _TransitiveSecondaryParents(self, interface): | 567 def _TransitiveSecondaryParents(self, interface): |
| 572 """Returns a list of all non-primary parents. | 568 """Returns a list of all non-primary parents. |
| 573 | 569 |
| 574 The list contains the interface objects for interfaces defined in the | 570 The list contains the interface objects for interfaces defined in the |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 629 """Returns the info for the callback method if the interface smells like a | 625 """Returns the info for the callback method if the interface smells like a |
| 630 callback. | 626 callback. |
| 631 """ | 627 """ |
| 632 if 'Callback' not in interface.ext_attrs: return None | 628 if 'Callback' not in interface.ext_attrs: return None |
| 633 handlers = [op for op in interface.operations if op.id == 'handleEvent'] | 629 handlers = [op for op in interface.operations if op.id == 'handleEvent'] |
| 634 if not handlers: return None | 630 if not handlers: return None |
| 635 if not (handlers == interface.operations): return None | 631 if not (handlers == interface.operations): return None |
| 636 return _AnalyzeOperation(interface, handlers) | 632 return _AnalyzeOperation(interface, handlers) |
| 637 | 633 |
| 638 | 634 |
| 635 def _PairUpAttributes(attributes): | |
| 636 """Returns a list of (getter, setter) pairs sorted by name. | |
| 637 | |
| 638 One element of the pair may be None. | |
| 639 """ | |
| 640 names = sorted(set(attr.id for attr in attributes)) | |
| 641 getters = {} | |
| 642 setters = {} | |
| 643 for attr in attributes: | |
| 644 if attr.is_fc_getter: | |
| 645 getters[attr.id] = attr | |
| 646 elif attr.is_fc_setter: | |
| 647 setters[attr.id] = attr | |
| 648 return [(getters.get(id), setters.get(id)) for id in names] | |
| 649 | |
| 650 | |
| 639 def _AnalyzeOperation(interface, operations): | 651 def _AnalyzeOperation(interface, operations): |
| 640 """Makes operation calling convention decision for a set of overloads. | 652 """Makes operation calling convention decision for a set of overloads. |
| 641 | 653 |
| 642 Returns: An OperationInfo object. | 654 Returns: An OperationInfo object. |
| 643 """ | 655 """ |
| 644 | 656 |
| 645 # Zip together arguments from each overload by position, then convert | 657 # Zip together arguments from each overload by position, then convert |
| 646 # to a dart argument. | 658 # to a dart argument. |
| 647 | 659 |
| 648 # Given a list of overloaded arguments, choose a suitable name. | 660 # Given a list of overloaded arguments, choose a suitable name. |
| (...skipping 581 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1230 if (not self._super_interface or | 1242 if (not self._super_interface or |
| 1231 self._interface.id is self._super_interface): | 1243 self._interface.id is self._super_interface): |
| 1232 self._EmitConstant(self._members_emitter, constant) | 1244 self._EmitConstant(self._members_emitter, constant) |
| 1233 | 1245 |
| 1234 def _EmitConstant(self, emitter, constant): | 1246 def _EmitConstant(self, emitter, constant): |
| 1235 emitter.Emit('\n static final $TYPE $NAME = $VALUE;\n', | 1247 emitter.Emit('\n static final $TYPE $NAME = $VALUE;\n', |
| 1236 NAME=constant.id, | 1248 NAME=constant.id, |
| 1237 TYPE=constant.type.id, | 1249 TYPE=constant.type.id, |
| 1238 VALUE=constant.value) | 1250 VALUE=constant.value) |
| 1239 | 1251 |
| 1240 def AddGetter(self, attr): | 1252 def AddAttribute(self, getter, setter): |
| 1241 self._members_emitter.Emit('\n $TYPE get $NAME();\n', | 1253 if getter: |
| 1242 NAME=attr.id, TYPE=attr.type.id) | 1254 self._members_emitter.Emit('\n $TYPE get $NAME();\n', |
| 1243 | 1255 NAME=getter.id, TYPE=getter.type.id) |
| 1244 def AddSetter(self, attr): | 1256 if setter: |
| 1245 self._members_emitter.Emit('\n void set $NAME($TYPE value);\n', | 1257 self._members_emitter.Emit('\n void set $NAME($TYPE value);\n', |
| 1246 NAME=attr.id, TYPE=attr.type.id) | 1258 NAME=setter.id, TYPE=setter.type.id) |
| 1247 | 1259 |
| 1248 def AddIndexer(self, element_type): | 1260 def AddIndexer(self, element_type): |
| 1249 # Interface inherits all operations from List<element_type>. | 1261 # Interface inherits all operations from List<element_type>. |
| 1250 pass | 1262 pass |
| 1251 | 1263 |
| 1252 def AddOperation(self, info): | 1264 def AddOperation(self, info): |
| 1253 """ | 1265 """ |
| 1254 Arguments: | 1266 Arguments: |
| 1255 operations - contains the overloads, one or more operations with the same | 1267 operations - contains the overloads, one or more operations with the same |
| 1256 name. | 1268 name. |
| 1257 """ | 1269 """ |
| 1258 self._members_emitter.Emit('\n' | 1270 self._members_emitter.Emit('\n' |
| 1259 ' $TYPE $NAME($PARAMS);\n', | 1271 ' $TYPE $NAME($PARAMS);\n', |
| 1260 TYPE=info.type_name, | 1272 TYPE=info.type_name, |
| 1261 NAME=info.name, | 1273 NAME=info.name, |
| 1262 PARAMS=info.ParametersInterfaceDeclaration()) | 1274 PARAMS=info.ParametersInterfaceDeclaration()) |
| 1263 | 1275 |
| 1264 # Interfaces get secondary members directly via the superinterfaces. | 1276 # Interfaces get secondary members directly via the superinterfaces. |
| 1265 def AddSecondaryGetter(self, interface, attr): | 1277 def AddSecondaryAttribute(self, interface, getter, setter): |
| 1266 pass | 1278 pass |
| 1267 def AddSecondarySetter(self, interface, attr): | 1279 |
| 1268 pass | |
| 1269 def AddSecondaryOperation(self, interface, attr): | 1280 def AddSecondaryOperation(self, interface, attr): |
| 1270 pass | 1281 pass |
| 1271 | 1282 |
| 1272 | 1283 |
| 1273 # Given a sorted sequence of type identifiers, return an appropriate type | 1284 # Given a sorted sequence of type identifiers, return an appropriate type |
| 1274 # name | 1285 # name |
| 1275 def TypeName(typeIds, interface): | 1286 def TypeName(typeIds, interface): |
| 1276 # Dynamically type this field for now. | 1287 # Dynamically type this field for now. |
| 1277 return 'var' | 1288 return 'var' |
| 1278 | 1289 |
| (...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1374 def AddConstant(self, constant): | 1385 def AddConstant(self, constant): |
| 1375 # Constants are already defined on the interface. | 1386 # Constants are already defined on the interface. |
| 1376 pass | 1387 pass |
| 1377 | 1388 |
| 1378 def _MethodName(self, prefix, name): | 1389 def _MethodName(self, prefix, name): |
| 1379 method_name = prefix + name | 1390 method_name = prefix + name |
| 1380 if name in self._base_members: # Avoid illegal Dart 'static override'. | 1391 if name in self._base_members: # Avoid illegal Dart 'static override'. |
| 1381 method_name = method_name + '_' + self._interface.id | 1392 method_name = method_name + '_' + self._interface.id |
| 1382 return method_name | 1393 return method_name |
| 1383 | 1394 |
| 1384 def AddGetter(self, attr): | 1395 def AddAttribute(self, getter, setter): |
| 1396 if getter: | |
| 1397 self._AddGetter(getter) | |
| 1398 if setter: | |
| 1399 self._AddSetter(setter) | |
| 1400 | |
| 1401 def _AddGetter(self, attr): | |
| 1385 # FIXME: Instead of injecting the interface name into the method when it is | 1402 # FIXME: Instead of injecting the interface name into the method when it is |
| 1386 # also implemented in the base class, suppress the method altogether if it | 1403 # also implemented in the base class, suppress the method altogether if it |
| 1387 # has the same signature. I.e., let the JS do the virtual dispatch instead. | 1404 # has the same signature. I.e., let the JS do the virtual dispatch instead. |
| 1388 method_name = self._MethodName('_get_', attr.id) | 1405 method_name = self._MethodName('_get_', attr.id) |
| 1389 self._members_emitter.Emit( | 1406 self._members_emitter.Emit( |
| 1390 '\n' | 1407 '\n' |
| 1391 ' $TYPE get $NAME() { return $METHOD(this); }\n' | 1408 ' $TYPE get $NAME() { return $METHOD(this); }\n' |
| 1392 ' static $TYPE $METHOD(var _this) native;\n', | 1409 ' static $TYPE $METHOD(var _this) native;\n', |
| 1393 NAME=attr.id, TYPE=attr.type.id, METHOD=method_name) | 1410 NAME=attr.id, TYPE=attr.type.id, METHOD=method_name) |
| 1394 if (self._interface.id, attr.id) not in _custom_getters: | 1411 if (self._interface.id, attr.id) not in _custom_getters: |
| 1395 self._js_code.Emit( | 1412 self._js_code.Emit( |
| 1396 '\n' | 1413 '\n' |
| 1397 'function native_$(CLASS)_$(METHOD)(_this) {\n' | 1414 'function native_$(CLASS)_$(METHOD)(_this) {\n' |
| 1398 ' try {\n' | 1415 ' try {\n' |
| 1399 ' return __dom_wrap(_this.$dom.$NAME);\n' | 1416 ' return __dom_wrap(_this.$dom.$NAME);\n' |
| 1400 ' } catch (e) {\n' | 1417 ' } catch (e) {\n' |
| 1401 ' throw __dom_wrap_exception(e);\n' | 1418 ' throw __dom_wrap_exception(e);\n' |
| 1402 ' }\n' | 1419 ' }\n' |
| 1403 '}\n', | 1420 '}\n', |
| 1404 CLASS=self._class_name, NAME=attr.id, METHOD=method_name) | 1421 CLASS=self._class_name, NAME=attr.id, METHOD=method_name) |
| 1405 self._externs.add((self._interface.id, attr.id, 'attribute')) | 1422 self._externs.add((self._interface.id, attr.id, 'attribute')) |
| 1406 | 1423 |
| 1407 def AddSetter(self, attr): | 1424 def _AddSetter(self, attr): |
| 1408 # FIXME: See comment on getter. | 1425 # FIXME: See comment on getter. |
| 1409 method_name = self._MethodName('_set_', attr.id) | 1426 method_name = self._MethodName('_set_', attr.id) |
| 1410 self._members_emitter.Emit( | 1427 self._members_emitter.Emit( |
| 1411 '\n' | 1428 '\n' |
| 1412 ' void set $NAME($TYPE value) { $METHOD(this, value); }\n' | 1429 ' void set $NAME($TYPE value) { $METHOD(this, value); }\n' |
| 1413 ' static void $METHOD(var _this, $TYPE value) native;\n', | 1430 ' static void $METHOD(var _this, $TYPE value) native;\n', |
| 1414 NAME=attr.id, TYPE=attr.type.id, METHOD=method_name) | 1431 NAME=attr.id, TYPE=attr.type.id, METHOD=method_name) |
| 1415 self._js_code.Emit( | 1432 self._js_code.Emit( |
| 1416 '\n' | 1433 '\n' |
| 1417 'function native_$(CLASS)_$(METHOD)(_this, value) {\n' | 1434 'function native_$(CLASS)_$(METHOD)(_this, value) {\n' |
| 1418 ' try {\n' | 1435 ' try {\n' |
| 1419 ' _this.$dom.$NAME = __dom_unwrap(value);\n' | 1436 ' _this.$dom.$NAME = __dom_unwrap(value);\n' |
| 1420 ' } catch (e) {\n' | 1437 ' } catch (e) {\n' |
| 1421 ' throw __dom_wrap_exception(e);\n' | 1438 ' throw __dom_wrap_exception(e);\n' |
| 1422 ' }\n' | 1439 ' }\n' |
| 1423 '}\n', | 1440 '}\n', |
| 1424 CLASS=self._class_name, NAME=attr.id, METHOD=method_name) | 1441 CLASS=self._class_name, NAME=attr.id, METHOD=method_name) |
| 1425 self._externs.add((self._interface.id, attr.id, 'attribute')) | 1442 self._externs.add((self._interface.id, attr.id, 'attribute')) |
| 1426 | 1443 |
| 1427 def AddSecondaryGetter(self, interface, attr): | 1444 def AddSecondaryAttribute(self, interface, getter, setter): |
| 1428 self._SecondaryContext(interface) | 1445 self._SecondaryContext(interface) |
| 1429 self.AddGetter(attr) | 1446 self.AddAttribute(getter, setter) |
| 1430 | |
| 1431 def AddSecondarySetter(self, interface, attr): | |
| 1432 self._SecondaryContext(interface) | |
| 1433 self.AddSetter(attr) | |
| 1434 | 1447 |
| 1435 def AddSecondaryOperation(self, interface, info): | 1448 def AddSecondaryOperation(self, interface, info): |
| 1436 self._SecondaryContext(interface) | 1449 self._SecondaryContext(interface) |
| 1437 self.AddOperation(info) | 1450 self.AddOperation(info) |
| 1438 | 1451 |
| 1439 def _SecondaryContext(self, interface): | 1452 def _SecondaryContext(self, interface): |
| 1440 if interface is not self._current_secondary_parent: | 1453 if interface is not self._current_secondary_parent: |
| 1441 self._current_secondary_parent = interface | 1454 self._current_secondary_parent = interface |
| 1442 self._members_emitter.Emit('\n // From $WHERE\n', WHERE=interface.id) | 1455 self._members_emitter.Emit('\n // From $WHERE\n', WHERE=interface.id) |
| 1443 | 1456 |
| (...skipping 513 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1957 # Since we are currently generating native classes without interfaces, | 1970 # Since we are currently generating native classes without interfaces, |
| 1958 # generate the constants as part of the class. This will need to go away | 1971 # generate the constants as part of the class. This will need to go away |
| 1959 # if we revert back to generating interfaces. | 1972 # if we revert back to generating interfaces. |
| 1960 self._members_emitter.Emit('\n static final $TYPE $NAME = $VALUE;\n', | 1973 self._members_emitter.Emit('\n static final $TYPE $NAME = $VALUE;\n', |
| 1961 NAME=constant.id, | 1974 NAME=constant.id, |
| 1962 TYPE=constant.type.id, | 1975 TYPE=constant.type.id, |
| 1963 VALUE=constant.value) | 1976 VALUE=constant.value) |
| 1964 | 1977 |
| 1965 pass | 1978 pass |
| 1966 | 1979 |
| 1967 def AddGetter(self, attr): | 1980 def AddAttribute(self, getter, setter): |
| 1981 use_fields = True | |
| 1982 output_type = getter and self._NarrowOutputType(getter.type.id) | |
| 1983 input_type = setter and self._NarrowInputType(setter.type.id) | |
| 1984 if use_fields and getter and setter: | |
| 1985 if input_type == output_type: | |
| 1986 self._members_emitter.Emit( | |
| 1987 '\n $TYPE $NAME;\n', | |
| 1988 NAME=getter.id, TYPE=output_type) | |
| 1989 return | |
| 1990 if use_fields and getter and not setter: | |
| 1991 self._members_emitter.Emit( | |
| 1992 '\n final $TYPE $NAME;\n', | |
| 1993 NAME=getter.id, TYPE=output_type) | |
| 1994 return | |
| 1995 if getter: | |
|
vsm
2012/02/06 18:37:18
Do we ever fall past this?
| |
| 1996 self._AddGetter(getter) | |
| 1997 if setter: | |
| 1998 self._AddSetter(setter) | |
| 1999 | |
| 2000 def _AddGetter(self, attr): | |
| 1968 # TODO(sra): Remove native body when Issue 829 fixed. | 2001 # TODO(sra): Remove native body when Issue 829 fixed. |
| 1969 self._members_emitter.Emit( | 2002 self._members_emitter.Emit( |
| 1970 '\n $TYPE get $NAME() native "return this.$NAME;";\n', | 2003 '\n $TYPE get $NAME() native "return this.$NAME;";\n', |
| 1971 NAME=attr.id, TYPE=self._NarrowOutputType(attr.type.id)) | 2004 NAME=attr.id, TYPE=self._NarrowOutputType(attr.type.id)) |
| 1972 | 2005 |
| 1973 def AddSetter(self, attr): | 2006 def _AddSetter(self, attr): |
| 1974 # TODO(sra): Remove native body when Issue 829 fixed. | 2007 # TODO(sra): Remove native body when Issue 829 fixed. |
| 1975 self._members_emitter.Emit( | 2008 self._members_emitter.Emit( |
| 1976 '\n void set $NAME($TYPE value) native "this.$NAME = value;";\n', | 2009 '\n void set $NAME($TYPE value) native "this.$NAME = value;";\n', |
| 1977 NAME=attr.id, TYPE=self._NarrowInputType(attr.type.id)) | 2010 NAME=attr.id, TYPE=self._NarrowInputType(attr.type.id)) |
| 1978 | 2011 |
| 1979 def AddSecondaryGetter(self, interface, attr): | 2012 def AddSecondaryAttribute(self, interface, getter, setter): |
| 1980 self._SecondaryContext(interface) | 2013 self._SecondaryContext(interface) |
| 1981 self.AddGetter(attr) | 2014 self.AddAttribute(getter, setter) |
| 1982 | |
| 1983 def AddSecondarySetter(self, interface, attr): | |
| 1984 self._SecondaryContext(interface) | |
| 1985 self.AddSetter(attr) | |
| 1986 | 2015 |
| 1987 def AddSecondaryOperation(self, interface, info): | 2016 def AddSecondaryOperation(self, interface, info): |
| 1988 self._SecondaryContext(interface) | 2017 self._SecondaryContext(interface) |
| 1989 self.AddOperation(info) | 2018 self.AddOperation(info) |
| 1990 | 2019 |
| 1991 def _SecondaryContext(self, interface): | 2020 def _SecondaryContext(self, interface): |
| 1992 if interface is not self._current_secondary_parent: | 2021 if interface is not self._current_secondary_parent: |
| 1993 self._current_secondary_parent = interface | 2022 self._current_secondary_parent = interface |
| 1994 self._members_emitter.Emit('\n // From $WHERE\n', WHERE=interface.id) | 2023 self._members_emitter.Emit('\n // From $WHERE\n', WHERE=interface.id) |
| 1995 | 2024 |
| (...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2176 def FinishInterface(self): | 2205 def FinishInterface(self): |
| 2177 interface = self._interface | 2206 interface = self._interface |
| 2178 interface_name = interface.id | 2207 interface_name = interface.id |
| 2179 | 2208 |
| 2180 base = self._BaseClassName(interface) | 2209 base = self._BaseClassName(interface) |
| 2181 self._dart_impl_emitter.Emit( | 2210 self._dart_impl_emitter.Emit( |
| 2182 self._templates.Load('dart_implementation.darttemplate'), | 2211 self._templates.Load('dart_implementation.darttemplate'), |
| 2183 CLASS=self._class_name, BASE=base, INTERFACE=interface_name, | 2212 CLASS=self._class_name, BASE=base, INTERFACE=interface_name, |
| 2184 MEMBERS=self._members_emitter.Fragments()) | 2213 MEMBERS=self._members_emitter.Fragments()) |
| 2185 | 2214 |
| 2186 def AddGetter(self, attr): | 2215 def AddAttribute(self, getter, setter): |
| 2216 if getter: | |
| 2217 self._AddGetter(getter) | |
| 2218 if setter: | |
| 2219 self._AddSetter(setter) | |
| 2220 | |
| 2221 def _AddGetter(self, attr): | |
| 2187 self._members_emitter.Emit( | 2222 self._members_emitter.Emit( |
| 2188 '\n' | 2223 '\n' |
| 2189 ' $TYPE get $NAME() native "$(INTERFACE)_$(NAME)_Getter";\n', | 2224 ' $TYPE get $NAME() native "$(INTERFACE)_$(NAME)_Getter";\n', |
| 2190 NAME=attr.id, TYPE=attr.type.id, INTERFACE=self._interface.id) | 2225 NAME=attr.id, TYPE=attr.type.id, INTERFACE=self._interface.id) |
| 2191 | 2226 |
| 2192 def AddSetter(self, attr): | 2227 def _AddSetter(self, attr): |
| 2193 self._members_emitter.Emit( | 2228 self._members_emitter.Emit( |
| 2194 '\n' | 2229 '\n' |
| 2195 ' void set $NAME($TYPE) native "$(INTERFACE)_$(NAME)_Setter";\n', | 2230 ' void set $NAME($TYPE) native "$(INTERFACE)_$(NAME)_Setter";\n', |
| 2196 NAME=attr.id, TYPE=attr.type.id, INTERFACE=self._interface.id) | 2231 NAME=attr.id, TYPE=attr.type.id, INTERFACE=self._interface.id) |
| 2197 | 2232 |
| 2198 def _HasNativeIndexGetter(self, interface): | 2233 def _HasNativeIndexGetter(self, interface): |
| 2199 return ('HasCustomIndexGetter' in interface.ext_attrs or | 2234 return ('HasCustomIndexGetter' in interface.ext_attrs or |
| 2200 'HasNumericIndexGetter' in interface.ext_attrs) | 2235 'HasNumericIndexGetter' in interface.ext_attrs) |
| 2201 | 2236 |
| 2202 def _EmitNativeIndexGetter(self, interface, element_type): | 2237 def _EmitNativeIndexGetter(self, interface, element_type): |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2277 INDENT=indent, | 2312 INDENT=indent, |
| 2278 NATIVENAME=native_name, | 2313 NATIVENAME=native_name, |
| 2279 ARGS=argument_expressions) | 2314 ARGS=argument_expressions) |
| 2280 | 2315 |
| 2281 self._members_emitter.Emit(' $TYPE $NATIVE_NAME($PARAMS) native ' | 2316 self._members_emitter.Emit(' $TYPE $NATIVE_NAME($PARAMS) native ' |
| 2282 '"$(INTERFACE)$(NATIVE_NAME)_Callback";\n', | 2317 '"$(INTERFACE)$(NATIVE_NAME)_Callback";\n', |
| 2283 NATIVE_NAME=native_name, | 2318 NATIVE_NAME=native_name, |
| 2284 TYPE=info.type_name, | 2319 TYPE=info.type_name, |
| 2285 PARAMS=', '.join(arg_names), | 2320 PARAMS=', '.join(arg_names), |
| 2286 INTERFACE=self._interface.id) | 2321 INTERFACE=self._interface.id) |
| OLD | NEW |