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

Side by Side Diff: lib/src/compiler/module_builder.dart

Issue 1893293003: Fix for node modules (Closed) Base URL: https://github.com/dart-lang/dev_compiler.git@master
Patch Set: Add TODO and regen Created 4 years, 8 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
« no previous file with comments | « no previous file | test/codegen/expect/language-all.js » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2015, 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 import 'package:path/path.dart' as path; 5 import 'package:path/path.dart' as path;
6 6
7 import '../js_ast/js_ast.dart'; 7 import '../js_ast/js_ast.dart';
8 import 'js_names.dart'; 8 import 'js_names.dart';
9 9
10 /// Base class for compiling ES6 modules into various ES5 module patterns. 10 /// Base class for compiling ES6 modules into various ES5 module patterns.
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
97 "Imports", new ArrayInitializer(importNames, multiline: true)), 97 "Imports", new ArrayInitializer(importNames, multiline: true)),
98 resultModule 98 resultModule
99 ]); 99 ]);
100 return new Program(<ModuleItem>[moduleDef]); 100 return new Program(<ModuleItem>[moduleDef]);
101 } 101 }
102 } 102 }
103 103
104 /// Generates node modules. 104 /// Generates node modules.
105 class NodeModuleBuilder extends _ModuleBuilder { 105 class NodeModuleBuilder extends _ModuleBuilder {
106 Program build(Program module) { 106 Program build(Program module) {
107 var importStatements = [js.statement("'use strict';"),]; 107 var importStatements = [];
108
109 // Collect imports/exports/statements.
110 visitProgram(module);
108 111
109 for (var import in imports) { 112 for (var import in imports) {
110 // TODO(jmesserly): we could use destructuring once Atom supports it. 113 // TODO(jmesserly): we could use destructuring once Atom supports it.
111 var moduleVar = 114 var moduleVar =
112 new TemporaryId(pathToJSIdentifier(import.from.valueWithoutQuotes)); 115 new TemporaryId(pathToJSIdentifier(import.from.valueWithoutQuotes));
113 importStatements 116 importStatements
114 .add(js.statement('const # = require(#);', [moduleVar, import.from])); 117 .add(js.statement('const # = require(#);', [moduleVar, import.from]));
115 118
116 // TODO(jmesserly): optimize for the common case of a single import. 119 // TODO(jmesserly): optimize for the common case of a single import.
117 for (var importName in import.namedImports) { 120 for (var importName in import.namedImports) {
(...skipping 10 matching lines...) Expand all
128 statements.add(js.comment('Exports:')); 131 statements.add(js.comment('Exports:'));
129 for (var export in exports) { 132 for (var export in exports) {
130 var names = export.exportedNames; 133 var names = export.exportedNames;
131 assert(names != null); // export * not supported in legacy modules. 134 assert(names != null); // export * not supported in legacy modules.
132 for (var name in names) { 135 for (var name in names) {
133 statements 136 statements
134 .add(js.statement('#.# = #;', [exportsVar, name.name, name])); 137 .add(js.statement('#.# = #;', [exportsVar, name.name, name]));
135 } 138 }
136 } 139 }
137 } 140 }
138 return new Program(statements); 141
142 // TODO(vsm): See https://github.com/dart-lang/dev_compiler/issues/512
143 // This extra level of indirection should be unnecessary.
144 var block =
145 js.statement("(function() { 'use strict'; #; })()", [statements]);
146
147 return new Program([block]);
139 } 148 }
140 } 149 }
141 150
142 /// Escape [name] to make it into a valid identifier. 151 /// Escape [name] to make it into a valid identifier.
143 String pathToJSIdentifier(String name) { 152 String pathToJSIdentifier(String name) {
144 name = path.basenameWithoutExtension(name); 153 name = path.basenameWithoutExtension(name);
145 if (name.length == 0) return r'$'; 154 if (name.length == 0) return r'$';
146 155
147 // Escape any invalid characters 156 // Escape any invalid characters
148 StringBuffer buffer = null; 157 StringBuffer buffer = null;
(...skipping 12 matching lines...) Expand all
161 // Ensure the identifier first character is not numeric and that the whole 170 // Ensure the identifier first character is not numeric and that the whole
162 // identifier is not a keyword. 171 // identifier is not a keyword.
163 if (result.startsWith(new RegExp('[0-9]')) || invalidVariableName(result)) { 172 if (result.startsWith(new RegExp('[0-9]')) || invalidVariableName(result)) {
164 return '\$$result'; 173 return '\$$result';
165 } 174 }
166 return result; 175 return result;
167 } 176 }
168 177
169 // Invalid characters for identifiers, which would need to be escaped. 178 // Invalid characters for identifiers, which would need to be escaped.
170 final _invalidCharInIdentifier = new RegExp(r'[^A-Za-z_$0-9]'); 179 final _invalidCharInIdentifier = new RegExp(r'[^A-Za-z_$0-9]');
OLDNEW
« no previous file with comments | « no previous file | test/codegen/expect/language-all.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698