Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(31)

Side by Side Diff: lib/src/transformer/dart_initializer_generator.dart

Issue 580283004: Add JsInitializerGenerator (Closed) Base URL: https://github.com/dart-lang/js-interop.git@master
Patch Set: Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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 }
OLDNEW
« no previous file with comments | « no previous file | lib/src/transformer/entry_point_transformer.dart » ('j') | lib/src/transformer/entry_point_transformer.dart » ('J')

Powered by Google App Engine
This is Rietveld 408576698