@@ -428,13 +428,18 @@ with
428428
429429// </Deprecated>
430430
431- let private getOrEmptyList hints = Option.defaultValue Array.empty hints
432-
433431type 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+
438443type 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.
668684let 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