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

Commit d83a191

Browse files
committed
Merge pull request #174 from johnjbarton/lift-parse
Lift Loader.parse into System.parse.
2 parents b06636c + 32c5f61 commit d83a191

File tree

3 files changed

+380
-349
lines changed

3 files changed

+380
-349
lines changed

lib/loader.js

Lines changed: 6 additions & 129 deletions
Original file line numberDiff line numberDiff line change
@@ -137,129 +137,6 @@ function logloads(loads) {
137137
return -1;
138138
};
139139

140-
// --- <Specific Traceur Parsing Code> ---
141-
// parse function is used to parse a load record
142-
// tree traversal, NB should use visitor pattern here
143-
function traverse(object, iterator, parent, parentProperty) {
144-
var key, child;
145-
if (iterator(object, parent, parentProperty) === false)
146-
return;
147-
for (key in object) {
148-
if (!object.hasOwnProperty(key))
149-
continue;
150-
if (key == 'location' || key == 'type')
151-
continue;
152-
child = object[key];
153-
if (typeof child == 'object' && child !== null)
154-
traverse(child, iterator, object, key);
155-
}
156-
}
157-
// given a syntax tree, return the import list
158-
function getImports(moduleTree) {
159-
var imports = [];
160-
161-
function addImport(name) {
162-
if (indexOf.call(imports, name) == -1)
163-
imports.push(name);
164-
}
165-
166-
traverse(moduleTree, function(node) {
167-
// import {} from 'foo';
168-
// export * from 'foo';
169-
// export { ... } from 'foo';
170-
// module x from 'foo';
171-
if (node.type == 'EXPORT_DECLARATION') {
172-
if (node.declaration.moduleSpecifier)
173-
addImport(node.declaration.moduleSpecifier.token.processedValue);
174-
}
175-
else if (node.type == 'IMPORT_DECLARATION')
176-
addImport(node.moduleSpecifier.token.processedValue);
177-
else if (node.type == 'MODULE_DECLARATION')
178-
addImport(node.expression.token.processedValue);
179-
});
180-
return imports;
181-
}
182-
// Returns an array of ModuleSpecifiers
183-
function parse(load) {
184-
if (!traceur) {
185-
if (typeof window == 'undefined')
186-
traceur = require('traceur');
187-
else if (__global.traceur)
188-
traceur = __global.traceur;
189-
else
190-
throw new TypeError('Include Traceur for module syntax support');
191-
}
192-
193-
console.assert(load.source, 'Non-empty source');
194-
195-
var depsList, curRegister, curSystem, oldSourceMaps, oldModules;
196-
(function () {
197-
try {
198-
var parser = new traceur.syntax.Parser(new traceur.syntax.SourceFile(load.address, load.source));
199-
var body = parser.parseModule();
200-
201-
load.kind = 'declarative';
202-
depsList = getImports(body);
203-
204-
oldSourceMaps = traceur.options.sourceMaps;
205-
oldModules = traceur.options.modules;
206-
207-
traceur.options.sourceMaps = true;
208-
traceur.options.modules = 'instantiate';
209-
210-
var reporter = new traceur.util.ErrorReporter();
211-
212-
reporter.reportMessageInternal = function(location, kind, format, args) {
213-
throw new SyntaxError(kind, location.start && location.start.line_, location.start && location.start.column_);
214-
}
215-
216-
// traceur expects its version of System
217-
curSystem = __global.System;
218-
__global.System = __global.traceurSystem;
219-
220-
var tree = (new traceur.codegeneration.module.AttachModuleNameTransformer(load.name)).transformAny(body);
221-
tree = (new traceur.codegeneration.FromOptionsTransformer(reporter)).transform(tree);
222-
223-
var sourceMapGenerator = new traceur.outputgeneration.SourceMapGenerator({ file: load.address });
224-
var options = { sourceMapGenerator: sourceMapGenerator };
225-
226-
var source = traceur.outputgeneration.TreeWriter.write(tree, options);
227-
228-
if (__global.btoa)
229-
source += '\n//# sourceMappingURL=data:application/json;base64,' + btoa(unescape(encodeURIComponent(options.sourceMap))) + '\n';
230-
231-
// now run System.register
232-
curRegister = System.register;
233-
234-
System.register = function(name, deps, declare) {
235-
// store the registered declaration as load.declare
236-
load.declare = typeof name == 'string' ? declare : deps;
237-
}
238-
239-
__eval(source, __global, load.name);
240-
}
241-
catch(e) {
242-
if (e.name == 'SyntaxError' || e.name == 'TypeError')
243-
e.message = 'Evaluating ' + (load.name || load.address) + '\n\t' + e.message;
244-
if (curRegister)
245-
System.register = curRegister;
246-
if (curSystem)
247-
__global.System = curSystem;
248-
if (oldSourceMaps)
249-
traceur.options.sourceMaps = oldSourceMaps;
250-
if (oldModules)
251-
traceur.options.modules = oldModules;
252-
throw e;
253-
}
254-
}());
255-
System.register = curRegister;
256-
__global.System = curSystem;
257-
traceur.options.sourceMaps = oldSourceMaps;
258-
traceur.options.modules = oldModules;
259-
return depsList;
260-
}
261-
// --- </Specific Traceur Parsing Code> ---
262-
263140
// 15.2.3 - Runtime Semantics: Loader State
264141

265142
// 15.2.3.11
@@ -390,7 +267,8 @@ function logloads(loads) {
390267
var depsList;
391268
if (instantiateResult === undefined) {
392269
load.address = load.address || 'anon' + ++anonCnt;
393-
depsList = parse(load);
270+
load.kind = 'declarative';
271+
depsList = loader.loaderObj.parse(load);
394272
}
395273
else if (typeof instantiateResult == 'object') {
396274
depsList = instantiateResult.deps || [];
@@ -1033,7 +911,7 @@ function logloads(loads) {
1033911
return loader.modules[name].module;
1034912
}
1035913

1036-
return importPromises[name] || createImportPromise(name,
914+
return importPromises[name] || createImportPromise(name,
1037915
loadModule(loader, name, options || {})
1038916
.then(function(load) {
1039917
delete importPromises[name];
@@ -1117,6 +995,9 @@ function logloads(loads) {
1117995
translate: function(load) {
1118996
return load.source;
1119997
},
998+
parse: function(load) {
999+
throw new TypeError('Loader.parse is not implemented');
1000+
},
11201001
// 26.3.3.18.5
11211002
instantiate: function(load) {
11221003
}
@@ -1134,8 +1015,4 @@ function logloads(loads) {
11341015

11351016
})();
11361017

1137-
function __eval(__source, __global, __moduleName) {
1138-
eval('var __moduleName = "' + (__moduleName || '').replace('"', '\"') + '"; (function() { ' + __source + ' \n }).call(__global);');
1139-
}
1140-
11411018
})(typeof global !== 'undefined' ? global : this);

0 commit comments

Comments
 (0)