diff --git a/changelog.md b/changelog.md index d1e04177d826b..29b3237d0faa5 100644 --- a/changelog.md +++ b/changelog.md @@ -397,6 +397,11 @@ nim r main # uses cached binary nim r main arg1 arg2 # ditto (runtime arguments are irrelevant) +- The style checking of the compiler now supports a `--styleCheck:usages` switch. This switch + enforces that every symbol is written as it was declared, not enforcing + the official Nim style guide. To be enabled, this has to be combined either + with `--styleCheck:error` or `--styleCheck:hint`. + ## Tool changes - The rst parser now supports markdown table syntax. diff --git a/compiler/commands.nim b/compiler/commands.nim index 32f56ad0ebd50..16b85275c2aed 100644 --- a/compiler/commands.nim +++ b/compiler/commands.nim @@ -150,7 +150,7 @@ template switchOn(arg: string): bool = proc processOnOffSwitch(conf: ConfigRef; op: TOptions, arg: string, pass: TCmdLinePass, info: TLineInfo) = case arg.normalize - of "","on": conf.options.incl op + of "", "on": conf.options.incl op of "off": conf.options.excl op else: localError(conf, info, errOnOrOffExpectedButXFound % arg) @@ -971,6 +971,7 @@ proc processSwitch*(switch, arg: string, pass: TCmdLinePass, info: TLineInfo; of "off": conf.globalOptions = conf.globalOptions - {optStyleHint, optStyleError} of "hint": conf.globalOptions = conf.globalOptions + {optStyleHint} - {optStyleError} of "error": conf.globalOptions = conf.globalOptions + {optStyleError} + of "usages": conf.globalOptions.incl optStyleUsages else: localError(conf, info, errOffHintsError % arg) of "showallmismatches": processOnOffSwitchG(conf, {optShowAllMismatches}, arg, pass, info) diff --git a/compiler/linter.nim b/compiler/linter.nim index 83dd84699c59c..7059689cfde9b 100644 --- a/compiler/linter.nim +++ b/compiler/linter.nim @@ -95,7 +95,7 @@ proc nep1CheckDefImpl(conf: ConfigRef; info: TLineInfo; s: PSym; k: TSymKind) = lintReport(conf, info, beau, s.name.s) template styleCheckDef*(conf: ConfigRef; info: TLineInfo; s: PSym; k: TSymKind) = - if {optStyleHint, optStyleError} * conf.globalOptions != {}: + if {optStyleHint, optStyleError} * conf.globalOptions != {} and optStyleUsages notin conf.globalOptions: nep1CheckDefImpl(conf, info, s, k) template styleCheckDef*(conf: ConfigRef; info: TLineInfo; s: PSym) = diff --git a/compiler/options.nim b/compiler/options.nim index 717001b2b8a03..931458cb01981 100644 --- a/compiler/options.nim +++ b/compiler/options.nim @@ -60,6 +60,7 @@ type # please make sure we have under 32 options optUseNimcache, # save artifacts (including binary) in $nimcache optStyleHint, # check that the names adhere to NEP-1 optStyleError, # enforce that the names adhere to NEP-1 + optStyleUsages, # only enforce consistent **usages** of the symbol optSkipSystemConfigFile, # skip the system's cfg/nims config file optSkipProjConfigFile, # skip the project's cfg/nims config file optSkipUserConfigFile, # skip the users's cfg/nims config file diff --git a/doc/advopt.txt b/doc/advopt.txt index a783ebec51db2..e50fb243b0f53 100644 --- a/doc/advopt.txt +++ b/doc/advopt.txt @@ -57,6 +57,8 @@ Advanced options: produce hints or errors for Nim identifiers that do not adhere to Nim's official style guide https://nim-lang.org/docs/nep1.html + --styleCheck:usages only enforce consistent spellings of identifiers, + do not enforce the style on declarations --showAllMismatches:on|off show all mismatching candidates in overloading resolution diff --git a/tests/stylecheck/tusages.nim b/tests/stylecheck/tusages.nim new file mode 100644 index 0000000000000..f3b0d27cc1d69 --- /dev/null +++ b/tests/stylecheck/tusages.nim @@ -0,0 +1,23 @@ +discard """ + cmd: "nim c --styleCheck:error --styleCheck:usages $file" + errormsg: "'BAD_STYLE' should be: 'BADSTYLE'" + line: 20 +""" + +import strutils + +proc BADSTYLE(c: char) = discard + +proc toSnakeCase(s: string): string = + result = newStringOfCap(s.len + 3) + for i in 0.. 0 and s[i-1] in {'a'..'z'}: + result.add '_' + result.add toLowerAscii(s[i]) + else: + result.add s[i] + BAD_STYLE(s[i]) + +echo toSnakeCase("fooBarBaz Yes") +