|  | @@ -413,7 +413,23 @@ AmberC.prototype.create_compiler = function(compilerFilesArray) {
 | 
	
		
			
				|  |  |  			jsGlobalVariables.push.apply(jsGlobalVariables, self.defaults.jsGlobals);
 | 
	
		
			
				|  |  |  		}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -		self.compile();
 | 
	
		
			
				|  |  | +		readFiles(self.defaults).then(compile(self.defaults)
 | 
	
		
			
				|  |  | +		, function(error) {
 | 
	
		
			
				|  |  | +			console.error(error);
 | 
	
		
			
				|  |  | +		}).then(function() {
 | 
	
		
			
				|  |  | +			return self.defaults;
 | 
	
		
			
				|  |  | +		}).then(category_export)
 | 
	
		
			
				|  |  | +		.then(function(resolve) {
 | 
	
		
			
				|  |  | +			return self.defaults;
 | 
	
		
			
				|  |  | +		}, function(error) {
 | 
	
		
			
				|  |  | +			console.error(error);
 | 
	
		
			
				|  |  | +		}).then(verify)
 | 
	
		
			
				|  |  | +		.then(function(resolve) {
 | 
	
		
			
				|  |  | +			return self.defaults;
 | 
	
		
			
				|  |  | +		}, function(error) {
 | 
	
		
			
				|  |  | +			console.error(error);
 | 
	
		
			
				|  |  | +		}).then(compose_js_files);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  	});
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	compilerFilesArray.forEach(function(file) {
 | 
	
	
		
			
				|  | @@ -425,56 +441,56 @@ AmberC.prototype.create_compiler = function(compilerFilesArray) {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  /**
 | 
	
		
			
				|  |  |   * Compile all given .st files by importing them.
 | 
	
		
			
				|  |  | - * Followed by category_export().
 | 
	
		
			
				|  |  | + * Captures the configuration object in a closure and returns a function that
 | 
	
		
			
				|  |  | + * does the actual work and returns a Promise.all() object.
 | 
	
		
			
				|  |  |   */
 | 
	
		
			
				|  |  | -AmberC.prototype.compile = function() {
 | 
	
		
			
				|  |  | -	console.log('Compiling collected .st files');
 | 
	
		
			
				|  |  | -	// import .st files
 | 
	
		
			
				|  |  | -	var self = this;
 | 
	
		
			
				|  |  | -	var imports = new Combo(function() {
 | 
	
		
			
				|  |  | -		Array.prototype.slice.call(arguments).forEach(function(code) {
 | 
	
		
			
				|  |  | -			if (undefined !== code[0]) {
 | 
	
		
			
				|  |  | -				// get element 0 of code since all return values are stored inside an array by Combo
 | 
	
		
			
				|  |  | -                var importer = self.defaults.smalltalk.Importer._new();
 | 
	
		
			
				|  |  | -                try {
 | 
	
		
			
				|  |  | -                    importer._import_(code[0]._stream());
 | 
	
		
			
				|  |  | -                } catch (ex) {
 | 
	
		
			
				|  |  | -                    throw new 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));
 | 
	
		
			
				|  |  | -                }
 | 
	
		
			
				|  |  | -			}
 | 
	
		
			
				|  |  | -		});
 | 
	
		
			
				|  |  | -		category_export(self.defaults).then(function(resolve) {
 | 
	
		
			
				|  |  | -			return self.defaults;
 | 
	
		
			
				|  |  | -		}, function(error) {
 | 
	
		
			
				|  |  | -			console.error(error);
 | 
	
		
			
				|  |  | -		}).then(verify)
 | 
	
		
			
				|  |  | -		.then(function(resolve) {
 | 
	
		
			
				|  |  | -			return self.defaults;
 | 
	
		
			
				|  |  | -		}, function(error) {
 | 
	
		
			
				|  |  | -			console.error(error);
 | 
	
		
			
				|  |  | -		}).then(compose_js_files);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	});
 | 
	
		
			
				|  |  | +function compile(configuration) {
 | 
	
		
			
				|  |  | +	// return function which does the actual work
 | 
	
		
			
				|  |  | +	// and use the compile function to reference the configuration object
 | 
	
		
			
				|  |  | +	return 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, error) {
 | 
	
		
			
				|  |  | +					var importer = configuration.smalltalk.Importer._new();
 | 
	
		
			
				|  |  | +					try {
 | 
	
		
			
				|  |  | +						importer._import_(code._stream());
 | 
	
		
			
				|  |  | +						resolve(true);
 | 
	
		
			
				|  |  | +					} catch (ex) {
 | 
	
		
			
				|  |  | +						error(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))
 | 
	
		
			
				|  |  | +						);
 | 
	
		
			
				|  |  | +					}
 | 
	
		
			
				|  |  | +				});
 | 
	
		
			
				|  |  | +			})
 | 
	
		
			
				|  |  | +		);
 | 
	
		
			
				|  |  | +	};
 | 
	
		
			
				|  |  | +};
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -	this.defaults.compile.forEach(function(stFile) {
 | 
	
		
			
				|  |  | -		var callback = imports.add();
 | 
	
		
			
				|  |  | -		if (/\.st/.test(stFile)) {
 | 
	
		
			
				|  |  | -			console.ambercLog('Importing: ' + stFile);
 | 
	
		
			
				|  |  | -			fs.readFile(stFile, 'utf8', function(err, data) {
 | 
	
		
			
				|  |  | -				if (!err)
 | 
	
		
			
				|  |  | -					callback(data);
 | 
	
		
			
				|  |  | -				else
 | 
	
		
			
				|  |  | -					throw new Error('Could not import: ' + stFile);
 | 
	
		
			
				|  |  | +/**
 | 
	
		
			
				|  |  | + * Read the content of all files into memory.
 | 
	
		
			
				|  |  | + * Returns a Promise.all() object.
 | 
	
		
			
				|  |  | + */
 | 
	
		
			
				|  |  | +function readFiles(configuration) {
 | 
	
		
			
				|  |  | +	return Promise.all(
 | 
	
		
			
				|  |  | +		configuration.compile.map(function(stFile) {
 | 
	
		
			
				|  |  | +			return new Promise(function(resolve, error) {
 | 
	
		
			
				|  |  | +				if (/\.st/.test(stFile)) {
 | 
	
		
			
				|  |  | +					console.ambercLog('Importing: ' + stFile);
 | 
	
		
			
				|  |  | +					fs.readFile(stFile, 'utf8', function(err, data) {
 | 
	
		
			
				|  |  | +						if (!err)
 | 
	
		
			
				|  |  | +							resolve(data);
 | 
	
		
			
				|  |  | +						else
 | 
	
		
			
				|  |  | +							error(Error('Could not import: ' + stFile));
 | 
	
		
			
				|  |  | +					});
 | 
	
		
			
				|  |  | +				}
 | 
	
		
			
				|  |  |  			});
 | 
	
		
			
				|  |  | -		}
 | 
	
		
			
				|  |  | -	});
 | 
	
		
			
				|  |  | -	always_resolve(imports.add());
 | 
	
		
			
				|  |  | +		})
 | 
	
		
			
				|  |  | +	);
 | 
	
		
			
				|  |  |  };
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 |