aboutsummaryrefslogtreecommitdiff
path: root/lib/compilers/nim.js
diff options
context:
space:
mode:
Diffstat (limited to 'lib/compilers/nim.js')
-rw-r--r--lib/compilers/nim.js67
1 files changed, 39 insertions, 28 deletions
diff --git a/lib/compilers/nim.js b/lib/compilers/nim.js
index 8a7745fe6..0b818159f 100644
--- a/lib/compilers/nim.js
+++ b/lib/compilers/nim.js
@@ -28,6 +28,14 @@ const BaseCompiler = require('../base-compiler'),
argumentParsers = require("./argument-parsers"),
fs = require('fs-extra');
+const NimCommands = [
+ "compile", "compileToC", "c",
+ "compileToCpp", "cpp", "cc",
+ "compileToOC", "objc",
+ "js",
+ "check"
+];
+
class NimCompiler extends BaseCompiler {
constructor(info, env) {
super(info, env);
@@ -47,54 +55,57 @@ class NimCompiler extends BaseCompiler {
}
filterUserOptions(userOptions) {
- //Allowed commands
- const commands = [
- "compile", "compileToC", "c",
- "compileToCpp", "cpp", "cc",
- "compileToOC", "objc",
- "js",
- "check"
- ];
-
//If none of the allowed commands is present in userOptions compile to C++
- if (_.intersection(userOptions, commands).length === 0) {
+ if (_.intersection(userOptions, NimCommands).length === 0) {
userOptions.unshift("compileToCpp");
}
return userOptions.filter(option => !['--run', '-r'].includes(option));
}
+ expectedExtensionFromCommand(command) {
+ const isC = ["compile", "compileToC", "c"],
+ isCpp = ["compileToCpp", "cpp", "cc"],
+ isObjC = ["compileToOC", "objc"];
+
+ if (isC.includes(command))
+ return '.c.o';
+ else if (isCpp.includes(command))
+ return '.cpp.o';
+ else if (isObjC.includes(command))
+ return '.m.o';
+ else
+ return null;
+ }
+
+ getCacheFile(options, inputFilename, cacheDir) {
+ const commandsInOptions = _.intersection(options, NimCommands);
+ if (!commandsInOptions.length)
+ return null;
+ const command = commandsInOptions[0];
+ const extension = this.expectedExtensionFromCommand(command);
+ if (!extension)
+ return null;
+ const moduleName = path.basename(inputFilename);
+ const resultName = moduleName + extension;
+ return path.join(cacheDir, resultName);
+ }
+
postProcess(result, outputFilename, filters) {
let options = result.compilationOptions;
let setup = Promise.resolve("");
const cacheDir = this.cacheDir(outputFilename);
const cleanup = () => fs.remove(cacheDir);
- if (_.intersection(options, ["js", "check"]).length !== 0)
+ if (_.intersection(options, ["js", "check"]).length)
filters.binary = false;
else {
filters.binary = true;
-
- const isC = ["compile", "compileToC", "c"],
- isCpp = ["compileToCpp", "cpp", "cc"],
- isObjC = ["compileToOC", "objc"];
-
- let extension;
- if (_.intersection(options, isC).length !== 0)
- extension = '.c.o';
- else if (_.intersection(options, isCpp).length !== 0)
- extension = '.cpp.o';
- else if (_.intersection(options, isObjC).length !== 0)
- extension = '.m.o';
-
- const moduleName = path.basename(result.inputFilename);
- const resultName = moduleName + extension;
- const objFile = path.join(cacheDir, resultName);
+ const objFile = this.getCacheFile(options, result.inputFilename, cacheDir);
setup = fs.move(objFile, outputFilename);
}
const postProcess = () => super.postProcess(result, outputFilename, filters);
-
return setup.then(postProcess).finally(cleanup);
}