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 |