| OLD | NEW |
| 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 library js.transformer.js_initializer_generator; | 5 library js.transformer.js_initializer_generator; |
| 6 | 6 |
| 7 import 'package:js/src/js_elements.dart'; | 7 import 'package:js/src/js_elements.dart'; |
| 8 import 'package:logging/logging.dart'; | 8 import 'package:logging/logging.dart'; |
| 9 import 'package:quiver/iterables.dart'; | 9 import 'package:quiver/iterables.dart'; |
| 10 | 10 |
| 11 final _logger = new Logger('js.transformer.js_initializer_generator'); | 11 final _logger = new Logger('js.transformer.js_initializer_generator'); |
| 12 | 12 |
| 13 const JS_PREFIX = '__package_js_impl__'; | 13 const JS_PREFIX = '__package_js_impl__'; |
| 14 const JS_THIS_REF = '__js_this_ref__'; | 14 const JS_THIS_REF = '__js_this_ref__'; |
| 15 | 15 |
| 16 class JsInitializerGenerator { | 16 class JsInitializerGenerator { |
| 17 final String libraryName; | 17 final String libraryName; |
| 18 final String libraryPath; | 18 final String libraryPath; |
| 19 final JsElements jsElements; | 19 final JsElements jsElements; |
| 20 | 20 |
| 21 final buffer = new StringBuffer(); | 21 final buffer = new StringBuffer(); |
| 22 | 22 |
| 23 JsInitializerGenerator(this.libraryName, this.libraryPath, this.jsElements); | 23 JsInitializerGenerator(this.libraryName, this.libraryPath, this.jsElements); |
| 24 | 24 |
| 25 /** | 25 /** |
| 26 * Returns the transformed source. | 26 * Returns the transformed source. |
| 27 */ | 27 */ |
| 28 String generate() { | 28 String generate() { |
| 29 buffer.write( | 29 jsElements.exportedLibraries.values.forEach((l) { |
| 30 ''' | 30 buffer.writeln("_export_${l.getPath('_')}(dart);"); |
| 31 library ${libraryName}__init_js__; | |
| 32 | |
| 33 import 'dart:js' as js; | |
| 34 import '${libraryPath}'; | |
| 35 import 'package:js/src/js_impl.dart' as $JS_PREFIX; | |
| 36 | |
| 37 final _obj = js.context['Object']; | |
| 38 | |
| 39 initializeJavaScriptLibrary() { | |
| 40 '''); | |
| 41 | |
| 42 jsElements.proxies.forEach((Proxy proxy) { | |
| 43 if (proxy.constructor == null) return; | |
| 44 var name = proxy.name; | |
| 45 buffer.writeln(" $JS_PREFIX.registerFactoryForJsConstructor(" | |
| 46 "$JS_PREFIX.context['${proxy.constructor}'], " | |
| 47 "($JS_PREFIX.JsObject o) => new $name.created(o));"); | |
| 48 }); | 31 }); |
| 49 | 32 jsElements.exportedLibraries.values.forEach(_generateLibraryExportFunction); |
| 50 buffer.writeln(" var lib = $JS_PREFIX.context['dart'];"); | |
| 51 | |
| 52 jsElements.exportedLibraries.values.forEach(_generateLibraryExportCall); | |
| 53 | |
| 54 buffer.writeln('}'); | |
| 55 | |
| 56 jsElements.exportedLibraries.values.forEach(_generateLibraryExportMethod); | |
| 57 | |
| 58 return buffer.toString(); | 33 return buffer.toString(); |
| 59 } | 34 } |
| 60 | 35 |
| 61 _generateLibraryExportCall(ExportedLibrary library) { | 36 _generateLibraryExportCall(ExportedLibrary library) { |
| 62 buffer.writeln(" _export_${library.getPath('_')}(lib);"); | 37 buffer.writeln(" _export_${library.getPath('_')}(lib);"); |
| 63 } | 38 } |
| 64 | 39 |
| 65 _generateLibraryExportMethod(ExportedLibrary library) { | 40 _generateLibraryExportFunction(ExportedLibrary library) { |
| 66 buffer.writeln( | 41 buffer.writeln( |
| 67 ''' | 42 ''' |
| 68 | 43 |
| 69 void _export_${library.getPath('_')}($JS_PREFIX.JsObject parent) { | 44 function _export_${library.getPath('_')}(parent) { |
| 70 JsObject lib = parent['${library.name}']; | 45 var lib = parent.${library.name} = {}; |
| 71 '''); | 46 '''); |
| 72 | 47 |
| 73 library.declarations.values.forEach(_generateDeclarationExportCall); | 48 library.declarations.values.forEach(_generateDeclarationExportCall); |
| 74 library.children.values.forEach(_generateLibraryExportCall); | 49 library.children.values.forEach(_generateLibraryExportCall); |
| 75 | 50 |
| 76 buffer.writeln('}'); | 51 buffer.writeln('}'); |
| 77 | 52 |
| 78 library.children.values.forEach(_generateLibraryExportMethod); | 53 library.children.values.forEach(_generateLibraryExportFunction); |
| 79 library.declarations.values.forEach(_generateDeclarationExport); | 54 library.declarations.values.forEach(_generateDeclarationExport); |
| 80 } | 55 } |
| 81 | 56 |
| 82 void _generateDeclarationExportCall(ExportedElement element) { | 57 void _generateDeclarationExportCall(ExportedElement element) { |
| 83 if (element is ExportedClass) { | 58 if (element is ExportedClass) { |
| 84 buffer.writeln(" _export_${element.getPath('_')}(lib);"); | 59 buffer.writeln(" _export_${element.getPath('_')}(lib);"); |
| 85 } | 60 } |
| 86 } | 61 } |
| 87 | 62 |
| 88 void _generateDeclarationExport(ExportedElement element) { | 63 void _generateDeclarationExport(ExportedElement element) { |
| 89 if (element is ExportedClass) { | 64 if (element is ExportedClass) { |
| 90 _generateClass(element); | 65 _generateClass(element); |
| 91 } | 66 } |
| 92 } | 67 } |
| 93 | 68 |
| 94 void _generateClass(ExportedClass c) { | 69 void _generateClass(ExportedClass c) { |
| 95 buffer.writeln( | 70 buffer.writeln( |
| 96 ''' | 71 ''' |
| 97 | 72 |
| 98 void _export_${c.getPath('_')}($JS_PREFIX.JsObject parent) { | 73 function _export_${c.getPath('_')}(parent) { |
| 99 var constructor = parent['${c.name}']; | 74 var constructor = parent.${c.name} = function _${c.name}() { |
| 100 $JS_PREFIX.registerJsConstructorForType(${c.name}, constructor['_wrapDartObjec
t']); | 75 this.__dart_object__ = constructor._new(); |
| 101 var prototype = constructor['prototype']; | 76 }; |
| 77 constructor.prototype = Object.create(dart.Object.prototype); |
| 78 constructor.prototype.constructor = constructor; |
| 79 constructor._wrapDartObject = function(dartObject) { |
| 80 var o = Object.create(constructor.prototype); |
| 81 o.__dart_object__ = dartObject; |
| 82 return o; |
| 83 }; |
| 84 |
| 102 '''); | 85 '''); |
| 103 | 86 |
| 104 c.children.values.forEach(_generateClassMember); | 87 c.children.values.forEach(_generateClassMember); |
| 105 | 88 |
| 106 buffer.writeln("}"); | 89 buffer.writeln("}"); |
| 107 } | 90 } |
| 108 | 91 |
| 109 void _generateClassMember(ExportedElement e) { | 92 void _generateClassMember(ExportedElement e) { |
| 110 if (e is ExportedConstructor) { | 93 if (e is ExportedConstructor) { |
| 111 _generateConstructor(e); | 94 _generateConstructor(e); |
| 112 } else if (e is ExportedMethod) { | |
| 113 _generateMethod(e); | |
| 114 } else if (e is ExportedField) { | |
| 115 _generateField(e); | |
| 116 } | 95 } |
| 117 } | 96 } |
| 118 | 97 |
| 119 void _generateConstructor(ExportedConstructor c) { | 98 void _generateConstructor(ExportedConstructor c) { |
| 120 var constructorName = c.name == '' ? '_new' : '_new_${c.name}'; | 99 if (c.name == '') return; |
| 100 var constructorName = '_new_${c.name}'; |
| 101 |
| 121 var dartParameters = _getDartParameters(c.parameters); | 102 var dartParameters = _getDartParameters(c.parameters); |
| 122 var jsParameters = _getJsParameters(c.parameters); | 103 var jsParameters = _getJsParameters(c.parameters); |
| 123 var namedPart = c.name == '' ? '' : '.${c.name}'; | 104 var namedPart = c.name == '' ? '' : '.${c.name}'; |
| 124 buffer.writeln(" print('exporting constructor: ${constructorName}');"); | 105 buffer.writeln( |
| 125 buffer.writeln(" constructor['$constructorName'] = ($jsParameters) => " | 106 ''' |
| 126 "new ${c.parent.name}$namedPart($dartParameters);"); | 107 constructor.${c.name} = function _${c.name}($jsParameters) { |
| 108 this.__dart_object__ = constructor.$constructorName($jsParameters); |
| 127 } | 109 } |
| 110 constructor.${c.name}.prototype = constructor.prototype; |
| 111 '''); |
| 112 } |
| 128 | 113 |
| 129 void _generateMethod(ExportedMethod c) { | 114 void _generateMethod(ExportedMethod c) { |
| 130 var dartParameters = _getDartParameters(c.parameters); | 115 var dartParameters = _getDartParameters(c.parameters); |
| 131 var jsParameters = _getJsParameters(c.parameters, withThis: true); | 116 var jsParameters = _getJsParameters(c.parameters, withThis: true); |
| 132 buffer.write( | 117 buffer.write( |
| 133 ''' | 118 ''' |
| 134 | 119 |
| 135 // method ${c.name} | 120 // method ${c.name} |
| 136 prototype['${c.name}'] = new js.JsFunction.withThis(($jsParameters) { | 121 prototype['${c.name}'] = new js.JsFunction.withThis(($jsParameters) { |
| 137 return $JS_THIS_REF.${c.name}($dartParameters); | 122 return $JS_THIS_REF.${c.name}($dartParameters); |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 191 var dartParameters = concat([ | 176 var dartParameters = concat([ |
| 192 requiredParameters, | 177 requiredParameters, |
| 193 positionalParameters, | 178 positionalParameters, |
| 194 dartNamedParameters]) | 179 dartNamedParameters]) |
| 195 .join(', '); | 180 .join(', '); |
| 196 | 181 |
| 197 return dartParameters; | 182 return dartParameters; |
| 198 } | 183 } |
| 199 | 184 |
| 200 } | 185 } |
| OLD | NEW |