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

Side by Side Diff: lib/src/transformer/js_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.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
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 }
OLDNEW
« no previous file with comments | « lib/src/transformer/entry_point_transformer.dart ('k') | lib/src/transformer/library_transformer.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698