Chromium Code Reviews| 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 |