-- Hoogle documentation, generated by Haddock
-- See Hoogle, http://www.haskell.org/hoogle/
-- | Source code suggestions
--
-- HLint gives suggestions on how to improve your source code.
@package hlint
@version 2.1.21
-- | WARNING: This module represents the evolving second version of the
-- HLint API. It will be renamed to drop the "3" in the next major
-- version.
--
-- This module provides a way to apply HLint hints. If you want to just
-- run hlint in-process and collect the results see
-- hlint. If you want to approximate the hlint experience
-- with a more structured API try:
--
--
-- (flags, classify, hint) <- autoSettings
-- Right m <- parseModuleEx flags "MyFile.hs" Nothing
-- print $ applyHints classify hint [m]
--
module Language.Haskell.HLint3
-- | This function takes a list of command line arguments, and returns the
-- given hints. To see a list of arguments type hlint --help at
-- the console. This function writes to the stdout/stderr streams, unless
-- --quiet is specified.
--
-- As an example:
--
--
-- do hints <- hlint ["src", "--ignore=Use map","--quiet"]
-- when (length hints > 3) $ error "Too many hints!"
--
--
-- Warning: The flags provided by HLint are relatively stable, but
-- do not have the same API stability guarantees as the rest of the
-- strongly-typed API. Do not run this function on a your server with
-- untrusted input.
hlint :: [String] -> IO [Idea]
-- | Given a way of classifying results, and a Hint, apply to a set
-- of modules generating a list of Ideas. The Idea values
-- will be ordered within a file.
--
-- Given a set of modules, it may be faster pass each to
-- applyHints in a singleton list. When given multiple modules at
-- once this function attempts to find hints between modules, which is
-- slower and often pointless (by default HLint passes modules
-- singularly, using --cross to pass all modules together).
applyHints :: [Classify] -> Hint -> [(Module SrcSpanInfo, [Comment])] -> [Idea]
-- | An idea suggest by a Hint.
data Idea
Idea :: [String] -> [String] -> Severity -> String -> SrcSpan -> String -> Maybe String -> [Note] -> [Refactoring SrcSpan] -> Idea
-- | The modules the idea is for, usually a singleton.
[ideaModule] :: Idea -> [String]
-- | The declarations the idea is for, usually a singleton, typically the
-- function name, but may be a type name.
[ideaDecl] :: Idea -> [String]
-- | The severity of the idea, e.g. Warning.
[ideaSeverity] :: Idea -> Severity
-- | The name of the hint that generated the idea, e.g. "Use
-- reverse".
[ideaHint] :: Idea -> String
-- | The source code the idea relates to.
[ideaSpan] :: Idea -> SrcSpan
-- | The contents of the source code the idea relates to.
[ideaFrom] :: Idea -> String
-- | The suggested replacement, or Nothing for no replacement (e.g.
-- on parse errors).
[ideaTo] :: Idea -> Maybe String
-- | Notes about the effect of applying the replacement.
[ideaNote] :: Idea -> [Note]
-- | How to perform this idea
[ideaRefactoring] :: Idea -> [Refactoring SrcSpan]
-- | How severe an issue is.
data Severity
-- | The issue has been explicitly ignored and will usually be hidden (pass
-- --show on the command line to see ignored ideas).
Ignore :: Severity
-- | Suggestions are things that some people may consider improvements, but
-- some may not.
Suggestion :: Severity
-- | Warnings are suggestions that are nearly always a good idea to apply.
Warning :: Severity
-- | Available as a setting for the user.
Error :: Severity
-- | A note describing the impact of the replacement.
data Note
-- | The replacement is increases laziness, for example replacing
-- reverse (reverse x) with x makes the code lazier.
IncreasesLaziness :: Note
-- | The replacement is decreases laziness, for example replacing (fst
-- x, snd x) with x makes the code stricter.
DecreasesLaziness :: Note
-- | The replacement removes errors, for example replacing foldr1
-- (+) with sum removes an error on [], and might
-- contain the text "on []".
RemovesError :: String -> Note
-- | The replacement assumes standard type class lemmas, a hint with the
-- note ValidInstance "Eq" "x" might only be valid if the
-- x variable has a reflexive Eq instance.
ValidInstance :: String -> String -> Note
-- | The replacement requires this extension to be available.
RequiresExtension :: String -> Note
-- | An arbitrary note.
Note :: String -> Note
-- | How to classify an Idea. If any matching field is ""
-- then it matches everything.
data Classify
Classify :: Severity -> String -> String -> String -> Classify
-- | Severity to set the Idea to.
[classifySeverity] :: Classify -> Severity
-- | Match on Idea field ideaHint.
[classifyHint] :: Classify -> String
-- | Match on Idea field ideaModule.
[classifyModule] :: Classify -> String
-- | Match on Idea field ideaDecl.
[classifyDecl] :: Classify -> String
-- | Get the Cabal configured data directory of HLint.
getHLintDataDir :: IO FilePath
-- | The function produces a tuple containg ParseFlags (for
-- parseModuleEx), and Classify and Hint for
-- applyHints. It approximates the normal HLint configuration
-- steps, roughly:
--
--
-- - Use findSettings with readSettingsFile to find and
-- load the HLint settings files.
-- - Use parseFlagsAddFixities and resolveHints to
-- transform the outputs of findSettings.
--
--
-- If you want to do anything custom (e.g. using a different data
-- directory, storing intermediate outputs, loading hints from a
-- database) you are expected to copy and paste this function, then
-- change it to your needs.
autoSettings :: IO (ParseFlags, [Classify], Hint)
-- | A version of autoSettings which respects some of the arguments
-- supported by HLint. If arguments unrecognised by HLint are used it
-- will result in an error. Arguments which have no representation in the
-- return type are silently ignored.
argsSettings :: [String] -> IO (ParseFlags, [Classify], Hint)
-- | Given a function to load a module (typically readSettingsFile),
-- and a module to start from (defaults to hlint.yaml) find the
-- information from all settings files.
findSettings :: (String -> IO (FilePath, Maybe String)) -> Maybe String -> IO ([Fixity], [Classify], [Either HintBuiltin HintRule])
-- | Given a directory (or Nothing to imply getHLintDataDir),
-- and a module name (e.g. HLint.Default), find the settings
-- file associated with it, returning the name of the file, and
-- (optionally) the contents.
--
-- This function looks for all settings files starting with
-- HLint. in the directory argument, and all other files
-- relative to the current directory.
readSettingsFile :: Maybe FilePath -> String -> IO (FilePath, Maybe String)
-- | A list of the builtin hints wired into HLint. This list is likely to
-- grow over time.
data HintBuiltin
HintList :: HintBuiltin
HintListRec :: HintBuiltin
HintMonad :: HintBuiltin
HintLambda :: HintBuiltin
HintBracket :: HintBuiltin
HintNaming :: HintBuiltin
HintPattern :: HintBuiltin
HintImport :: HintBuiltin
HintExport :: HintBuiltin
HintPragma :: HintBuiltin
HintExtensions :: HintBuiltin
HintUnsafe :: HintBuiltin
HintDuplicate :: HintBuiltin
HintRestrict :: HintBuiltin
HintComment :: HintBuiltin
HintNewType :: HintBuiltin
HintSmell :: HintBuiltin
-- | A LHS ==> RHS style hint rule.
data HintRule
HintRule :: Severity -> String -> Scope -> Exp SrcSpanInfo -> Exp SrcSpanInfo -> Maybe (Exp SrcSpanInfo) -> [Note] -> HintRule
-- | Default severity for the hint.
[hintRuleSeverity] :: HintRule -> Severity
-- | Name for the hint.
[hintRuleName] :: HintRule -> String
-- | Module scope in which the hint operates.
[hintRuleScope] :: HintRule -> Scope
-- | LHS
[hintRuleLHS] :: HintRule -> Exp SrcSpanInfo
-- | RHS
[hintRuleRHS] :: HintRule -> Exp SrcSpanInfo
-- | Side condition, typically specified with where _ = ....
[hintRuleSide] :: HintRule -> Maybe (Exp SrcSpanInfo)
-- | Notes about application of the hint.
[hintRuleNotes] :: HintRule -> [Note]
-- | Functions to generate hints, combined using the Monoid
-- instance.
data Hint
Hint :: ([Setting] -> [(Scope, Module SrcSpanInfo)] -> [Idea]) -> ([Setting] -> Scope -> Module SrcSpanInfo -> [Idea]) -> ([Setting] -> Scope -> Module SrcSpanInfo -> Decl SrcSpanInfo -> [Idea]) -> ([Setting] -> Comment -> [Idea]) -> Hint
-- | Given a list of modules (and their scope information) generate some
-- Ideas.
[hintModules] :: Hint -> [Setting] -> [(Scope, Module SrcSpanInfo)] -> [Idea]
-- | Given a single module and its scope information generate some
-- Ideas.
[hintModule] :: Hint -> [Setting] -> Scope -> Module SrcSpanInfo -> [Idea]
-- | Given a declaration (with a module and scope) generate some
-- Ideas. This function will be partially applied with one
-- module/scope, then used on multiple Decl values.
[hintDecl] :: Hint -> [Setting] -> Scope -> Module SrcSpanInfo -> Decl SrcSpanInfo -> [Idea]
-- | Given a comment generate some Ideas.
[hintComment] :: Hint -> [Setting] -> Comment -> [Idea]
-- | Transform a list of HintBuiltin or HintRule into a
-- Hint.
resolveHints :: [Either HintBuiltin HintRule] -> Hint
-- | Data type representing the modules in scope within a module. Created
-- with scopeCreate and queried with scopeMatch and
-- scopeMove. Note that the mempty Scope is not
-- equivalent to scopeCreate on an empty module, due to the
-- implicit import of Prelude.
data Scope
-- | Create a Scope value from a module, based on the modules
-- imports.
scopeCreate :: Module SrcSpanInfo -> Scope
-- | Given a two names in scopes, could they possibly refer to the same
-- thing. This property is reflexive.
scopeMatch :: (Scope, QName S) -> (Scope, QName S) -> Bool
-- | Given a name in a scope, and a new scope, create a name for the new
-- scope that will refer to the same thing. If the resulting name is
-- ambiguous, it picks a plausible candidate.
scopeMove :: (Scope, QName S) -> Scope -> QName S
-- | Parse a Haskell module. Applies the C pre processor, and uses
-- best-guess fixity resolution if there are ambiguities. The filename
-- - is treated as stdin. Requires some flags (often
-- defaultParseFlags), the filename, and optionally the contents
-- of that file. This version uses both hs-src-exts AND ghc-lib. It's
-- considered to be an unrecoverable error if one parsing method succeeds
-- whilst the other fails.
parseModuleEx :: ParseFlags -> FilePath -> Maybe String -> IO (Either ParseError (Module SrcSpanInfo, [Comment]))
-- | Default value for ParseFlags.
defaultParseFlags :: ParseFlags
-- | Given some fixities, add them to the existing fixities in
-- ParseFlags.
parseFlagsAddFixities :: [Fixity] -> ParseFlags -> ParseFlags
-- | A parse error.
data ParseError
ParseError :: SrcLoc -> String -> String -> ParseError
-- | Location of the error.
[parseErrorLocation] :: ParseError -> SrcLoc
-- | Message about the cause of the error. Testing seems to indicate that
-- this field doesn't participate in user error messages [SF 2019-05-14]?
[parseErrorMessage] :: ParseError -> String
-- | Snippet of several lines (typically 5) including a >
-- character pointing at the faulty line.
[parseErrorContents] :: ParseError -> String
-- | Created with defaultParseFlags, used by parseModuleEx.
data ParseFlags
ParseFlags :: CppFlags -> ParseMode -> ParseFlags
-- | How the file is preprocessed (defaults to NoCpp).
[cppFlags] :: ParseFlags -> CppFlags
-- | How the file is parsed (defaults to all fixities in the base
-- package and most non-conflicting extensions).
[hseFlags] :: ParseFlags -> ParseMode
-- | What C pre processor should be used.
data CppFlags
-- | No pre processing is done.
NoCpp :: CppFlags
-- | Lines prefixed with # are stripped.
CppSimple :: CppFlags
-- | The cpphs library is used.
Cpphs :: CpphsOptions -> CppFlags
-- | WARNING: This module represents the old version of the HLint
-- API. It will be deleted in favour of
-- Language.Haskell.HLint3 in the next major version.
--
-- This module provides a library interface to HLint, strongly modelled
-- on the command line interface.
module Language.Haskell.HLint
-- | This function takes a list of command line arguments, and returns the
-- given suggestions. To see a list of arguments type hlint
-- --help at the console. This function writes to the stdout/stderr
-- streams, unless --quiet is specified.
--
-- As an example:
--
--
-- do hints <- hlint ["src", "--ignore=Use map","--quiet"]
-- when (length hints > 3) $ error "Too many hints!"
--
hlint :: [String] -> IO [Suggestion]
-- | A suggestion - the Show instance is of particular use.
data Suggestion
-- | From a suggestion, extract the file location it refers to.
suggestionLocation :: Suggestion -> SrcLoc
-- | From a suggestion, determine how severe it is.
suggestionSeverity :: Suggestion -> Severity
-- | How severe an issue is.
data Severity
-- | The issue has been explicitly ignored and will usually be hidden (pass
-- --show on the command line to see ignored ideas).
Ignore :: Severity
-- | Suggestions are things that some people may consider improvements, but
-- some may not.
Suggestion :: Severity
-- | Warnings are suggestions that are nearly always a good idea to apply.
Warning :: Severity
-- | Available as a setting for the user.
Error :: Severity
instance GHC.Classes.Ord Language.Haskell.HLint.Suggestion
instance GHC.Classes.Eq Language.Haskell.HLint.Suggestion
instance GHC.Show.Show Language.Haskell.HLint.Suggestion