Skip to content

Commit 5360bb6

Browse files
committed
Core: combine hint configs
When combining configs, if both base and overriding configs have Hints config, combine `add` and `ignore` arrays in HintConfig objects instead of totally overriding base hint config by overriding one. Also actually use `ignore` array to filter out available hints when flattening config. Before, `ignore` was not used at all. Fixes #466
1 parent a0977fc commit 5360bb6

1 file changed

Lines changed: 29 additions & 6 deletions

File tree

src/FSharpLint.Core/Application/Configuration.fs

Lines changed: 29 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -428,13 +428,18 @@ with
428428

429429
// </Deprecated>
430430

431-
let private getOrEmptyList hints = Option.defaultValue Array.empty hints
432-
433431
type HintConfig = {
434432
add:string [] option
435433
ignore:string [] option
436434
}
437435

436+
let private flattenHints (config: HintConfig) =
437+
let ignores =
438+
Option.defaultValue Array.empty config.ignore
439+
|> Set.ofArray
440+
Option.defaultValue Array.empty config.add
441+
|> Array.filter (fun hint -> not <| ignores.Contains hint)
442+
438443
type GlobalConfig = {
439444
numIndentationSpaces:int option
440445
}
@@ -663,6 +668,17 @@ let loadConfig (configPath:string) =
663668
File.ReadAllText configPath
664669
|> parseConfig
665670

671+
let private combineHints (baseConfig: HintConfig) (overridingConfig: HintConfig) =
672+
let mergeLists baseList overridingList =
673+
match (baseList, overridingList) with
674+
| Some baseArray, None -> Some baseArray
675+
| Some baseArray, Some overridingArray -> Array.append baseArray overridingArray |> Array.distinct |> Some
676+
| None, _ -> overridingList
677+
{
678+
add = mergeLists baseConfig.add overridingConfig.add
679+
ignore = mergeLists baseConfig.ignore overridingConfig.ignore
680+
}
681+
666682
/// Combine two configs into one: all values that are Some in second config override
667683
/// corresponding values in first config.
668684
let combineConfigs (baseConfig: Configuration) (overridingConfig: Configuration) : Configuration =
@@ -678,9 +694,16 @@ let combineConfigs (baseConfig: Configuration) (overridingConfig: Configuration)
678694
overridingValue)
679695
baseFields
680696
partialConfigFields
681-
682-
FSharp.Reflection.FSharpValue.MakeRecord(typeof<Configuration>, resultingRecordFields)
683-
:?> Configuration
697+
698+
let mergedConfig =
699+
FSharp.Reflection.FSharpValue.MakeRecord(typeof<Configuration>, resultingRecordFields)
700+
:?> Configuration
701+
702+
match (baseConfig.Hints, overridingConfig.Hints) with
703+
| Some baseHints, Some overridingHints ->
704+
{ mergedConfig with Hints = Some(combineHints baseHints overridingHints) }
705+
| _ ->
706+
mergedConfig
684707

685708
/// A default configuration specifying every analyser and rule is included as a resource file in the framework.
686709
/// This function loads and returns this default configuration.
@@ -771,7 +794,7 @@ let flattenConfig (config:Configuration) =
771794
config.typography |> Option.map (fun config -> config.Flatten()) |> Option.toArray |> Array.concat
772795
// </Deprecated>
773796

774-
config.Hints |> Option.map (fun config -> HintMatcher.rule { HintMatcher.Config.HintTrie = parseHints (getOrEmptyList config.add) }) |> Option.toArray
797+
config.Hints |> Option.map (fun config -> HintMatcher.rule { HintMatcher.Config.HintTrie = parseHints (flattenHints config) }) |> Option.toArray
775798
|]
776799

777800
let allRules =

0 commit comments

Comments
 (0)