| 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 systems to generate | 6 """This module provides shared functionality for systems to generate |
| 7 Dart APIs from the IDL database.""" | 7 Dart APIs from the IDL database.""" |
| 8 | 8 |
| 9 import copy | 9 import copy |
| 10 import json | 10 import json |
| 11 import monitored | 11 import monitored |
| 12 import os | 12 import os |
| 13 import re | 13 import re |
| 14 from htmlrenamer import html_interface_renames, renamed_html_members | 14 from htmlrenamer import html_interface_renames, renamed_html_members, \ |
| 15 typed_array_renames |
| 15 | 16 |
| 16 # Set up json file for retrieving comments. | 17 # Set up json file for retrieving comments. |
| 17 _current_dir = os.path.dirname(__file__) | 18 _current_dir = os.path.dirname(__file__) |
| 18 _json_path = os.path.join(_current_dir, '..', 'docs', 'docs.json') | 19 _json_path = os.path.join(_current_dir, '..', 'docs', 'docs.json') |
| 19 _dom_json = json.load(open(_json_path)) | 20 _dom_json = json.load(open(_json_path)) |
| 20 | 21 |
| 21 _pure_interfaces = monitored.Set('generator._pure_interfaces', [ | 22 _pure_interfaces = monitored.Set('generator._pure_interfaces', [ |
| 22 # TODO(sra): DOMStringMap should be a class implementing Map<String,String>. | 23 # TODO(sra): DOMStringMap should be a class implementing Map<String,String>. |
| 23 'DOMStringMap', | 24 'DOMStringMap', |
| 24 'ElementTimeControl', | 25 'ElementTimeControl', |
| 25 'ElementTraversal', | 26 'ElementTraversal', |
| 26 'EventListener', | 27 'EventListener', |
| 27 'MediaQueryListListener', | 28 'MediaQueryListListener', |
| 28 'MutationCallback', | 29 'MutationCallback', |
| 29 'SVGExternalResourcesRequired', | 30 'SVGExternalResourcesRequired', |
| 30 'SVGFilterPrimitiveStandardAttributes', | 31 'SVGFilterPrimitiveStandardAttributes', |
| 31 'SVGFitToViewBox', | 32 'SVGFitToViewBox', |
| 32 'SVGLangSpace', | 33 'SVGLangSpace', |
| 33 'SVGLocatable', | 34 'SVGLocatable', |
| 34 'SVGTests', | 35 'SVGTests', |
| 35 'SVGTransformable', | 36 'SVGTransformable', |
| 36 'SVGURIReference', | 37 'SVGURIReference', |
| 37 'SVGZoomAndPan', | 38 'SVGZoomAndPan', |
| 38 'TimeoutHandler']) | 39 'TimeoutHandler', |
| 40 ]) |
| 39 | 41 |
| 40 def IsPureInterface(interface_name): | 42 def IsPureInterface(interface_name): |
| 41 return interface_name in _pure_interfaces | 43 return interface_name in _pure_interfaces |
| 42 | 44 |
| 45 _custom_types = monitored.Set('generator._custom_types', |
| 46 typed_array_renames.keys()) |
| 47 |
| 48 def IsCustomType(interface_name): |
| 49 return interface_name in _custom_types |
| 43 | 50 |
| 44 _methods_with_named_formals = monitored.Set( | 51 _methods_with_named_formals = monitored.Set( |
| 45 'generator._methods_with_named_formals', [ | 52 'generator._methods_with_named_formals', [ |
| 46 'DataView.getFloat32', | |
| 47 'DataView.getFloat64', | |
| 48 'DataView.getInt16', | |
| 49 'DataView.getInt32', | |
| 50 'DataView.getInt8', | |
| 51 'DataView.getUint16', | |
| 52 'DataView.getUint32', | |
| 53 'DataView.getUint8', | |
| 54 'DataView.setFloat32', | |
| 55 'DataView.setFloat64', | |
| 56 'DataView.setInt16', | |
| 57 'DataView.setInt32', | |
| 58 'DataView.setInt8', | |
| 59 'DataView.setUint16', | |
| 60 'DataView.setUint32', | |
| 61 'DataView.setUint8', | |
| 62 'DirectoryEntry.getDirectory', | 53 'DirectoryEntry.getDirectory', |
| 63 'DirectoryEntry.getFile', | 54 'DirectoryEntry.getFile', |
| 64 'Entry.copyTo', | 55 'Entry.copyTo', |
| 65 'Entry.moveTo', | 56 'Entry.moveTo', |
| 66 'HTMLInputElement.setRangeText', | 57 'HTMLInputElement.setRangeText', |
| 67 'XMLHttpRequest.open', | 58 'XMLHttpRequest.open', |
| 68 ]) | 59 ]) |
| 69 | 60 |
| 70 # | 61 # |
| 71 # Renames for attributes that have names that are not legal Dart names. | 62 # Renames for attributes that have names that are not legal Dart names. |
| 72 # | 63 # |
| 73 _dart_attribute_renames = monitored.Dict('generator._dart_attribute_renames', { | 64 _dart_attribute_renames = monitored.Dict('generator._dart_attribute_renames', { |
| 74 'default': 'defaultValue', | 65 'default': 'defaultValue', |
| 75 }) | 66 }) |
| 76 | 67 |
| 77 # | 68 # |
| 78 # Interface version of the DOM needs to delegate typed array constructors to a | 69 # Interface version of the DOM needs to delegate typed array constructors to a |
| 79 # factory provider. | 70 # factory provider. |
| 80 # | 71 # |
| 81 interface_factories = monitored.Dict('generator.interface_factories', { | 72 interface_factories = monitored.Dict('generator.interface_factories', { |
| 82 'Float32Array': '_TypedArrayFactoryProvider', | |
| 83 'Float64Array': '_TypedArrayFactoryProvider', | |
| 84 'Int8Array': '_TypedArrayFactoryProvider', | |
| 85 'Int16Array': '_TypedArrayFactoryProvider', | |
| 86 'Int32Array': '_TypedArrayFactoryProvider', | |
| 87 'Uint8Array': '_TypedArrayFactoryProvider', | |
| 88 'Uint8ClampedArray': '_TypedArrayFactoryProvider', | |
| 89 'Uint16Array': '_TypedArrayFactoryProvider', | |
| 90 'Uint32Array': '_TypedArrayFactoryProvider', | |
| 91 }) | 73 }) |
| 92 | 74 |
| 93 # | 75 # |
| 94 # Custom native specs for the dart2js dom. | 76 # Custom native specs for the dart2js dom. |
| 95 # | 77 # |
| 96 _dart2js_dom_custom_native_specs = monitored.Dict( | 78 _dart2js_dom_custom_native_specs = monitored.Dict( |
| 97 'generator._dart2js_dom_custom_native_specs', { | 79 'generator._dart2js_dom_custom_native_specs', { |
| 98 # Decorate the singleton Console object, if present (workers do not have a | 80 # Decorate the singleton Console object, if present (workers do not have a |
| 99 # console). | 81 # console). |
| 100 'Console': "=(typeof console == 'undefined' ? {} : console)", | 82 'Console': "=(typeof console == 'undefined' ? {} : console)", |
| (...skipping 289 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 390 def _ConstructorFullName(self, rename_type): | 372 def _ConstructorFullName(self, rename_type): |
| 391 if self.constructor_name: | 373 if self.constructor_name: |
| 392 return rename_type(self.type_name) + '.' + self.constructor_name | 374 return rename_type(self.type_name) + '.' + self.constructor_name |
| 393 else: | 375 else: |
| 394 # TODO(antonm): temporary ugly hack. | 376 # TODO(antonm): temporary ugly hack. |
| 395 # While in transition phase we allow both DOM's ArrayBuffer | 377 # While in transition phase we allow both DOM's ArrayBuffer |
| 396 # and dart:typeddata's ByteBuffer for IDLs' ArrayBuffers, | 378 # and dart:typeddata's ByteBuffer for IDLs' ArrayBuffers, |
| 397 # hence ArrayBuffer is mapped to dynamic in arguments and return | 379 # hence ArrayBuffer is mapped to dynamic in arguments and return |
| 398 # values. To compensate for that when generating ArrayBuffer itself, | 380 # values. To compensate for that when generating ArrayBuffer itself, |
| 399 # we need to lie a bit: | 381 # we need to lie a bit: |
| 400 if self.type_name == 'ArrayBuffer': return 'ArrayBuffer' | 382 if self.type_name == 'ArrayBuffer': return 'ByteBuffer' |
| 401 return rename_type(self.type_name) | 383 return rename_type(self.type_name) |
| 402 | 384 |
| 403 def ConstantOutputOrder(a, b): | 385 def ConstantOutputOrder(a, b): |
| 404 """Canonical output ordering for constants.""" | 386 """Canonical output ordering for constants.""" |
| 405 return cmp(a.id, b.id) | 387 return cmp(a.id, b.id) |
| 406 | 388 |
| 407 | 389 |
| 408 def _FormatNameList(names): | 390 def _FormatNameList(names): |
| 409 """Returns JavaScript array literal expression with one name per line.""" | 391 """Returns JavaScript array literal expression with one name per line.""" |
| 410 #names = sorted(names) | 392 #names = sorted(names) |
| (...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 545 # used to assemble the annotations: | 527 # used to assemble the annotations: |
| 546 # | 528 # |
| 547 # INTERFACE.MEMBER: annotations for member. | 529 # INTERFACE.MEMBER: annotations for member. |
| 548 # +TYPE: add annotations only if there are member annotations. | 530 # +TYPE: add annotations only if there are member annotations. |
| 549 # -TYPE: add annotations only if there are no member annotations. | 531 # -TYPE: add annotations only if there are no member annotations. |
| 550 # TYPE: add regardless of member annotations. | 532 # TYPE: add regardless of member annotations. |
| 551 | 533 |
| 552 dart2js_annotations = monitored.Dict('generator.dart2js_annotations', { | 534 dart2js_annotations = monitored.Dict('generator.dart2js_annotations', { |
| 553 | 535 |
| 554 'ArrayBuffer': [ | 536 'ArrayBuffer': [ |
| 555 "@Creates('ArrayBuffer')", | 537 "@Creates('ByteBuffer')", |
| 556 "@Returns('ArrayBuffer|Null')", | 538 "@Returns('ByteBuffer|Null')", |
| 557 ], | 539 ], |
| 558 | 540 |
| 559 'ArrayBufferView': [ | 541 'ArrayBufferView': [ |
| 560 "@Creates('ArrayBufferView')", | 542 "@Creates('TypedData')", |
| 561 "@Returns('ArrayBufferView|Null')", | 543 "@Returns('TypedData|Null')", |
| 562 ], | 544 ], |
| 563 | 545 |
| 564 'CanvasRenderingContext2D.createImageData': [ | 546 'CanvasRenderingContext2D.createImageData': [ |
| 565 "@Creates('ImageData|=Object')", | 547 "@Creates('ImageData|=Object')", |
| 566 ], | 548 ], |
| 567 | 549 |
| 568 'CanvasRenderingContext2D.getImageData': [ | 550 'CanvasRenderingContext2D.getImageData': [ |
| 569 "@Creates('ImageData|=Object')", | 551 "@Creates('ImageData|=Object')", |
| 570 ], | 552 ], |
| 571 | 553 |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 611 "@Creates('Node')", | 593 "@Creates('Node')", |
| 612 "@Returns('EventTarget|=Object')", | 594 "@Returns('EventTarget|=Object')", |
| 613 ], | 595 ], |
| 614 | 596 |
| 615 # Touch targets are Elements in a Document, or the Document. | 597 # Touch targets are Elements in a Document, or the Document. |
| 616 'Touch.target': [ | 598 'Touch.target': [ |
| 617 "@Creates('Element|Document')", | 599 "@Creates('Element|Document')", |
| 618 "@Returns('Element|Document')", | 600 "@Returns('Element|Document')", |
| 619 ], | 601 ], |
| 620 | 602 |
| 621 'FileReader.result': ["@Creates('String|ArrayBuffer|Null')"], | 603 'FileReader.result': ["@Creates('String|ByteBuffer|Null')"], |
| 622 | 604 |
| 623 # Rather than have the result of an IDBRequest as a union over all possible | 605 # Rather than have the result of an IDBRequest as a union over all possible |
| 624 # results, we mark the result as instantiating any classes, and mark | 606 # results, we mark the result as instantiating any classes, and mark |
| 625 # each operation with the classes that it could cause to be asynchronously | 607 # each operation with the classes that it could cause to be asynchronously |
| 626 # instantiated. | 608 # instantiated. |
| 627 'IDBRequest.result': ["@Creates('Null')"], | 609 'IDBRequest.result': ["@Creates('Null')"], |
| 628 | 610 |
| 629 # The source is usually a participant in the operation that generated the | 611 # The source is usually a participant in the operation that generated the |
| 630 # IDBRequest. | 612 # IDBRequest. |
| 631 'IDBRequest.source': ["@Creates('Null')"], | 613 'IDBRequest.source': ["@Creates('Null')"], |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 680 'SerializedScriptValue': [ | 662 'SerializedScriptValue': [ |
| 681 "@annotation_Creates_SerializedScriptValue", | 663 "@annotation_Creates_SerializedScriptValue", |
| 682 "@annotation_Returns_SerializedScriptValue", | 664 "@annotation_Returns_SerializedScriptValue", |
| 683 ], | 665 ], |
| 684 | 666 |
| 685 'SQLResultSetRowList.item': ["@Creates('=Object')"], | 667 'SQLResultSetRowList.item': ["@Creates('=Object')"], |
| 686 | 668 |
| 687 'WebGLRenderingContext.getParameter': [ | 669 'WebGLRenderingContext.getParameter': [ |
| 688 # Taken from http://www.khronos.org/registry/webgl/specs/latest/ | 670 # Taken from http://www.khronos.org/registry/webgl/specs/latest/ |
| 689 # Section 5.14.3 Setting and getting state | 671 # Section 5.14.3 Setting and getting state |
| 690 "@Creates('Null|num|String|bool|=List|Float32Array|Int32Array|Uint32Array" | 672 "@Creates('Null|num|String|bool|=List|Float32List|Int32List|Uint32List" |
| 691 "|Framebuffer|Renderbuffer|Texture')", | 673 "|Framebuffer|Renderbuffer|Texture')", |
| 692 "@Returns('Null|num|String|bool|=List|Float32Array|Int32Array|Uint32Array" | 674 "@Returns('Null|num|String|bool|=List|Float32List|Int32List|Uint32List" |
| 693 "|Framebuffer|Renderbuffer|Texture')", | 675 "|Framebuffer|Renderbuffer|Texture')", |
| 694 ], | 676 ], |
| 695 | 677 |
| 696 'XMLHttpRequest.response': [ | 678 'XMLHttpRequest.response': [ |
| 697 "@Creates('ArrayBuffer|Blob|Document|=Object|=List|String|num')", | 679 "@Creates('ByteBuffer|Blob|Document|=Object|=List|String|num')", |
| 698 ], | 680 ], |
| 699 }, dart2jsOnly=True) | 681 }, dart2jsOnly=True) |
| 700 | 682 |
| 701 _indexed_db_annotations = [ | 683 _indexed_db_annotations = [ |
| 702 "@SupportedBrowser(SupportedBrowser.CHROME)", | 684 "@SupportedBrowser(SupportedBrowser.CHROME)", |
| 703 "@SupportedBrowser(SupportedBrowser.FIREFOX, '15')", | 685 "@SupportedBrowser(SupportedBrowser.FIREFOX, '15')", |
| 704 "@SupportedBrowser(SupportedBrowser.IE, '10')", | 686 "@SupportedBrowser(SupportedBrowser.IE, '10')", |
| 705 "@Experimental", | 687 "@Experimental", |
| 706 ] | 688 ] |
| 707 | 689 |
| (...skipping 756 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1464 | 1446 |
| 1465 'Float32Array': TypedArrayTypeData('double'), | 1447 'Float32Array': TypedArrayTypeData('double'), |
| 1466 'Float64Array': TypedArrayTypeData('double'), | 1448 'Float64Array': TypedArrayTypeData('double'), |
| 1467 'Int8Array': TypedArrayTypeData('int'), | 1449 'Int8Array': TypedArrayTypeData('int'), |
| 1468 'Int16Array': TypedArrayTypeData('int'), | 1450 'Int16Array': TypedArrayTypeData('int'), |
| 1469 'Int32Array': TypedArrayTypeData('int'), | 1451 'Int32Array': TypedArrayTypeData('int'), |
| 1470 'Uint8Array': TypedArrayTypeData('int'), | 1452 'Uint8Array': TypedArrayTypeData('int'), |
| 1471 'Uint8ClampedArray': TypedArrayTypeData('int'), | 1453 'Uint8ClampedArray': TypedArrayTypeData('int'), |
| 1472 'Uint16Array': TypedArrayTypeData('int'), | 1454 'Uint16Array': TypedArrayTypeData('int'), |
| 1473 'Uint32Array': TypedArrayTypeData('int'), | 1455 'Uint32Array': TypedArrayTypeData('int'), |
| 1474 # TODO(antonm): temporary ugly hack. | 1456 'ArrayBufferView': TypeData(clazz='Interface', |
| 1475 # While in transition phase we allow both DOM's ArrayBuffer | |
| 1476 # and dart:typeddata's ByteBuffer for IDLs' ArrayBuffers, | |
| 1477 # hence ArrayBuffer is mapped to dynamic in arguments and return | |
| 1478 # values. | |
| 1479 'ArrayBufferView': TypeData(clazz='Interface', dart_type='dynamic', | |
| 1480 custom_to_native=True, custom_to_dart=True), | 1457 custom_to_native=True, custom_to_dart=True), |
| 1481 'ArrayBuffer': TypeData(clazz='Interface', dart_type='dynamic', | 1458 'ArrayBuffer': TypeData(clazz='Interface', |
| 1482 custom_to_native=True, custom_to_dart=True), | 1459 custom_to_native=True, custom_to_dart=True), |
| 1483 | 1460 |
| 1484 'SVGAngle': TypeData(clazz='SVGTearOff'), | 1461 'SVGAngle': TypeData(clazz='SVGTearOff'), |
| 1485 'SVGLength': TypeData(clazz='SVGTearOff'), | 1462 'SVGLength': TypeData(clazz='SVGTearOff'), |
| 1486 'SVGLengthList': TypeData(clazz='SVGTearOff', item_type='SVGLength'), | 1463 'SVGLengthList': TypeData(clazz='SVGTearOff', item_type='SVGLength'), |
| 1487 'SVGMatrix': TypeData(clazz='SVGTearOff'), | 1464 'SVGMatrix': TypeData(clazz='SVGTearOff'), |
| 1488 'SVGNumber': TypeData(clazz='SVGTearOff', native_type='SVGPropertyTearOff<fl
oat>'), | 1465 'SVGNumber': TypeData(clazz='SVGTearOff', native_type='SVGPropertyTearOff<fl
oat>'), |
| 1489 'SVGNumberList': TypeData(clazz='SVGTearOff', item_type='SVGNumber'), | 1466 'SVGNumberList': TypeData(clazz='SVGTearOff', item_type='SVGNumber'), |
| 1490 'SVGPathSegList': TypeData(clazz='SVGTearOff', item_type='SVGPathSeg', | 1467 'SVGPathSegList': TypeData(clazz='SVGTearOff', item_type='SVGPathSeg', |
| 1491 native_type='SVGPathSegListPropertyTearOff'), | 1468 native_type='SVGPathSegListPropertyTearOff'), |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1559 self) | 1536 self) |
| 1560 | 1537 |
| 1561 if type_data.clazz == 'SVGTearOff': | 1538 if type_data.clazz == 'SVGTearOff': |
| 1562 dart_interface_name = self._renamer.RenameInterface( | 1539 dart_interface_name = self._renamer.RenameInterface( |
| 1563 self._database.GetInterface(type_name)) | 1540 self._database.GetInterface(type_name)) |
| 1564 return SVGTearOffIDLTypeInfo( | 1541 return SVGTearOffIDLTypeInfo( |
| 1565 type_name, type_data, dart_interface_name, self) | 1542 type_name, type_data, dart_interface_name, self) |
| 1566 | 1543 |
| 1567 class_name = '%sIDLTypeInfo' % type_data.clazz | 1544 class_name = '%sIDLTypeInfo' % type_data.clazz |
| 1568 return globals()[class_name](type_name, type_data) | 1545 return globals()[class_name](type_name, type_data) |
| OLD | NEW |