|
@@ -133,24 +133,23 @@ AmberC.prototype.main = function(configuration, finished_callback) {
|
|
|
configuration.compiler_libraries = this.compiler_libraries;
|
|
|
configuration.amber_dir = this.amber_dir;
|
|
|
|
|
|
- function logError(error) {
|
|
|
- console.log(error);
|
|
|
- finished_callback();
|
|
|
- };
|
|
|
-
|
|
|
check_configuration(configuration)
|
|
|
- .then(collect_st_files, logError)
|
|
|
- .then(collect_js_files, logError)
|
|
|
- .then(resolve_kernel, logError)
|
|
|
- .then(create_compiler, logError)
|
|
|
- .then(compile, logError)
|
|
|
- .then(category_export, logError)
|
|
|
- .then(verify, logError)
|
|
|
- .then(compose_js_files, logError)
|
|
|
- .then(function() {
|
|
|
- console.log = console.ambercLog;
|
|
|
+ .then(collect_st_files)
|
|
|
+ .then(collect_js_files)
|
|
|
+ .then(resolve_kernel)
|
|
|
+ .then(create_compiler)
|
|
|
+ .then(compile)
|
|
|
+ .then(category_export)
|
|
|
+ .then(verify)
|
|
|
+ .then(compose_js_files)
|
|
|
+ .then(function () {
|
|
|
console.timeEnd('Compile Time');
|
|
|
- finished_callback();
|
|
|
+ }, function(error) {
|
|
|
+ console.error(error);
|
|
|
+ })
|
|
|
+ .then(function () {
|
|
|
+ console.log = console.ambercLog;
|
|
|
+ finished_callback && finished_callback();
|
|
|
});
|
|
|
};
|
|
|
|
|
@@ -238,19 +237,16 @@ function resolve_file(filename, searchDirectories) {
|
|
|
* Returns a Promise which resolves into the configuration object.
|
|
|
*/
|
|
|
function collect_st_files(configuration) {
|
|
|
- return new Promise(function(resolve, reject) {
|
|
|
- Promise.all(
|
|
|
- configuration.stFiles.map(function(stFile) {
|
|
|
- return resolve_st(stFile, configuration);
|
|
|
- })
|
|
|
- ).then(function(data) {
|
|
|
- configuration.compile = configuration.compile.concat(data);
|
|
|
- resolve(configuration);
|
|
|
- }, function(error) {
|
|
|
- reject(error);
|
|
|
- });
|
|
|
+ return Promise.all(
|
|
|
+ configuration.stFiles.map(function(stFile) {
|
|
|
+ return resolve_st(stFile, configuration);
|
|
|
+ })
|
|
|
+ )
|
|
|
+ .then(function(data) {
|
|
|
+ configuration.compile = configuration.compile.concat(data);
|
|
|
+ return configuration;
|
|
|
});
|
|
|
-};
|
|
|
+}
|
|
|
|
|
|
|
|
|
/**
|
|
@@ -258,19 +254,16 @@ function collect_st_files(configuration) {
|
|
|
* Returns a Promise which resolves into the configuration object.
|
|
|
*/
|
|
|
function collect_js_files(configuration) {
|
|
|
- return new Promise(function(resolve, reject) {
|
|
|
- Promise.all(
|
|
|
- configuration.jsFiles.map(function(file) {
|
|
|
- return resolve_js(file, configuration);
|
|
|
- })
|
|
|
- ).then(function(data) {
|
|
|
- configuration.libraries = configuration.libraries.concat(data);
|
|
|
- resolve(configuration);
|
|
|
- }, function(error) {
|
|
|
- reject(error);
|
|
|
- });
|
|
|
+ return Promise.all(
|
|
|
+ configuration.jsFiles.map(function(file) {
|
|
|
+ return resolve_js(file, configuration);
|
|
|
+ })
|
|
|
+ )
|
|
|
+ .then(function(data) {
|
|
|
+ configuration.libraries = configuration.libraries.concat(data);
|
|
|
+ return configuration;
|
|
|
});
|
|
|
-};
|
|
|
+}
|
|
|
|
|
|
|
|
|
/**
|
|
@@ -279,21 +272,18 @@ function collect_js_files(configuration) {
|
|
|
*/
|
|
|
function resolve_kernel(configuration) {
|
|
|
var kernel_files = configuration.kernel_libraries.concat(configuration.load);
|
|
|
- return new Promise(function(resolve, reject) {
|
|
|
- Promise.all(
|
|
|
- kernel_files.map(function(file) {
|
|
|
- return resolve_js(file, configuration, resolve);
|
|
|
- })
|
|
|
- ).then(function(data) {
|
|
|
- // boot.js and Kernel files need to be used first
|
|
|
- // otherwise the global smalltalk object is undefined
|
|
|
- configuration.libraries = data.concat(configuration.libraries);
|
|
|
- resolve(configuration);
|
|
|
- }, function(error) {
|
|
|
- reject(error);
|
|
|
- });
|
|
|
+ return Promise.all(
|
|
|
+ kernel_files.map(function(file) {
|
|
|
+ return resolve_js(file, configuration);
|
|
|
+ })
|
|
|
+ )
|
|
|
+ .then(function(data) {
|
|
|
+ // boot.js and Kernel files need to be used first
|
|
|
+ // otherwise the global smalltalk object is undefined
|
|
|
+ configuration.libraries = data.concat(configuration.libraries);
|
|
|
+ return configuration;
|
|
|
});
|
|
|
-};
|
|
|
+}
|
|
|
|
|
|
|
|
|
/**
|
|
@@ -302,66 +292,59 @@ function resolve_kernel(configuration) {
|
|
|
* Returns a Promise object which resolves into the configuration object.
|
|
|
*/
|
|
|
function create_compiler(configuration) {
|
|
|
- return new Promise(function(resolve, reject) {
|
|
|
- var compiler_files = configuration.compiler_libraries.concat(configuration.load);
|
|
|
- Promise.all(
|
|
|
- compiler_files.map(function(file) {
|
|
|
- return resolve_js(file, configuration, resolve);
|
|
|
+ var compiler_files = configuration.compiler_libraries.concat(configuration.load);
|
|
|
+ return Promise.all(
|
|
|
+ compiler_files.map(function(file) {
|
|
|
+ return resolve_js(file, configuration);
|
|
|
+ })
|
|
|
+ )
|
|
|
+ .then(function(compilerFilesArray) {
|
|
|
+ return Promise.all(
|
|
|
+ compilerFilesArray.map(function(file) {
|
|
|
+ return new Promise(function(resolve, reject) {
|
|
|
+ console.log('Loading file: ' + file);
|
|
|
+ fs.readFile(file, function(err, data) {
|
|
|
+ if (err)
|
|
|
+ reject(err);
|
|
|
+ else
|
|
|
+ resolve(data);
|
|
|
+ });
|
|
|
+ });
|
|
|
})
|
|
|
)
|
|
|
- .then(function(compilerFilesArray) {
|
|
|
- return Promise.all(
|
|
|
- compilerFilesArray.map(function(file) {
|
|
|
- return new Promise(function(resolve, reject) {
|
|
|
- console.log('Loading file: ' + file);
|
|
|
- fs.readFile(file, function(err, data) {
|
|
|
- if (err)
|
|
|
- reject(err);
|
|
|
- else
|
|
|
- resolve(data);
|
|
|
- });
|
|
|
- });
|
|
|
- })
|
|
|
- )
|
|
|
- }).then(function(files) {
|
|
|
- var builder = createConcatenator();
|
|
|
- builder.add('(function() {');
|
|
|
- builder.start();
|
|
|
-
|
|
|
- files.forEach(function(data) {
|
|
|
- // data is an array where index 0 is the error code and index 1 contains the data
|
|
|
- builder.add(data);
|
|
|
- // matches and returns the "module_id" string in the AMD definition: define("module_id", ...)
|
|
|
- var match = ('' + data).match(/^define\("([^"]*)"/);
|
|
|
- if (match) {
|
|
|
- builder.addId(match[1]);
|
|
|
- }
|
|
|
- });
|
|
|
- // store the generated smalltalk env in configuration.smalltalk
|
|
|
- builder.finish('configuration.smalltalk = smalltalk;');
|
|
|
- builder.add('})();');
|
|
|
-
|
|
|
- try {
|
|
|
- eval(builder.toString());
|
|
|
- } catch (error){
|
|
|
- console.error(error);
|
|
|
+ })
|
|
|
+ .then(function(files) {
|
|
|
+ var builder = createConcatenator();
|
|
|
+ builder.add('(function() {');
|
|
|
+ builder.start();
|
|
|
+
|
|
|
+ files.forEach(function(data) {
|
|
|
+ // data is an array where index 0 is the error code and index 1 contains the data
|
|
|
+ builder.add(data);
|
|
|
+ // matches and returns the "module_id" string in the AMD definition: define("module_id", ...)
|
|
|
+ var match = ('' + data).match(/^define\("([^"]*)"/);
|
|
|
+ if (match) {
|
|
|
+ builder.addId(match[1]);
|
|
|
}
|
|
|
+ });
|
|
|
+ // store the generated smalltalk env in configuration.smalltalk
|
|
|
+ builder.finish('configuration.smalltalk = smalltalk;');
|
|
|
+ builder.add('})();');
|
|
|
|
|
|
- console.log('Compiler loaded');
|
|
|
+ eval(builder.toString());
|
|
|
|
|
|
- configuration.smalltalk.ErrorHandler._register_(configuration.smalltalk.RethrowErrorHandler._new());
|
|
|
+ console.log('Compiler loaded');
|
|
|
|
|
|
- if(0 !== configuration.jsGlobals.length) {
|
|
|
- var jsGlobalVariables = configuration.smalltalk.globalJsVariables;
|
|
|
- jsGlobalVariables.push.apply(jsGlobalVariables, configuration.jsGlobals);
|
|
|
- }
|
|
|
+ configuration.smalltalk.ErrorHandler._register_(configuration.smalltalk.RethrowErrorHandler._new());
|
|
|
|
|
|
- resolve(configuration);
|
|
|
- }, function(error) {
|
|
|
- reject(Error('Error creating compiler'));
|
|
|
- });
|
|
|
+ if(0 !== configuration.jsGlobals.length) {
|
|
|
+ var jsGlobalVariables = configuration.smalltalk.globalJsVariables;
|
|
|
+ jsGlobalVariables.push.apply(jsGlobalVariables, configuration.jsGlobals);
|
|
|
+ }
|
|
|
+
|
|
|
+ return configuration;
|
|
|
});
|
|
|
-};
|
|
|
+}
|
|
|
|
|
|
|
|
|
/**
|
|
@@ -371,49 +354,47 @@ function create_compiler(configuration) {
|
|
|
function compile(configuration) {
|
|
|
// return function which does the actual work
|
|
|
// and use the compile function to reference the configuration object
|
|
|
- return new Promise(function(resolve, reject) {
|
|
|
- Promise.all(
|
|
|
- configuration.compile.map(function(stFile) {
|
|
|
+ return Promise.all(
|
|
|
+ configuration.compile.map(function(stFile) {
|
|
|
+ return new Promise(function(resolve, reject) {
|
|
|
+ if (/\.st/.test(stFile)) {
|
|
|
+ console.ambercLog('Importing: ' + stFile);
|
|
|
+ fs.readFile(stFile, 'utf8', function(err, data) {
|
|
|
+ if (!err)
|
|
|
+ resolve(data);
|
|
|
+ else
|
|
|
+ reject(Error('Could not import: ' + stFile));
|
|
|
+ });
|
|
|
+ }
|
|
|
+ });
|
|
|
+ })
|
|
|
+ )
|
|
|
+ .then(function(fileContents) {
|
|
|
+ console.log('Compiling collected .st files');
|
|
|
+ // import/compile content of .st files
|
|
|
+ return Promise.all(
|
|
|
+ fileContents.map(function(code) {
|
|
|
return new Promise(function(resolve, reject) {
|
|
|
- if (/\.st/.test(stFile)) {
|
|
|
- console.ambercLog('Importing: ' + stFile);
|
|
|
- fs.readFile(stFile, 'utf8', function(err, data) {
|
|
|
- if (!err)
|
|
|
- resolve(data);
|
|
|
- else
|
|
|
- reject(Error('Could not import: ' + stFile));
|
|
|
- });
|
|
|
+ var importer = configuration.smalltalk.Importer._new();
|
|
|
+ try {
|
|
|
+ importer._import_(code._stream());
|
|
|
+ resolve(true);
|
|
|
+ } catch (ex) {
|
|
|
+ reject(Error("Import error in section:\n" +
|
|
|
+ importer._lastSection() + "\n\n" +
|
|
|
+ "while processing chunk:\n" +
|
|
|
+ importer._lastChunk() + "\n\n" +
|
|
|
+ (ex._messageText && ex._messageText() || ex.message || ex))
|
|
|
+ );
|
|
|
}
|
|
|
});
|
|
|
})
|
|
|
- )
|
|
|
- .then(function(fileContents) {
|
|
|
- console.log('Compiling collected .st files');
|
|
|
- // import/compile content of .st files
|
|
|
- Promise.all(
|
|
|
- fileContents.map(function(code) {
|
|
|
- return new Promise(function(resolve, reject) {
|
|
|
- var importer = configuration.smalltalk.Importer._new();
|
|
|
- try {
|
|
|
- importer._import_(code._stream());
|
|
|
- resolve(true);
|
|
|
- } catch (ex) {
|
|
|
- reject(Error("Import error in section:\n" +
|
|
|
- importer._lastSection() + "\n\n" +
|
|
|
- "while processing chunk:\n" +
|
|
|
- importer._lastChunk() + "\n\n" +
|
|
|
- (ex._messageText && ex._messageText() || ex.message || ex))
|
|
|
- );
|
|
|
- }
|
|
|
- });
|
|
|
- })
|
|
|
- );
|
|
|
- })
|
|
|
- .then(function() {
|
|
|
- resolve(configuration);
|
|
|
- });
|
|
|
+ );
|
|
|
+ })
|
|
|
+ .then(function () {
|
|
|
+ return configuration;
|
|
|
});
|
|
|
-};
|
|
|
+}
|
|
|
|
|
|
|
|
|
/**
|
|
@@ -421,36 +402,35 @@ function compile(configuration) {
|
|
|
* Returns a Promise() that resolves into the configuration object.
|
|
|
*/
|
|
|
function category_export(configuration) {
|
|
|
- return new Promise(function(resolve, reject) {
|
|
|
- Promise.all(
|
|
|
- configuration.compile.map(function(stFile) {
|
|
|
- return new Promise(function(resolve, reject) {
|
|
|
- var category = path.basename(stFile, '.st');
|
|
|
- var jsFilePath = configuration.output_dir;
|
|
|
- if (undefined === jsFilePath) {
|
|
|
- jsFilePath = path.dirname(stFile);
|
|
|
- }
|
|
|
- var jsFile = category + configuration.suffix_used + '.js';
|
|
|
- jsFile = path.join(jsFilePath, jsFile);
|
|
|
- configuration.compiled.push(jsFile);
|
|
|
- var smalltalk = configuration.smalltalk;
|
|
|
- var packageObject = smalltalk.Package._named_(category);
|
|
|
- packageObject._transport()._namespace_(configuration.amd_namespace);
|
|
|
- fs.writeFile(jsFile, smalltalk.String._streamContents_(function (stream) {
|
|
|
- smalltalk.AmdExporter._new()._exportPackage_on_(packageObject, stream);
|
|
|
- }), function(err) {
|
|
|
- if (err)
|
|
|
- reject(err);
|
|
|
- else
|
|
|
- resolve(true);
|
|
|
- });
|
|
|
+ return Promise.all(
|
|
|
+ configuration.compile.map(function(stFile) {
|
|
|
+ return new Promise(function(resolve, reject) {
|
|
|
+ var category = path.basename(stFile, '.st');
|
|
|
+ var jsFilePath = configuration.output_dir;
|
|
|
+ if (undefined === jsFilePath) {
|
|
|
+ jsFilePath = path.dirname(stFile);
|
|
|
+ }
|
|
|
+ var jsFile = category + configuration.suffix_used + '.js';
|
|
|
+ jsFile = path.join(jsFilePath, jsFile);
|
|
|
+ configuration.compiled.push(jsFile);
|
|
|
+ var smalltalk = configuration.smalltalk;
|
|
|
+ var packageObject = smalltalk.Package._named_(category);
|
|
|
+ packageObject._transport()._namespace_(configuration.amd_namespace);
|
|
|
+ fs.writeFile(jsFile, smalltalk.String._streamContents_(function (stream) {
|
|
|
+ smalltalk.AmdExporter._new()._exportPackage_on_(packageObject, stream);
|
|
|
+ }), function(err) {
|
|
|
+ if (err)
|
|
|
+ reject(err);
|
|
|
+ else
|
|
|
+ resolve(true);
|
|
|
});
|
|
|
- })
|
|
|
- ).then(function() {
|
|
|
- resolve(configuration);
|
|
|
- });
|
|
|
+ });
|
|
|
+ })
|
|
|
+ )
|
|
|
+ .then(function() {
|
|
|
+ return configuration;
|
|
|
});
|
|
|
-};
|
|
|
+}
|
|
|
|
|
|
|
|
|
/**
|
|
@@ -459,23 +439,22 @@ function category_export(configuration) {
|
|
|
*/
|
|
|
function verify(configuration) {
|
|
|
console.log('Verifying if all .st files were compiled');
|
|
|
- return new Promise(function(resolve, reject) {
|
|
|
- Promise.all(
|
|
|
- configuration.compiled.map(function(file) {
|
|
|
- return new Promise(function(resolve, reject) {
|
|
|
- fs.exists(file, function(exists) {
|
|
|
- if (exists)
|
|
|
- resolve(true);
|
|
|
- else
|
|
|
- reject(Error('Compilation failed of: ' + file));
|
|
|
- });
|
|
|
+ return Promise.all(
|
|
|
+ configuration.compiled.map(function(file) {
|
|
|
+ return new Promise(function(resolve, reject) {
|
|
|
+ fs.exists(file, function(exists) {
|
|
|
+ if (exists)
|
|
|
+ resolve(true);
|
|
|
+ else
|
|
|
+ reject(Error('Compilation failed of: ' + file));
|
|
|
});
|
|
|
- })
|
|
|
- ).then(function() {
|
|
|
- resolve(configuration);
|
|
|
- });
|
|
|
+ });
|
|
|
+ })
|
|
|
+ )
|
|
|
+ .then(function() {
|
|
|
+ return configuration;
|
|
|
});
|
|
|
-};
|
|
|
+}
|
|
|
|
|
|
|
|
|
/**
|
|
@@ -488,6 +467,7 @@ function compose_js_files(configuration) {
|
|
|
return new Promise(function(resolve, reject) {
|
|
|
var programFile = configuration.program;
|
|
|
if (undefined === programFile) {
|
|
|
+ resolve(configuration);
|
|
|
return;
|
|
|
}
|
|
|
if (undefined !== configuration.output_dir) {
|
|
@@ -513,10 +493,11 @@ function compose_js_files(configuration) {
|
|
|
fileStream.on('error', function(error) {
|
|
|
fileStream.end();
|
|
|
console.ambercLog(error);
|
|
|
+ reject(error);
|
|
|
});
|
|
|
|
|
|
fileStream.on('close', function(){
|
|
|
- return;
|
|
|
+ resolve(configuration);
|
|
|
});
|
|
|
|
|
|
var builder = createConcatenator();
|
|
@@ -560,9 +541,8 @@ function compose_js_files(configuration) {
|
|
|
});
|
|
|
console.log('Done.');
|
|
|
fileStream.end();
|
|
|
- resolve(configuration);
|
|
|
});
|
|
|
-};
|
|
|
+}
|
|
|
|
|
|
|
|
|
module.exports.Compiler = AmberC;
|