From cc1f16a4ae6c52a47627fb0b66ac3fac3c1a4e50 Mon Sep 17 00:00:00 2001 From: Ganesh Viswanathan Date: Sat, 22 Feb 2020 15:09:37 -0600 Subject: [PATCH] Fix #9405 - cfg and nims run in sync --- compiler/cmdlinehelper.nim | 29 ++--------------------------- compiler/nimconf.nim | 30 +++++++++++++++++++++++++++++- 2 files changed, 31 insertions(+), 28 deletions(-) diff --git a/compiler/cmdlinehelper.nim b/compiler/cmdlinehelper.nim index b3c0c46c2be00..a038990715064 100644 --- a/compiler/cmdlinehelper.nim +++ b/compiler/cmdlinehelper.nim @@ -10,7 +10,7 @@ ## Helpers for binaries that use compiler passes, eg: nim, nimsuggest, nimfix import - options, idents, nimconf, scriptconfig, extccomp, commands, msgs, + options, idents, nimconf, extccomp, commands, msgs, lineinfos, modulegraphs, condsyms, os, pathutils from strutils import normalize @@ -43,32 +43,13 @@ proc processCmdLineAndProjectPath*(self: NimProg, conf: ConfigRef) = conf.projectPath = AbsoluteDir canonicalizePath(conf, AbsoluteFile getCurrentDir()) proc loadConfigsAndRunMainCommand*(self: NimProg, cache: IdentCache; conf: ConfigRef): bool = - loadConfigs(DefaultConfig, cache, conf) # load all config files if self.suggestMode: conf.command = "nimsuggest" + loadConfigs(DefaultConfig, cache, conf) # load all config files - template runNimScriptIfExists(path: AbsoluteFile) = - let p = path # eval once - if fileExists(p): - runNimScript(cache, p, freshDefines = false, conf) - - # Caution: make sure this stays in sync with `loadConfigs` - if optSkipSystemConfigFile notin conf.globalOptions: - runNimScriptIfExists(getSystemConfigPath(conf, DefaultConfigNims)) - - if optSkipUserConfigFile notin conf.globalOptions: - runNimScriptIfExists(getUserConfigPath(DefaultConfigNims)) - - if optSkipParentConfigFiles notin conf.globalOptions: - for dir in parentDirs(conf.projectPath.string, fromRoot = true, inclusive = false): - runNimScriptIfExists(AbsoluteDir(dir) / DefaultConfigNims) - - if optSkipProjConfigFile notin conf.globalOptions: - runNimScriptIfExists(conf.projectPath / DefaultConfigNims) block: let scriptFile = conf.projectFull.changeFileExt("nims") if not self.suggestMode: - runNimScriptIfExists(scriptFile) # 'nim foo.nims' means to just run the NimScript file and do nothing more: if fileExists(scriptFile) and scriptFile == conf.projectFull: if conf.command == "": @@ -76,12 +57,6 @@ proc loadConfigsAndRunMainCommand*(self: NimProg, cache: IdentCache; conf: Confi return false elif conf.command.normalize == "e": return false - else: - if scriptFile != conf.projectFull: - runNimScriptIfExists(scriptFile) - else: - # 'nimsuggest foo.nims' means to just auto-complete the NimScript file - discard # now process command line arguments again, because some options in the # command line can overwrite the config file's settings diff --git a/compiler/nimconf.nim b/compiler/nimconf.nim index 93cc215734f3d..df1ceb6106efb 100644 --- a/compiler/nimconf.nim +++ b/compiler/nimconf.nim @@ -11,7 +11,7 @@ import llstream, commands, os, strutils, msgs, lexer, - options, idents, wordrecg, strtabs, lineinfos, pathutils + options, idents, wordrecg, strtabs, lineinfos, pathutils, scriptconfig # ---------------- configuration file parser ----------------------------- # we use Nim's scanner here to save space and work @@ -248,17 +248,31 @@ proc loadConfigs*(cfg: RelativeFile; cache: IdentCache; conf: ConfigRef) = if readConfigFile(configPath, cache, conf): configFiles.add(configPath) + template runNimScriptIfExists(path: AbsoluteFile) = + let p = path # eval once + if fileExists(p): + runNimScript(cache, p, freshDefines = false, conf) + if optSkipSystemConfigFile notin conf.globalOptions: readConfigFile(getSystemConfigPath(conf, cfg)) + if cfg == DefaultConfig: + runNimScriptIfExists(getSystemConfigPath(conf, DefaultConfigNims)) + if optSkipUserConfigFile notin conf.globalOptions: readConfigFile(getUserConfigPath(cfg)) + if cfg == DefaultConfig: + runNimScriptIfExists(getUserConfigPath(DefaultConfigNims)) + let pd = if not conf.projectPath.isEmpty: conf.projectPath else: AbsoluteDir(getCurrentDir()) if optSkipParentConfigFiles notin conf.globalOptions: for dir in parentDirs(pd.string, fromRoot=true, inclusive=false): readConfigFile(AbsoluteDir(dir) / cfg) + if cfg == DefaultConfig: + runNimScriptIfExists(AbsoluteDir(dir) / DefaultConfigNims) + if optSkipProjConfigFile notin conf.globalOptions: readConfigFile(pd / cfg) @@ -269,6 +283,20 @@ proc loadConfigs*(cfg: RelativeFile; cache: IdentCache; conf: ConfigRef) = projectConfig = changeFileExt(conf.projectFull, "nim.cfg") readConfigFile(projectConfig) + if cfg == DefaultConfig: + runNimScriptIfExists(pd / DefaultConfigNims) + for filename in configFiles: # delayed to here so that `hintConf` is honored rawMessage(conf, hintConf, filename.string) + + block: + let scriptFile = conf.projectFull.changeFileExt("nims") + if conf.command != "nimsuggest": + runNimScriptIfExists(scriptFile) + else: + if scriptFile != conf.projectFull: + runNimScriptIfExists(scriptFile) + else: + # 'nimsuggest foo.nims' means to just auto-complete the NimScript file + discard