Skip to content
This repository was archived by the owner on Jul 13, 2020. It is now read-only.

Commit 9e7bafe

Browse files
committed
Refactor loader.js to isolate compiler in function parse(load).
Function parse(load) returns array of ModuleSpecifer strings
1 parent cd4ccff commit 9e7bafe

5 files changed

+358
-326
lines changed

dist/es6-module-loader-sans-promises.js

Lines changed: 120 additions & 108 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
- Implemented exactly to the 2014-04-27 Specification Draft.
77
Loader implemented to the modules draft from
88
https://github.com/jorendorff/js-loaders/blob/e60d3651/specs/es6-modules-2013-12-02.pdf
9-
9+
1010
- All functions are commented with their spec numbers, with spec differences commented.
1111
1212
- All spec bugs are commented in this code with links to the spec bugs.
@@ -17,7 +17,7 @@
1717
- When the traceur global is detected, declarative modules are transformed by Traceur
1818
into the `instantiate` System.register output.
1919
20-
- Realm implementation is entirely omitted. As such, the Loader.realm accessor will
20+
- Realm implementation is entirely omitted. As such, the Loader.realm accessor will
2121
throw an error, as well as Loader.eval. Realm arguments are not passed.
2222
2323
- Loader module table iteration currently not yet implemented
@@ -54,7 +54,7 @@ function logloads(loads) {
5454
5555
var loads = System._loader.loads;
5656
var linkSets = [];
57-
57+
5858
for (var i = 0; i < loads.length; i++) {
5959
var load = loads[i];
6060
console.assert(load.status == 'loading' || load.status == 'loaded', 'Each load is loading or loaded');
@@ -167,7 +167,7 @@ function logloads(loads) {
167167
}
168168

169169
// 15.2.3.2.2 createLoadRequestObject, absorbed into calling functions
170-
170+
171171
// 15.2.4
172172

173173
// 15.2.4.1
@@ -216,7 +216,7 @@ function logloads(loads) {
216216
return load;
217217
});
218218
}
219-
219+
220220
// 15.2.4.3
221221
function proceedToLocate(loader, load) {
222222
proceedToFetch(loader, load,
@@ -244,6 +244,106 @@ function logloads(loads) {
244244
);
245245
}
246246

247+
// Returns an array of ModuleSpecifiers
248+
function parse(load) {
249+
if (!__global.traceur)
250+
throw new TypeError('Include Traceur for module syntax support');
251+
252+
// given a syntax tree, return the import list
253+
function getImports(moduleTree) {
254+
var imports = [];
255+
256+
function addImport(name) {
257+
if (indexOf.call(imports, name) == -1)
258+
imports.push(name);
259+
}
260+
261+
traverse(moduleTree, function(node) {
262+
// import {} from 'foo';
263+
// export * from 'foo';
264+
// export { ... } from 'foo';
265+
// module x from 'foo';
266+
if (node.type == 'EXPORT_DECLARATION') {
267+
if (node.declaration.moduleSpecifier)
268+
addImport(node.declaration.moduleSpecifier.token.processedValue);
269+
}
270+
else if (node.type == 'IMPORT_DECLARATION')
271+
addImport(node.moduleSpecifier.token.processedValue);
272+
else if (node.type == 'MODULE_DECLARATION')
273+
addImport(node.expression.token.processedValue);
274+
});
275+
return imports;
276+
}
277+
278+
traceur = traceur || __global.traceur;
279+
280+
console.assert(load.source, 'Non-empty source');
281+
282+
var depsList;
283+
try {
284+
var parser = new traceur.syntax.Parser(new traceur.syntax.SourceFile(load.address, load.source));
285+
var body = parser.parseModule();
286+
287+
load.kind = 'declarative';
288+
depsList = getImports(body);
289+
290+
var oldSourceMaps = traceur.options.sourceMaps;
291+
var oldModules = traceur.options.modules;
292+
293+
traceur.options.sourceMaps = true;
294+
traceur.options.modules = 'instantiate';
295+
296+
var reporter = new traceur.util.ErrorReporter();
297+
298+
reporter.reportMessageInternal = function(location, kind, format, args) {
299+
throw new SyntaxError(kind, location.start && location.start.line_, location.start && location.start.column_);
300+
}
301+
302+
// traceur expects its version of System
303+
var curSystem = __global.System;
304+
__global.System = __global.traceurSystem;
305+
306+
var tree = (new traceur.codegeneration.module.AttachModuleNameTransformer(load.name)).transformAny(body);
307+
tree = (new traceur.codegeneration.FromOptionsTransformer(reporter)).transform(tree);
308+
309+
var sourceMapGenerator = new traceur.outputgeneration.SourceMapGenerator({ file: load.address });
310+
var options = { sourceMapGenerator: sourceMapGenerator };
311+
312+
var source = traceur.outputgeneration.TreeWriter.write(tree, options);
313+
314+
if (__global.btoa)
315+
source += '\n//# sourceMappingURL=data:application/json;base64,' + btoa(unescape(encodeURIComponent(options.sourceMap))) + '\n';
316+
317+
// now run System.register
318+
var curRegister = System.register;
319+
320+
System.register = function(name, deps, declare) {
321+
// store the registered declaration as load.declare
322+
load.declare = typeof name == 'string' ? declare : deps;
323+
}
324+
325+
__eval(source, __global, load.name);
326+
}
327+
catch(e) {
328+
if (e.name == 'SyntaxError' || e.name == 'TypeError')
329+
e.message = 'Evaluating ' + (load.name || load.address) + '\n\t' + e.message;
330+
if (curRegister)
331+
System.register = curRegister;
332+
if (curSystem)
333+
__global.System = curSystem;
334+
if (oldSourceMaps)
335+
traceur.options.sourceMaps = oldSourceMaps;
336+
if (oldModules)
337+
traceur.options.modules = oldModules;
338+
throw e;
339+
}
340+
System.register = curRegister;
341+
__global.System = curSystem;
342+
traceur.options.sourceMaps = oldSourceMaps;
343+
traceur.options.modules = oldModules;
344+
return depsList;
345+
}
346+
247347
// 15.2.4.5
248348
function proceedToTranslate(loader, load, p) {
249349
p
@@ -269,75 +369,8 @@ function logloads(loads) {
269369

270370
var depsList;
271371
if (instantiateResult === undefined) {
272-
if (!__global.traceur)
273-
throw new TypeError('Include Traceur for module syntax support');
274-
275-
traceur = traceur || __global.traceur;
276372
load.address = load.address || 'anon' + ++anonCnt;
277-
278-
console.assert(load.source, 'Non-empty source');
279-
280-
try {
281-
var parser = new traceur.syntax.Parser(new traceur.syntax.SourceFile(load.address, load.source));
282-
var body = parser.parseModule();
283-
284-
load.kind = 'declarative';
285-
depsList = getImports(body);
286-
287-
var oldSourceMaps = traceur.options.sourceMaps;
288-
var oldModules = traceur.options.modules;
289-
290-
traceur.options.sourceMaps = true;
291-
traceur.options.modules = 'instantiate';
292-
293-
var reporter = new traceur.util.ErrorReporter();
294-
295-
reporter.reportMessageInternal = function(location, kind, format, args) {
296-
throw new SyntaxError(kind, location.start && location.start.line_, location.start && location.start.column_);
297-
}
298-
299-
// traceur expects its version of System
300-
var curSystem = __global.System;
301-
__global.System = __global.traceurSystem;
302-
303-
var tree = (new traceur.codegeneration.module.AttachModuleNameTransformer(load.name)).transformAny(body);
304-
tree = (new traceur.codegeneration.FromOptionsTransformer(reporter)).transform(tree);
305-
306-
var sourceMapGenerator = new traceur.outputgeneration.SourceMapGenerator({ file: load.address });
307-
var options = { sourceMapGenerator: sourceMapGenerator };
308-
309-
var source = traceur.outputgeneration.TreeWriter.write(tree, options);
310-
311-
if (__global.btoa)
312-
source += '\n//# sourceMappingURL=data:application/json;base64,' + btoa(unescape(encodeURIComponent(options.sourceMap))) + '\n';
313-
314-
// now run System.register
315-
var curRegister = System.register;
316-
317-
System.register = function(name, deps, declare) {
318-
// store the registered declaration as load.declare
319-
load.declare = typeof name == 'string' ? declare : deps;
320-
}
321-
322-
__eval(source, __global, load.name);
323-
}
324-
catch(e) {
325-
if (e.name == 'SyntaxError' || e.name == 'TypeError')
326-
e.message = 'Evaluating ' + (load.name || load.address) + '\n\t' + e.message;
327-
if (curRegister)
328-
System.register = curRegister;
329-
if (curSystem)
330-
__global.System = curSystem;
331-
if (oldSourceMaps)
332-
traceur.options.sourceMaps = oldSourceMaps;
333-
if (oldModules)
334-
traceur.options.modules = oldModules;
335-
throw e;
336-
}
337-
System.register = curRegister;
338-
__global.System = curSystem;
339-
traceur.options.sourceMaps = oldSourceMaps;
340-
traceur.options.modules = oldModules;
373+
depsList = parse(load);
341374
}
342375
else if (typeof instantiateResult == 'object') {
343376
depsList = instantiateResult.deps || [];
@@ -423,7 +456,7 @@ function logloads(loads) {
423456
var name = stepState.moduleName;
424457
var step = stepState.step;
425458

426-
if (loader.modules[name])
459+
if (loader.modules[name])
427460
throw new TypeError('"' + name + '" already exists in the module table');
428461

429462
// NB this still seems wrong for LoadModule as we may load a dependency
@@ -433,7 +466,7 @@ function logloads(loads) {
433466
throw new TypeError('"' + name + '" already loading');
434467

435468
var load = createLoad(name);
436-
469+
437470
load.metadata = stepState.moduleMetadata;
438471

439472
var linkSet = createLinkSet(loader, load);
@@ -502,7 +535,7 @@ function logloads(loads) {
502535
for (var j = 0, d = loader.loads.length; j < d; j++) {
503536
if (loader.loads[j].name != name)
504537
continue;
505-
538+
506539
addLoadToLinkSet(linkSet, loader.loads[j]);
507540
break;
508541
}
@@ -651,7 +684,7 @@ function logloads(loads) {
651684

652685
// the group index of an entry is always the maximum
653686
if (loadDep.groupIndex === undefined || loadDep.groupIndex < loadDepGroupIndex) {
654-
687+
655688
// if already in a group, remove from the old group
656689
if (loadDep.groupIndex) {
657690
groups[loadDep.groupIndex].splice(groups[loadDep.groupIndex].indexOf(loadDep), 1);
@@ -757,11 +790,11 @@ function logloads(loads) {
757790
for (var j = 0; j < loads.length; j++) {
758791
if (loads[j].name != depName)
759792
continue;
760-
793+
761794
// only link if already not already started linking (stops at circular / dynamic)
762795
if (!loads[j].module)
763796
linkDeclarativeModule(loads[j], loads, loader);
764-
797+
765798
depModule = loads[j].module;
766799
}
767800
}
@@ -794,7 +827,7 @@ function logloads(loads) {
794827

795828
load.status = 'linked';
796829
}
797-
830+
798831

799832

800833
// 15.2.5.5.1 LinkImports not implemented
@@ -816,7 +849,7 @@ function logloads(loads) {
816849
* module.module bound module object
817850
* module.execute execution function for module
818851
* module.dependencies list of module objects for dependencies
819-
*
852+
*
820853
*/
821854

822855
// 15.2.6.2 EnsureEvaluated adjusted
@@ -880,6 +913,7 @@ function logloads(loads) {
880913
// importPromises adds ability to import a module twice without error - https://bugs.ecmascript.org/show_bug.cgi?id=2601
881914
var importPromises = {};
882915
Loader.prototype = {
916+
constructor: Loader,
883917
define: function(name, source, options) {
884918
if (importPromises[name])
885919
throw new TypeError('Module is already loading.');
@@ -923,12 +957,12 @@ function logloads(loads) {
923957
return Promise.resolve(loaderObj.normalize(name, options && options.name, options && options.address))
924958
.then(function(name) {
925959
var loader = loaderObj._loader;
926-
960+
927961
if (loader.modules[name]) {
928962
ensureEvaluated(loader.modules[name], [], loader._loader);
929963
return Promise.resolve(loader.modules[name].module);
930964
}
931-
965+
932966
return (importPromises[name] || (importPromises[name] = loadModule(loader, name, options || {})))
933967
.then(function(load) {
934968
delete importPromises[name];
@@ -948,6 +982,9 @@ function logloads(loads) {
948982
has: function(name) {
949983
return !!this._loader.modules[name];
950984
},
985+
newModule: function (obj) {
986+
return new Module(obj);
987+
},
951988
set: function(name, module) {
952989
if (!(module.__esModule))
953990
throw new TypeError('Set must be a module');
@@ -1000,31 +1037,6 @@ function logloads(loads) {
10001037
}
10011038
}
10021039

1003-
// given a syntax tree, return the import list
1004-
function getImports(moduleTree) {
1005-
var imports = [];
1006-
1007-
function addImport(name) {
1008-
if (indexOf.call(imports, name) == -1)
1009-
imports.push(name);
1010-
}
1011-
1012-
traverse(moduleTree, function(node) {
1013-
// import {} from 'foo';
1014-
// export * from 'foo';
1015-
// export { ... } from 'foo';
1016-
// module x from 'foo';
1017-
if (node.type == 'EXPORT_DECLARATION') {
1018-
if (node.declaration.moduleSpecifier)
1019-
addImport(node.declaration.moduleSpecifier.token.processedValue);
1020-
}
1021-
else if (node.type == 'IMPORT_DECLARATION')
1022-
addImport(node.moduleSpecifier.token.processedValue);
1023-
else if (node.type == 'MODULE_DECLARATION')
1024-
addImport(node.expression.token.processedValue);
1025-
});
1026-
return imports;
1027-
}
10281040
var anonCnt = 0;
10291041

10301042
// Module Object

0 commit comments

Comments
 (0)