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.dart_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.dart_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 DartInitializerGenerator { |
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 DartInitializerGenerator(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 buffer.write( |
30 ''' | 30 ''' |
31 library ${libraryName}__init_js__; | 31 library ${libraryName}__init_js__; |
32 | 32 |
33 import 'dart:js' as js; | 33 import 'dart:js' as js; |
(...skipping 26 matching lines...) Expand all Loading... | |
60 | 60 |
61 _generateLibraryExportCall(ExportedLibrary library) { | 61 _generateLibraryExportCall(ExportedLibrary library) { |
62 buffer.writeln(" _export_${library.getPath('_')}(lib);"); | 62 buffer.writeln(" _export_${library.getPath('_')}(lib);"); |
63 } | 63 } |
64 | 64 |
65 _generateLibraryExportMethod(ExportedLibrary library) { | 65 _generateLibraryExportMethod(ExportedLibrary library) { |
66 buffer.writeln( | 66 buffer.writeln( |
67 ''' | 67 ''' |
68 | 68 |
69 void _export_${library.getPath('_')}($JS_PREFIX.JsObject parent) { | 69 void _export_${library.getPath('_')}($JS_PREFIX.JsObject parent) { |
70 JsObject lib = parent['${library.name}']; | 70 JsObject lib = parent['${library.name}']; |
alexandre.ardhuin
2014/09/19 12:38:59
JsObject should be prefixed by "js."
justinfagnani
2014/09/23 01:29:53
Done.
| |
71 '''); | 71 '''); |
72 | 72 |
73 library.declarations.values.forEach(_generateDeclarationExportCall); | 73 library.declarations.values.forEach(_generateDeclarationExportCall); |
74 library.children.values.forEach(_generateLibraryExportCall); | 74 library.children.values.forEach(_generateLibraryExportCall); |
75 | 75 |
76 buffer.writeln('}'); | 76 buffer.writeln('}'); |
77 | 77 |
78 library.children.values.forEach(_generateLibraryExportMethod); | 78 library.children.values.forEach(_generateLibraryExportMethod); |
79 library.declarations.values.forEach(_generateDeclarationExport); | 79 library.declarations.values.forEach(_generateDeclarationExport); |
80 } | 80 } |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
114 } else if (e is ExportedField) { | 114 } else if (e is ExportedField) { |
115 _generateField(e); | 115 _generateField(e); |
116 } | 116 } |
117 } | 117 } |
118 | 118 |
119 void _generateConstructor(ExportedConstructor c) { | 119 void _generateConstructor(ExportedConstructor c) { |
120 var constructorName = c.name == '' ? '_new' : '_new_${c.name}'; | 120 var constructorName = c.name == '' ? '_new' : '_new_${c.name}'; |
121 var dartParameters = _getDartParameters(c.parameters); | 121 var dartParameters = _getDartParameters(c.parameters); |
122 var jsParameters = _getJsParameters(c.parameters); | 122 var jsParameters = _getJsParameters(c.parameters); |
123 var namedPart = c.name == '' ? '' : '.${c.name}'; | 123 var namedPart = c.name == '' ? '' : '.${c.name}'; |
124 buffer.writeln(" print('exporting constructor: ${constructorName}');"); | |
125 buffer.writeln(" constructor['$constructorName'] = ($jsParameters) => " | 124 buffer.writeln(" constructor['$constructorName'] = ($jsParameters) => " |
126 "new ${c.parent.name}$namedPart($dartParameters);"); | 125 "new ${c.parent.name}$namedPart($dartParameters);"); |
127 } | 126 } |
128 | 127 |
129 void _generateMethod(ExportedMethod c) { | 128 void _generateMethod(ExportedMethod c) { |
130 var dartParameters = _getDartParameters(c.parameters); | 129 var dartParameters = _getDartParameters(c.parameters); |
131 var jsParameters = _getJsParameters(c.parameters, withThis: true); | 130 var jsParameters = _getJsParameters(c.parameters, withThis: true); |
132 buffer.write( | 131 buffer.write( |
133 ''' | 132 ''' |
134 | 133 |
135 // method ${c.name} | 134 // method ${c.name} |
136 prototype['${c.name}'] = new js.JsFunction.withThis(($jsParameters) { | 135 prototype['${c.name}'] = new js.JsFunction.withThis(($jsParameters) { |
137 return $JS_THIS_REF.${c.name}($dartParameters); | 136 return $JS_THIS_REF.${c.name}($dartParameters); |
138 }); | 137 }); |
139 '''); | 138 '''); |
140 } | 139 } |
141 | 140 |
142 void _generateField(ExportedField f) { | 141 void _generateField(ExportedField f) { |
alexandre.ardhuin
2014/09/19 12:39:00
static fields enter this function.
justinfagnani
2014/09/22 21:50:20
I fixed this in the next CL
| |
143 var name = f.name; | 142 var name = f.name; |
144 var className = f.parent.name; | 143 var className = f.parent.name; |
145 buffer.write( | 144 buffer.write( |
146 ''' | 145 ''' |
147 // field $name | 146 // field $name |
148 _obj.callMethod('defineProperty', [prototype, '$name', | 147 _obj.callMethod('defineProperty', [prototype, '$name', |
149 new js.JsObject.jsify({ | 148 new js.JsObject.jsify({ |
150 'get': new js.JsFunction.withThis((o) => (o[$JS_PREFIX.DART_OBJECT_PROPE RTY] as $className).$name), | 149 'get': new js.JsFunction.withThis((o) => (o[$JS_PREFIX.DART_OBJECT_PROPE RTY] as $className).$name), |
151 'set': new js.JsFunction.withThis((o, v) => (o[$JS_PREFIX.DART_OBJECT_PR OPERTY] as $className).$name = v), | 150 'set': new js.JsFunction.withThis((o, v) => (o[$JS_PREFIX.DART_OBJECT_PR OPERTY] as $className).$name = v), |
alexandre.ardhuin
2014/09/19 12:39:00
dart getters enter this function and shouldn't gen
justinfagnani
2014/09/22 21:50:20
Fixed in the next CL
| |
152 })]); | 151 })]); |
153 '''); | 152 '''); |
154 } | 153 } |
155 | 154 |
156 | 155 |
157 String _getJsParameters(List<ExportedParameter> parameters, | 156 String _getJsParameters(List<ExportedParameter> parameters, |
158 {bool withThis: false}) { | 157 {bool withThis: false}) { |
159 var requiredParameters = parameters | 158 var requiredParameters = parameters |
160 .where((p) => p.kind == ParameterKind.REQUIRED) | 159 .where((p) => p.kind == ParameterKind.REQUIRED) |
161 .map((p) => p.name); | 160 .map((p) => p.name); |
(...skipping 18 matching lines...) Expand all Loading... | |
180 var requiredParameters = parameters | 179 var requiredParameters = parameters |
181 .where((p) => p.kind == ParameterKind.REQUIRED) | 180 .where((p) => p.kind == ParameterKind.REQUIRED) |
182 .map((p) => p.name); | 181 .map((p) => p.name); |
183 var positionalParameters = parameters | 182 var positionalParameters = parameters |
184 .where((p) => p.kind == ParameterKind.POSITIONAL) | 183 .where((p) => p.kind == ParameterKind.POSITIONAL) |
185 .map((p) => p.name); | 184 .map((p) => p.name); |
186 var namedParameters = parameters | 185 var namedParameters = parameters |
187 .where((p) => p.kind == ParameterKind.NAMED) | 186 .where((p) => p.kind == ParameterKind.NAMED) |
188 .map((p) => p.name); | 187 .map((p) => p.name); |
189 var dartNamedParameters = namedParameters.map((name) => | 188 var dartNamedParameters = namedParameters.map((name) => |
190 "${name}: _getOptionalArg(__js_named_parameters_map__, '${name}')"); | 189 "${name}: _getOptionalArg(__js_named_parameters_map__, '${name}')"); |
alexandre.ardhuin
2014/09/19 12:38:59
_getOptionalArg doesn't seem to be defined ?
justinfagnani
2014/09/22 21:50:20
Acknowledged. I'll add tests for method invocation
| |
191 var dartParameters = concat([ | 190 var dartParameters = concat([ |
192 requiredParameters, | 191 requiredParameters, |
193 positionalParameters, | 192 positionalParameters, |
194 dartNamedParameters]) | 193 dartNamedParameters]) |
195 .join(', '); | 194 .join(', '); |
196 | 195 |
197 return dartParameters; | 196 return dartParameters; |
198 } | 197 } |
199 | 198 |
200 } | 199 } |
OLD | NEW |