diff options
Diffstat (limited to 'lib/compilers/nim.js')
-rw-r--r-- | lib/compilers/nim.js | 67 |
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); } |