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

Lift Loader.parse into System.parse. #174

Merged
merged 1 commit into from
Jul 8, 2014
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
135 changes: 6 additions & 129 deletions lib/loader.js
Original file line number Diff line number Diff line change
Expand Up @@ -137,129 +137,6 @@ function logloads(loads) {
return -1;
};

// --- <Specific Traceur Parsing Code> ---
// parse function is used to parse a load record
// tree traversal, NB should use visitor pattern here
function traverse(object, iterator, parent, parentProperty) {
var key, child;
if (iterator(object, parent, parentProperty) === false)
return;
for (key in object) {
if (!object.hasOwnProperty(key))
continue;
if (key == 'location' || key == 'type')
continue;
child = object[key];
if (typeof child == 'object' && child !== null)
traverse(child, iterator, object, key);
}
}
// given a syntax tree, return the import list
function getImports(moduleTree) {
var imports = [];

function addImport(name) {
if (indexOf.call(imports, name) == -1)
imports.push(name);
}

traverse(moduleTree, function(node) {
// import {} from 'foo';
// export * from 'foo';
// export { ... } from 'foo';
// module x from 'foo';
if (node.type == 'EXPORT_DECLARATION') {
if (node.declaration.moduleSpecifier)
addImport(node.declaration.moduleSpecifier.token.processedValue);
}
else if (node.type == 'IMPORT_DECLARATION')
addImport(node.moduleSpecifier.token.processedValue);
else if (node.type == 'MODULE_DECLARATION')
addImport(node.expression.token.processedValue);
});
return imports;
}
// Returns an array of ModuleSpecifiers
function parse(load) {
if (!traceur) {
if (typeof window == 'undefined')
traceur = require('traceur');
else if (__global.traceur)
traceur = __global.traceur;
else
throw new TypeError('Include Traceur for module syntax support');
}

console.assert(load.source, 'Non-empty source');

var depsList, curRegister, curSystem, oldSourceMaps, oldModules;
(function () {
try {
var parser = new traceur.syntax.Parser(new traceur.syntax.SourceFile(load.address, load.source));
var body = parser.parseModule();

load.kind = 'declarative';
depsList = getImports(body);

oldSourceMaps = traceur.options.sourceMaps;
oldModules = traceur.options.modules;

traceur.options.sourceMaps = true;
traceur.options.modules = 'instantiate';

var reporter = new traceur.util.ErrorReporter();

reporter.reportMessageInternal = function(location, kind, format, args) {
throw new SyntaxError(kind, location.start && location.start.line_, location.start && location.start.column_);
}

// traceur expects its version of System
curSystem = __global.System;
__global.System = __global.traceurSystem;

var tree = (new traceur.codegeneration.module.AttachModuleNameTransformer(load.name)).transformAny(body);
tree = (new traceur.codegeneration.FromOptionsTransformer(reporter)).transform(tree);

var sourceMapGenerator = new traceur.outputgeneration.SourceMapGenerator({ file: load.address });
var options = { sourceMapGenerator: sourceMapGenerator };

var source = traceur.outputgeneration.TreeWriter.write(tree, options);

if (__global.btoa)
source += '\n//# sourceMappingURL=data:application/json;base64,' + btoa(unescape(encodeURIComponent(options.sourceMap))) + '\n';

// now run System.register
curRegister = System.register;

System.register = function(name, deps, declare) {
// store the registered declaration as load.declare
load.declare = typeof name == 'string' ? declare : deps;
}

__eval(source, __global, load.name);
}
catch(e) {
if (e.name == 'SyntaxError' || e.name == 'TypeError')
e.message = 'Evaluating ' + (load.name || load.address) + '\n\t' + e.message;
if (curRegister)
System.register = curRegister;
if (curSystem)
__global.System = curSystem;
if (oldSourceMaps)
traceur.options.sourceMaps = oldSourceMaps;
if (oldModules)
traceur.options.modules = oldModules;
throw e;
}
}());
System.register = curRegister;
__global.System = curSystem;
traceur.options.sourceMaps = oldSourceMaps;
traceur.options.modules = oldModules;
return depsList;
}
// --- </Specific Traceur Parsing Code> ---

// 15.2.3 - Runtime Semantics: Loader State

// 15.2.3.11
Expand Down Expand Up @@ -390,7 +267,8 @@ function logloads(loads) {
var depsList;
if (instantiateResult === undefined) {
load.address = load.address || 'anon' + ++anonCnt;
depsList = parse(load);
load.kind = 'declarative';
depsList = loader.loaderObj.parse(load);
}
else if (typeof instantiateResult == 'object') {
depsList = instantiateResult.deps || [];
Expand Down Expand Up @@ -1033,7 +911,7 @@ function logloads(loads) {
return loader.modules[name].module;
}

return importPromises[name] || createImportPromise(name,
return importPromises[name] || createImportPromise(name,
loadModule(loader, name, options || {})
.then(function(load) {
delete importPromises[name];
Expand Down Expand Up @@ -1117,6 +995,9 @@ function logloads(loads) {
translate: function(load) {
return load.source;
},
parse: function(load) {
throw new TypeError('Loader.parse is not implemented');
},
// 26.3.3.18.5
instantiate: function(load) {
}
Expand All @@ -1134,8 +1015,4 @@ function logloads(loads) {

})();

function __eval(__source, __global, __moduleName) {
eval('var __moduleName = "' + (__moduleName || '').replace('"', '\"') + '"; (function() { ' + __source + ' \n }).call(__global);');
}

})(typeof global !== 'undefined' ? global : this);
Loading