# Copyright (c) 2023 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved. # SPDX-License-Identifier: Apache-2.0 # HLint configuration file # https://github.com/ndmitchell/hlint ########################## # To run HLint do: # $ hlint --git -j4 # Warnings currently triggered by our code - ignore: {name: "Use <$>"} - ignore: {name: "Use :"} - ignore: {name: "Redundant do"} - ignore: {name: "Avoid lambda"} - ignore: {name: "Use newtype instead of data"} - ignore: {name: "Use fromMaybe"} - ignore: {name: "Use unless"} - ignore: {name: "Move brackets to avoid $"} - ignore: {name: "Eta reduce"} - ignore: {name: "Parse error"} - ignore: {name: "Reduce duplication"} - ignore: {name: "Use ++"} - ignore: {name: "Use $>"} - ignore: {name: "Use section"} - ignore: {name: "Use record patterns"} - ignore: {name: "Use camelCase"} - ignore: {name: "Use uncurry"} - ignore: {name: "Avoid lambda using `infix`"} # Under Linux/MacOS, Foreign function interface language pragma is unused. - ignore: {name: Unused LANGUAGE pragma, within: DA.Sdk.Cli.System} # Off by default hints we like - warn: {name: Use module export list} # Performance foot guns - warn: {lhs: foldl, rhs: "foldl'"} # Condemn nub and friends - warn: {lhs: nub (sort x), rhs: Data.List.Extra.nubSort x} - warn: {lhs: nub, rhs: Data.List.Extra.nubOrd} - warn: {lhs: nubBy, rhs: Data.List.Extra.nubOrdBy} - warn: {lhs: Data.List.Extra.nubOn, rhs: Data.List.Extra.nubOrdOn} # Promote whenJust - warn: {lhs: maybe (return ()) f x, rhs: Control.Monad.Extra.whenJust x f} - warn: {lhs: maybe (pure ()) f x, rhs: Control.Monad.Extra.whenJust x f} # DA specific hints - warn: {lhs: Data.Text.pack (DA.Pretty.renderPlain x), rhs: DA.Pretty.renderPlain x} - warn: {lhs: Data.Text.Extended.pack (DA.Pretty.renderPlain x), rhs: DA.Pretty.renderPlain x} - warn: {lhs: DA.Pretty.renderPlain (DA.Pretty.pretty x), rhs: DA.Pretty.renderPretty x} - warn: {lhs: Data.Text.readFile, rhs: Data.Text.Extended.readFileUtf8} - warn: {lhs: Data.Text.writeFile, rhs: Data.Text.Extended.writeFileUtf8} - warn: {lhs: Data.Text.Lazy.readFile, rhs: Data.Text.Extended.readFileUtf8} - warn: {lhs: Data.Text.Lazy.writeFile, rhs: Data.Text.Extended.writeFileUtf8} - warn: {lhs: System.Environment.setEnv, rhs: System.Environment.Blank.setEnv} - warn: {lhs: toNormalizedFilePath, rhs: "toNormalizedFilePath'"} ## DA+Bazel specific hints - warn: name: locateRunfiles/package_app lhs: DA.Bazel.Runfiles.locateRunfiles rhs: locateResources note: |- When used from a packaged application (bazel_tools/packaging/packaging.bzl#package_app), the bazel "runfiles" directory is not available, so 'locateRunfiles' simply crashes at runtime. This is probably not what you want in a packaged application. For that use case, prefer instead 'locateResources', which allows you to specify the path to the resource in a packaged application, and the prefix to be prepended to it to obtain the runfiles path. When only used from a 'bazel run' or 'bazel test' target this is fine and the warning can be selectively disabled by adding the following comment near the top of the relevant module: {- HLINT ignore "locateRunfiles/package_app" -} # Hints that do not always make sense - ignore: {name: "Use if", within: [DA.Daml.LF.Proto3.EncodeV1, DA.Daml.LF.Ast.Pretty]} # Specify additional command line arguments # # - arguments: [--color, --cpp-simple, -XQuasiQuotes] - extensions: - default: true # Extensions enabled by `bazel` and `da-ghci` by default. We ban them here # to avoid useless pragmas piling up on the top of files. - {name: BangPatterns, within: []} - {name: DeriveDataTypeable, within: []} - {name: DeriveFoldable, within: []} - {name: DeriveFunctor, within: []} - {name: DeriveGeneric, within: []} - {name: DeriveTraversable, within: []} - {name: FlexibleContexts, within: []} - {name: GeneralizedNewtypeDeriving, within: []} - {name: LambdaCase, within: []} - {name: NamedFieldPuns, within: []} - {name: OverloadedStrings, within: []} - {name: PackageImports, within: []} - {name: RecordWildCards, within: []} - {name: ScopedTypeVariables, within: []} - {name: StandaloneDeriving, within: []} - {name: TupleSections, within: []} - {name: TypeApplications, within: []} - {name: ViewPatterns, within: []} # Shady extensions - {name: ImplicitParams, within: []} - name: CPP within: - Development.IDE.Core.FileStore - DA.Cli.Damlc - DA.Sdk.Cli.System - DA.Sdk.Cli.Version - DA.Daml.Assistant.Install.Path - DA.Daml.Desugar.Tests - DA.Daml.Doc.Tests - DA.Test.DamlRenamer - DA.Test.DamlcIntegration - DA.Signals - Development.IDE.Core.Compile - Development.IDE.GHC.Compat - Development.IDE.GHC.Util - Development.IDE.Import.FindImports - Development.IDE.Spans.Calculate - flags: - default: false - {name: [-Wno-missing-signatures, -Wno-orphans, -Wno-overlapping-patterns, -Wno-incomplete-patterns, -Wno-missing-fields, -Wno-unused-matches]} - {name: [-Wno-dodgy-imports], within: Main} # - modules: # - {name: [Data.Set, Data.HashSet], as: Set} # if you import Data.Set qualified, it must be as 'Set' # - {name: Control.Arrow, within: []} # Certain modules are banned entirely # - functions: - {name: unsafePerformIO, within: [DA.Daml.UtilGHC]} - {name: unsafeInterleaveIO, within: []} - {name: unsafeDupablePerformIO, within: []} - {name: setCurrentDirectory, within: [DA.Daml.Assistant.Tests, Main]} - {name: unsafeCoerce, within: [SdkVersion.Class]} # Add custom hints for this project # # Will suggest replacing "wibbleMany [myvar]" with "wibbleOne myvar" # - error: {lhs: "wibbleMany [x]", rhs: wibbleOne x} # Turn on hints that are off by default # # Ban "module X(module X) where", to require a real export list # - warn: {name: Use explicit module export list} # # Replace a $ b $ c with a . b $ c # - group: {name: dollar, enabled: true} # # Generalise map to fmap, ++ to <> # - group: {name: generalise, enabled: true} # Ignore some builtin hints # - ignore: {name: Use let} # - ignore: {name: Use const, within: SpecialModule} # Only within certain modules # Define some custom infix operators # - fixity: infixr 3 ~^#^~