{-# LANGUAGE ImportQualifiedPost #-}
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE RecordWildCards #-}
{-# OPTIONS_GHC -Wno-incomplete-patterns #-}
module HLint(hlint, readAllSettings) where
import Control.Applicative
import Control.Monad.Extra
import Control.Exception.Extra
import Control.Concurrent.Extra
import System.Console.CmdArgs.Verbosity
import GHC.Util.DynFlags
import Data.List.Extra
import GHC.Conc
import System.Directory
import System.Exit
import System.IO.Extra
import System.Time.Extra
import Data.Tuple.Extra
import Data.Bifunctor (bimap)
import Prelude
import CmdLine
import Config.Read
import Config.Type
import Config.Compute
import Report
import Summary
import Idea
import Apply
import Test.All
import Hint.All
import Refact
import Timing
import Parallel
import GHC.All
import CC
import EmbedData
import SARIF qualified
hlint :: [String] -> IO [Idea]
hlint :: [String] -> IO [Idea]
hlint [String]
args = do
IO ()
startTimings
Cmd
cmd <- [String] -> IO Cmd
getCmd [String]
args
forall a. String -> String -> IO a -> IO a
timedIO String
"Initialise" String
"global flags" IO ()
initGlobalDynFlags
if Cmd -> Bool
cmdTest Cmd
cmd then
Cmd -> IO ()
hlintTest Cmd
cmd forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> forall (f :: * -> *) a. Applicative f => a -> f a
pure []
else do
(Seconds
time, [Idea]
xs) <- forall (m :: * -> *) a. MonadIO m => m a -> m (Seconds, a)
duration forall a b. (a -> b) -> a -> b
$ [String] -> Cmd -> IO [Idea]
hlintMain [String]
args Cmd
cmd
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (Cmd -> Bool
cmdTiming Cmd
cmd) forall a b. (a -> b) -> a -> b
$ do
IO ()
printTimings
String -> IO ()
putStrLn forall a b. (a -> b) -> a -> b
$ String
"Took " forall a. [a] -> [a] -> [a]
++ Seconds -> String
showDuration Seconds
time
forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a b. (a -> b) -> a -> b
$ if Cmd -> Bool
cmdNoExitCode Cmd
cmd then [] else [Idea]
xs
hlintTest :: Cmd -> IO ()
hlintTest :: Cmd -> IO ()
hlintTest cmd :: Cmd
cmd@CmdMain{Bool
Int
String
[String]
[Severity]
ColorMode
cmdGenerateExhaustiveConf :: Cmd -> [Severity]
cmdGenerateJsonSummary :: Cmd -> [String]
cmdGenerateMdSummary :: Cmd -> [String]
cmdIgnoreGlob :: Cmd -> [String]
cmdWithRefactor :: Cmd -> String
cmdRefactorOptions :: Cmd -> String
cmdRefactor :: Cmd -> Bool
cmdSerialise :: Cmd -> Bool
cmdOnly :: Cmd -> [String]
cmdNoSummary :: Cmd -> Bool
cmdSARIF :: Cmd -> Bool
cmdCC :: Cmd -> Bool
cmdJson :: Cmd -> Bool
cmdCppAnsi :: Cmd -> Bool
cmdCppSimple :: Cmd -> Bool
cmdCppFile :: Cmd -> [String]
cmdCppInclude :: Cmd -> [String]
cmdCppDefine :: Cmd -> [String]
cmdPath :: Cmd -> [String]
cmdDefault :: Cmd -> Bool
cmdDataDir :: Cmd -> String
cmdFindHints :: Cmd -> [String]
cmdCross :: Cmd -> Bool
cmdLanguage :: Cmd -> [String]
cmdExtension :: Cmd -> [String]
cmdIgnoreSuggestions :: Cmd -> Bool
cmdShowAll :: Cmd -> Bool
cmdIgnore :: Cmd -> [String]
cmdThreads :: Cmd -> Int
cmdColor :: Cmd -> ColorMode
cmdGit :: Cmd -> Bool
cmdWithGroups :: Cmd -> [String]
cmdGivenHints :: Cmd -> [String]
cmdReports :: Cmd -> [String]
cmdFiles :: Cmd -> [String]
cmdTest :: Bool
cmdGenerateExhaustiveConf :: [Severity]
cmdGenerateJsonSummary :: [String]
cmdGenerateMdSummary :: [String]
cmdIgnoreGlob :: [String]
cmdWithRefactor :: String
cmdRefactorOptions :: String
cmdRefactor :: Bool
cmdSerialise :: Bool
cmdTiming :: Bool
cmdNoExitCode :: Bool
cmdOnly :: [String]
cmdNoSummary :: Bool
cmdSARIF :: Bool
cmdCC :: Bool
cmdJson :: Bool
cmdCppAnsi :: Bool
cmdCppSimple :: Bool
cmdCppFile :: [String]
cmdCppInclude :: [String]
cmdCppDefine :: [String]
cmdPath :: [String]
cmdDefault :: Bool
cmdDataDir :: String
cmdFindHints :: [String]
cmdCross :: Bool
cmdLanguage :: [String]
cmdExtension :: [String]
cmdIgnoreSuggestions :: Bool
cmdShowAll :: Bool
cmdIgnore :: [String]
cmdThreads :: Int
cmdColor :: ColorMode
cmdGit :: Bool
cmdWithGroups :: [String]
cmdGivenHints :: [String]
cmdReports :: [String]
cmdFiles :: [String]
cmdNoExitCode :: Cmd -> Bool
cmdTiming :: Cmd -> Bool
cmdTest :: Cmd -> Bool
..} = do
Int
failed <- Cmd -> ([String] -> IO ()) -> String -> [String] -> IO Int
test Cmd
cmd (\[String]
args -> do [Idea]
errs <- [String] -> IO [Idea]
hlint [String]
args; forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
unless (forall (t :: * -> *) a. Foldable t => t a -> Bool
null [Idea]
errs) forall a b. (a -> b) -> a -> b
$ forall a. ExitCode -> IO a
exitWith forall a b. (a -> b) -> a -> b
$ Int -> ExitCode
ExitFailure Int
1) String
cmdDataDir [String]
cmdGivenHints
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (Int
failed forall a. Ord a => a -> a -> Bool
> Int
0) forall a. IO a
exitFailure
cmdParseFlags :: Cmd -> ParseFlags
cmdParseFlags :: Cmd -> ParseFlags
cmdParseFlags Cmd
cmd = (Maybe Language, ([Extension], [Extension]))
-> ParseFlags -> ParseFlags
parseFlagsSetLanguage (Cmd -> (Maybe Language, ([Extension], [Extension]))
cmdExtensions Cmd
cmd) forall a b. (a -> b) -> a -> b
$ ParseFlags
defaultParseFlags{cppFlags :: CppFlags
cppFlags=Cmd -> CppFlags
cmdCpp Cmd
cmd}
withVerbosity :: Verbosity -> IO a -> IO a
withVerbosity :: forall a. Verbosity -> IO a -> IO a
withVerbosity Verbosity
new IO a
act = do
Verbosity
old <- IO Verbosity
getVerbosity
(Verbosity -> IO ()
setVerbosity Verbosity
new forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> IO a
act) forall a b. IO a -> IO b -> IO a
`finally` Verbosity -> IO ()
setVerbosity Verbosity
old
hlintMain :: [String] -> Cmd -> IO [Idea]
hlintMain :: [String] -> Cmd -> IO [Idea]
hlintMain [String]
args cmd :: Cmd
cmd@CmdMain{Bool
Int
String
[String]
[Severity]
ColorMode
cmdTest :: Bool
cmdGenerateExhaustiveConf :: [Severity]
cmdGenerateJsonSummary :: [String]
cmdGenerateMdSummary :: [String]
cmdIgnoreGlob :: [String]
cmdWithRefactor :: String
cmdRefactorOptions :: String
cmdRefactor :: Bool
cmdSerialise :: Bool
cmdTiming :: Bool
cmdNoExitCode :: Bool
cmdOnly :: [String]
cmdNoSummary :: Bool
cmdSARIF :: Bool
cmdCC :: Bool
cmdJson :: Bool
cmdCppAnsi :: Bool
cmdCppSimple :: Bool
cmdCppFile :: [String]
cmdCppInclude :: [String]
cmdCppDefine :: [String]
cmdPath :: [String]
cmdDefault :: Bool
cmdDataDir :: String
cmdFindHints :: [String]
cmdCross :: Bool
cmdLanguage :: [String]
cmdExtension :: [String]
cmdIgnoreSuggestions :: Bool
cmdShowAll :: Bool
cmdIgnore :: [String]
cmdThreads :: Int
cmdColor :: ColorMode
cmdGit :: Bool
cmdWithGroups :: [String]
cmdGivenHints :: [String]
cmdReports :: [String]
cmdFiles :: [String]
cmdGenerateExhaustiveConf :: Cmd -> [Severity]
cmdGenerateJsonSummary :: Cmd -> [String]
cmdGenerateMdSummary :: Cmd -> [String]
cmdIgnoreGlob :: Cmd -> [String]
cmdWithRefactor :: Cmd -> String
cmdRefactorOptions :: Cmd -> String
cmdRefactor :: Cmd -> Bool
cmdSerialise :: Cmd -> Bool
cmdOnly :: Cmd -> [String]
cmdNoSummary :: Cmd -> Bool
cmdSARIF :: Cmd -> Bool
cmdCC :: Cmd -> Bool
cmdJson :: Cmd -> Bool
cmdCppAnsi :: Cmd -> Bool
cmdCppSimple :: Cmd -> Bool
cmdCppFile :: Cmd -> [String]
cmdCppInclude :: Cmd -> [String]
cmdCppDefine :: Cmd -> [String]
cmdPath :: Cmd -> [String]
cmdDefault :: Cmd -> Bool
cmdDataDir :: Cmd -> String
cmdFindHints :: Cmd -> [String]
cmdCross :: Cmd -> Bool
cmdLanguage :: Cmd -> [String]
cmdExtension :: Cmd -> [String]
cmdIgnoreSuggestions :: Cmd -> Bool
cmdShowAll :: Cmd -> Bool
cmdIgnore :: Cmd -> [String]
cmdThreads :: Cmd -> Int
cmdColor :: Cmd -> ColorMode
cmdGit :: Cmd -> Bool
cmdWithGroups :: Cmd -> [String]
cmdGivenHints :: Cmd -> [String]
cmdReports :: Cmd -> [String]
cmdFiles :: Cmd -> [String]
cmdNoExitCode :: Cmd -> Bool
cmdTiming :: Cmd -> Bool
cmdTest :: Cmd -> Bool
..}
| Bool
cmdDefault = do
[Idea]
ideas <- if forall (t :: * -> *) a. Foldable t => t a -> Bool
null [String]
cmdFiles then forall (f :: * -> *) a. Applicative f => a -> f a
pure [] else forall a. Verbosity -> IO a -> IO a
withVerbosity Verbosity
Quiet forall a b. (a -> b) -> a -> b
$
[String] -> Cmd -> Maybe String -> IO [Idea]
runHlintMain [String]
args Cmd
cmd{cmdJson :: Bool
cmdJson=Bool
False,cmdSerialise :: Bool
cmdSerialise=Bool
False,cmdRefactor :: Bool
cmdRefactor=Bool
False} forall a. Maybe a
Nothing
let bad :: [[String]]
bad = forall a. Eq a => [a] -> [[a]]
group forall a b. (a -> b) -> a -> b
$ forall a. Ord a => [a] -> [a]
sort forall a b. (a -> b) -> a -> b
$ forall a b. (a -> b) -> [a] -> [b]
map Idea -> String
ideaHint [Idea]
ideas
if forall (t :: * -> *) a. Foldable t => t a -> Bool
null [[String]]
bad then String -> IO ()
putStr String
defaultYaml else do
let [String]
group1:[[String]]
groups = forall a. (HasCallStack, Eq a) => [a] -> [a] -> [[a]]
splitOn [String
"",String
""] forall a b. (a -> b) -> a -> b
$ String -> [String]
lines String
defaultYaml
let group2 :: [String]
group2 = String
"# Warnings currently triggered by your code" forall a. a -> [a] -> [a]
:
[String
"- ignore: {name: " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show String
x forall a. [a] -> [a] -> [a]
++ String
"} # "
forall a. [a] -> [a] -> [a]
++ if forall (t :: * -> *) a. Foldable t => t a -> Bool
null [String]
tl then String
"1 hint" else forall a. Show a => a -> String
show (forall (t :: * -> *) a. Foldable t => t a -> Int
length [String]
xs) forall a. [a] -> [a] -> [a]
++ String
" hints"
| xs :: [String]
xs@(String
x : [String]
tl) <- [[String]]
bad
]
String -> IO ()
putStr forall a b. (a -> b) -> a -> b
$ [String] -> String
unlines forall a b. (a -> b) -> a -> b
$ forall a. [a] -> [[a]] -> [a]
intercalate [String
"",String
""] forall a b. (a -> b) -> a -> b
$ [String]
group1forall a. a -> [a] -> [a]
:[String]
group2forall a. a -> [a] -> [a]
:[[String]]
groups
forall (f :: * -> *) a. Applicative f => a -> f a
pure []
| [String]
cmdGenerateMdSummary forall a. Eq a => a -> a -> Bool
/= [] = do
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
t a -> (a -> m b) -> m ()
forM_ [String]
cmdGenerateMdSummary forall a b. (a -> b) -> a -> b
$ \String
file -> forall a. String -> String -> IO a -> IO a
timedIO String
"Summary" String
file forall a b. (a -> b) -> a -> b
$ do
IO () -> IO ()
whenNormal forall a b. (a -> b) -> a -> b
$ String -> IO ()
putStrLn forall a b. (a -> b) -> a -> b
$ String
"Writing Markdown summary to " forall a. [a] -> [a] -> [a]
++ String
file forall a. [a] -> [a] -> [a]
++ String
" ..."
String
summary <- [Setting] -> IO String
generateMdSummary forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (a, b) -> b
snd forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< [String] -> Cmd -> IO (Cmd, [Setting])
readAllSettings [String]
args Cmd
cmd
String -> String -> IO ()
writeFileBinary String
file String
summary
forall (f :: * -> *) a. Applicative f => a -> f a
pure []
| [String]
cmdGenerateJsonSummary forall a. Eq a => a -> a -> Bool
/= [] = do
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
t a -> (a -> m b) -> m ()
forM_ [String]
cmdGenerateJsonSummary forall a b. (a -> b) -> a -> b
$ \String
file -> forall a. String -> String -> IO a -> IO a
timedIO String
"Summary" String
file forall a b. (a -> b) -> a -> b
$ do
IO () -> IO ()
whenNormal forall a b. (a -> b) -> a -> b
$ String -> IO ()
putStrLn forall a b. (a -> b) -> a -> b
$ String
"Writing JSON summary to " forall a. [a] -> [a] -> [a]
++ String
file forall a. [a] -> [a] -> [a]
++ String
" ..."
String
summary <- [Setting] -> IO String
generateJsonSummary forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (a, b) -> b
snd forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< [String] -> Cmd -> IO (Cmd, [Setting])
readAllSettings [String]
args Cmd
cmd
String -> String -> IO ()
writeFileBinary String
file String
summary
forall (f :: * -> *) a. Applicative f => a -> f a
pure []
| [Severity]
cmdGenerateExhaustiveConf forall a. Eq a => a -> a -> Bool
/= [] = do
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
t a -> (a -> m b) -> m ()
forM_ [Severity]
cmdGenerateExhaustiveConf forall a b. (a -> b) -> a -> b
$ \Severity
severity ->
let file :: String
file = forall a. Show a => a -> String
show Severity
severity forall a. [a] -> [a] -> [a]
++ String
"-all.yaml"
in forall a. String -> String -> IO a -> IO a
timedIO String
"Exhaustive config file" String
file forall a b. (a -> b) -> a -> b
$ do
IO () -> IO ()
whenNormal forall a b. (a -> b) -> a -> b
$ String -> IO ()
putStrLn forall a b. (a -> b) -> a -> b
$ String
"Writing " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show Severity
severity forall a. [a] -> [a] -> [a]
++ String
"-all list to " forall a. [a] -> [a] -> [a]
++ String
file forall a. [a] -> [a] -> [a]
++ String
" ..."
String
exhaustiveConfig <- Severity -> [Setting] -> IO String
generateExhaustiveConfig Severity
severity forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (a, b) -> b
snd forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< [String] -> Cmd -> IO (Cmd, [Setting])
readAllSettings [String]
args Cmd
cmd
String -> String -> IO ()
writeFileBinary String
file String
exhaustiveConfig
forall (f :: * -> *) a. Applicative f => a -> f a
pure []
| forall (t :: * -> *) a. Foldable t => t a -> Bool
null [String]
cmdFiles Bool -> Bool -> Bool
&& Bool -> Bool
not (forall (t :: * -> *) a. Foldable t => t a -> Bool
null [String]
cmdFindHints) = do
[String]
hints <- forall (m :: * -> *) a b. Monad m => (a -> m [b]) -> [a] -> m [b]
concatMapM (Cmd -> Maybe String -> String -> IO [String]
resolveFile Cmd
cmd forall a. Maybe a
Nothing) [String]
cmdFindHints
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ (String -> IO ()
putStrLn forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (a, b) -> a
fst forall (m :: * -> *) b c a.
Monad m =>
(b -> m c) -> (a -> m b) -> a -> m c
<=< ParseFlags -> String -> IO (String, [Setting])
computeSettings (Cmd -> ParseFlags
cmdParseFlags Cmd
cmd)) [String]
hints forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> forall (f :: * -> *) a. Applicative f => a -> f a
pure []
| forall (t :: * -> *) a. Foldable t => t a -> Bool
null [String]
cmdFiles =
forall a. IO a
exitWithHelp
| Bool
cmdRefactor =
forall a. (String -> IO a) -> IO a
withTempFile forall a b. (a -> b) -> a -> b
$ [String] -> Cmd -> Maybe String -> IO [Idea]
runHlintMain [String]
args Cmd
cmd forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. a -> Maybe a
Just
| Bool
otherwise =
[String] -> Cmd -> Maybe String -> IO [Idea]
runHlintMain [String]
args Cmd
cmd forall a. Maybe a
Nothing
runHlintMain :: [String] -> Cmd -> Maybe FilePath -> IO [Idea]
runHlintMain :: [String] -> Cmd -> Maybe String -> IO [Idea]
runHlintMain [String]
args Cmd
cmd Maybe String
tmpFile = do
(Cmd
cmd, [Setting]
settings) <- [String] -> Cmd -> IO (Cmd, [Setting])
readAllSettings [String]
args Cmd
cmd
[String] -> [Setting] -> Cmd -> IO [Idea]
runHints [String]
args [Setting]
settings forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Cmd -> Maybe String -> IO Cmd
resolveFiles Cmd
cmd Maybe String
tmpFile
resolveFiles :: Cmd -> Maybe FilePath -> IO Cmd
resolveFiles :: Cmd -> Maybe String -> IO Cmd
resolveFiles cmd :: Cmd
cmd@CmdMain{Bool
Int
String
[String]
[Severity]
ColorMode
cmdTest :: Bool
cmdGenerateExhaustiveConf :: [Severity]
cmdGenerateJsonSummary :: [String]
cmdGenerateMdSummary :: [String]
cmdIgnoreGlob :: [String]
cmdWithRefactor :: String
cmdRefactorOptions :: String
cmdRefactor :: Bool
cmdSerialise :: Bool
cmdTiming :: Bool
cmdNoExitCode :: Bool
cmdOnly :: [String]
cmdNoSummary :: Bool
cmdSARIF :: Bool
cmdCC :: Bool
cmdJson :: Bool
cmdCppAnsi :: Bool
cmdCppSimple :: Bool
cmdCppFile :: [String]
cmdCppInclude :: [String]
cmdCppDefine :: [String]
cmdPath :: [String]
cmdDefault :: Bool
cmdDataDir :: String
cmdFindHints :: [String]
cmdCross :: Bool
cmdLanguage :: [String]
cmdExtension :: [String]
cmdIgnoreSuggestions :: Bool
cmdShowAll :: Bool
cmdIgnore :: [String]
cmdThreads :: Int
cmdColor :: ColorMode
cmdGit :: Bool
cmdWithGroups :: [String]
cmdGivenHints :: [String]
cmdReports :: [String]
cmdFiles :: [String]
cmdGenerateExhaustiveConf :: Cmd -> [Severity]
cmdGenerateJsonSummary :: Cmd -> [String]
cmdGenerateMdSummary :: Cmd -> [String]
cmdIgnoreGlob :: Cmd -> [String]
cmdWithRefactor :: Cmd -> String
cmdRefactorOptions :: Cmd -> String
cmdRefactor :: Cmd -> Bool
cmdSerialise :: Cmd -> Bool
cmdOnly :: Cmd -> [String]
cmdNoSummary :: Cmd -> Bool
cmdSARIF :: Cmd -> Bool
cmdCC :: Cmd -> Bool
cmdJson :: Cmd -> Bool
cmdCppAnsi :: Cmd -> Bool
cmdCppSimple :: Cmd -> Bool
cmdCppFile :: Cmd -> [String]
cmdCppInclude :: Cmd -> [String]
cmdCppDefine :: Cmd -> [String]
cmdPath :: Cmd -> [String]
cmdDefault :: Cmd -> Bool
cmdDataDir :: Cmd -> String
cmdFindHints :: Cmd -> [String]
cmdCross :: Cmd -> Bool
cmdLanguage :: Cmd -> [String]
cmdExtension :: Cmd -> [String]
cmdIgnoreSuggestions :: Cmd -> Bool
cmdShowAll :: Cmd -> Bool
cmdIgnore :: Cmd -> [String]
cmdThreads :: Cmd -> Int
cmdColor :: Cmd -> ColorMode
cmdGit :: Cmd -> Bool
cmdWithGroups :: Cmd -> [String]
cmdGivenHints :: Cmd -> [String]
cmdReports :: Cmd -> [String]
cmdFiles :: Cmd -> [String]
cmdNoExitCode :: Cmd -> Bool
cmdTiming :: Cmd -> Bool
cmdTest :: Cmd -> Bool
..} Maybe String
tmpFile = do
[String]
cmdFiles <- if Bool -> Bool
not forall a b. (a -> b) -> a -> b
$ [String
"lint"] forall a. Eq a => [a] -> [a] -> Bool
`isPrefixOf` [String]
cmdFiles then forall (f :: * -> *) a. Applicative f => a -> f a
pure [String]
cmdFiles else do
Bool
b <- String -> IO Bool
doesDirectoryExist String
"lint"
forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a b. (a -> b) -> a -> b
$ if Bool
b then [String]
cmdFiles else forall a. [a] -> [a]
drop1 [String]
cmdFiles
[String]
files <- forall (m :: * -> *) a b. Monad m => (a -> m [b]) -> [a] -> m [b]
concatMapM (Cmd -> Maybe String -> String -> IO [String]
resolveFile Cmd
cmd Maybe String
tmpFile) [String]
cmdFiles
if forall (t :: * -> *) a. Foldable t => t a -> Bool
null [String]
files
then forall a. HasCallStack => String -> a
error String
"No files found"
else forall (f :: * -> *) a. Applicative f => a -> f a
pure Cmd
cmd { cmdFiles :: [String]
cmdFiles = [String]
files }
readAllSettings :: [String] -> Cmd -> IO (Cmd, [Setting])
readAllSettings :: [String] -> Cmd -> IO (Cmd, [Setting])
readAllSettings [String]
args1 cmd :: Cmd
cmd@CmdMain{Bool
Int
String
[String]
[Severity]
ColorMode
cmdTest :: Bool
cmdGenerateExhaustiveConf :: [Severity]
cmdGenerateJsonSummary :: [String]
cmdGenerateMdSummary :: [String]
cmdIgnoreGlob :: [String]
cmdWithRefactor :: String
cmdRefactorOptions :: String
cmdRefactor :: Bool
cmdSerialise :: Bool
cmdTiming :: Bool
cmdNoExitCode :: Bool
cmdOnly :: [String]
cmdNoSummary :: Bool
cmdSARIF :: Bool
cmdCC :: Bool
cmdJson :: Bool
cmdCppAnsi :: Bool
cmdCppSimple :: Bool
cmdCppFile :: [String]
cmdCppInclude :: [String]
cmdCppDefine :: [String]
cmdPath :: [String]
cmdDefault :: Bool
cmdDataDir :: String
cmdFindHints :: [String]
cmdCross :: Bool
cmdLanguage :: [String]
cmdExtension :: [String]
cmdIgnoreSuggestions :: Bool
cmdShowAll :: Bool
cmdIgnore :: [String]
cmdThreads :: Int
cmdColor :: ColorMode
cmdGit :: Bool
cmdWithGroups :: [String]
cmdGivenHints :: [String]
cmdReports :: [String]
cmdFiles :: [String]
cmdGenerateExhaustiveConf :: Cmd -> [Severity]
cmdGenerateJsonSummary :: Cmd -> [String]
cmdGenerateMdSummary :: Cmd -> [String]
cmdIgnoreGlob :: Cmd -> [String]
cmdWithRefactor :: Cmd -> String
cmdRefactorOptions :: Cmd -> String
cmdRefactor :: Cmd -> Bool
cmdSerialise :: Cmd -> Bool
cmdOnly :: Cmd -> [String]
cmdNoSummary :: Cmd -> Bool
cmdSARIF :: Cmd -> Bool
cmdCC :: Cmd -> Bool
cmdJson :: Cmd -> Bool
cmdCppAnsi :: Cmd -> Bool
cmdCppSimple :: Cmd -> Bool
cmdCppFile :: Cmd -> [String]
cmdCppInclude :: Cmd -> [String]
cmdCppDefine :: Cmd -> [String]
cmdPath :: Cmd -> [String]
cmdDefault :: Cmd -> Bool
cmdDataDir :: Cmd -> String
cmdFindHints :: Cmd -> [String]
cmdCross :: Cmd -> Bool
cmdLanguage :: Cmd -> [String]
cmdExtension :: Cmd -> [String]
cmdIgnoreSuggestions :: Cmd -> Bool
cmdShowAll :: Cmd -> Bool
cmdIgnore :: Cmd -> [String]
cmdThreads :: Cmd -> Int
cmdColor :: Cmd -> ColorMode
cmdGit :: Cmd -> Bool
cmdWithGroups :: Cmd -> [String]
cmdGivenHints :: Cmd -> [String]
cmdReports :: Cmd -> [String]
cmdFiles :: Cmd -> [String]
cmdNoExitCode :: Cmd -> Bool
cmdTiming :: Cmd -> Bool
cmdTest :: Cmd -> Bool
..} = do
[(String, Maybe String)]
files <- Cmd -> IO [(String, Maybe String)]
cmdHintFiles Cmd
cmd
[Setting]
settings1 <-
[(String, Maybe String)] -> IO [Setting]
readFilesConfig forall a b. (a -> b) -> a -> b
$
[(String, Maybe String)]
files
forall a. [a] -> [a] -> [a]
++ [(String
"CommandLine.yaml",forall a. a -> Maybe a
Just (String -> String
enableGroup String
x)) | String
x <- [String]
cmdWithGroups]
let args2 :: [String]
args2 = [String
x | SettingArgument String
x <- [Setting]
settings1]
cmd :: Cmd
cmd@CmdMain{Bool
Int
String
[String]
[Severity]
ColorMode
cmdTest :: Bool
cmdGenerateExhaustiveConf :: [Severity]
cmdGenerateJsonSummary :: [String]
cmdGenerateMdSummary :: [String]
cmdIgnoreGlob :: [String]
cmdWithRefactor :: String
cmdRefactorOptions :: String
cmdRefactor :: Bool
cmdSerialise :: Bool
cmdTiming :: Bool
cmdNoExitCode :: Bool
cmdOnly :: [String]
cmdNoSummary :: Bool
cmdSARIF :: Bool
cmdCC :: Bool
cmdJson :: Bool
cmdCppAnsi :: Bool
cmdCppSimple :: Bool
cmdCppFile :: [String]
cmdCppInclude :: [String]
cmdCppDefine :: [String]
cmdPath :: [String]
cmdDefault :: Bool
cmdDataDir :: String
cmdFindHints :: [String]
cmdCross :: Bool
cmdLanguage :: [String]
cmdExtension :: [String]
cmdIgnoreSuggestions :: Bool
cmdShowAll :: Bool
cmdIgnore :: [String]
cmdThreads :: Int
cmdColor :: ColorMode
cmdGit :: Bool
cmdWithGroups :: [String]
cmdGivenHints :: [String]
cmdReports :: [String]
cmdFiles :: [String]
cmdGenerateExhaustiveConf :: Cmd -> [Severity]
cmdGenerateJsonSummary :: Cmd -> [String]
cmdGenerateMdSummary :: Cmd -> [String]
cmdIgnoreGlob :: Cmd -> [String]
cmdWithRefactor :: Cmd -> String
cmdRefactorOptions :: Cmd -> String
cmdRefactor :: Cmd -> Bool
cmdSerialise :: Cmd -> Bool
cmdOnly :: Cmd -> [String]
cmdNoSummary :: Cmd -> Bool
cmdSARIF :: Cmd -> Bool
cmdCC :: Cmd -> Bool
cmdJson :: Cmd -> Bool
cmdCppAnsi :: Cmd -> Bool
cmdCppSimple :: Cmd -> Bool
cmdCppFile :: Cmd -> [String]
cmdCppInclude :: Cmd -> [String]
cmdCppDefine :: Cmd -> [String]
cmdPath :: Cmd -> [String]
cmdDefault :: Cmd -> Bool
cmdDataDir :: Cmd -> String
cmdFindHints :: Cmd -> [String]
cmdCross :: Cmd -> Bool
cmdLanguage :: Cmd -> [String]
cmdExtension :: Cmd -> [String]
cmdIgnoreSuggestions :: Cmd -> Bool
cmdShowAll :: Cmd -> Bool
cmdIgnore :: Cmd -> [String]
cmdThreads :: Cmd -> Int
cmdColor :: Cmd -> ColorMode
cmdGit :: Cmd -> Bool
cmdWithGroups :: Cmd -> [String]
cmdGivenHints :: Cmd -> [String]
cmdReports :: Cmd -> [String]
cmdFiles :: Cmd -> [String]
cmdNoExitCode :: Cmd -> Bool
cmdTiming :: Cmd -> Bool
cmdTest :: Cmd -> Bool
..} <- if forall (t :: * -> *) a. Foldable t => t a -> Bool
null [String]
args2 then forall (f :: * -> *) a. Applicative f => a -> f a
pure Cmd
cmd else [String] -> IO Cmd
getCmd forall a b. (a -> b) -> a -> b
$ [String]
args2 forall a. [a] -> [a] -> [a]
++ [String]
args1
[Setting]
settings2 <- forall (m :: * -> *) a b. Monad m => (a -> m [b]) -> [a] -> m [b]
concatMapM (forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall a b. (a, b) -> b
snd forall b c a. (b -> c) -> (a -> b) -> a -> c
. ParseFlags -> String -> IO (String, [Setting])
computeSettings (Cmd -> ParseFlags
cmdParseFlags Cmd
cmd)) [String]
cmdFindHints
let settings3 :: [Setting]
settings3 = [Classify -> Setting
SettingClassify forall a b. (a -> b) -> a -> b
$ Severity -> String -> String -> String -> Classify
Classify Severity
Ignore String
x String
"" String
"" | String
x <- [String]
cmdIgnore]
Int
cmdThreads <- if Int
cmdThreads forall a. Eq a => a -> a -> Bool
== Int
0 then IO Int
getNumProcessors else forall (f :: * -> *) a. Applicative f => a -> f a
pure Int
cmdThreads
Cmd
cmd <- forall (f :: * -> *) a. Applicative f => a -> f a
pure CmdMain {Bool
Int
String
[String]
[Severity]
ColorMode
cmdThreads :: Int
cmdTest :: Bool
cmdGenerateExhaustiveConf :: [Severity]
cmdGenerateJsonSummary :: [String]
cmdGenerateMdSummary :: [String]
cmdIgnoreGlob :: [String]
cmdWithRefactor :: String
cmdRefactorOptions :: String
cmdRefactor :: Bool
cmdSerialise :: Bool
cmdTiming :: Bool
cmdNoExitCode :: Bool
cmdOnly :: [String]
cmdNoSummary :: Bool
cmdSARIF :: Bool
cmdCC :: Bool
cmdJson :: Bool
cmdCppAnsi :: Bool
cmdCppSimple :: Bool
cmdCppFile :: [String]
cmdCppInclude :: [String]
cmdCppDefine :: [String]
cmdPath :: [String]
cmdDefault :: Bool
cmdDataDir :: String
cmdFindHints :: [String]
cmdCross :: Bool
cmdLanguage :: [String]
cmdExtension :: [String]
cmdIgnoreSuggestions :: Bool
cmdShowAll :: Bool
cmdIgnore :: [String]
cmdColor :: ColorMode
cmdGit :: Bool
cmdWithGroups :: [String]
cmdGivenHints :: [String]
cmdReports :: [String]
cmdFiles :: [String]
cmdGenerateExhaustiveConf :: [Severity]
cmdGenerateJsonSummary :: [String]
cmdGenerateMdSummary :: [String]
cmdIgnoreGlob :: [String]
cmdWithRefactor :: String
cmdRefactorOptions :: String
cmdRefactor :: Bool
cmdSerialise :: Bool
cmdOnly :: [String]
cmdNoSummary :: Bool
cmdSARIF :: Bool
cmdCC :: Bool
cmdJson :: Bool
cmdCppAnsi :: Bool
cmdCppSimple :: Bool
cmdCppFile :: [String]
cmdCppInclude :: [String]
cmdCppDefine :: [String]
cmdPath :: [String]
cmdDefault :: Bool
cmdDataDir :: String
cmdFindHints :: [String]
cmdCross :: Bool
cmdLanguage :: [String]
cmdExtension :: [String]
cmdIgnoreSuggestions :: Bool
cmdShowAll :: Bool
cmdIgnore :: [String]
cmdThreads :: Int
cmdColor :: ColorMode
cmdGit :: Bool
cmdWithGroups :: [String]
cmdGivenHints :: [String]
cmdReports :: [String]
cmdFiles :: [String]
cmdNoExitCode :: Bool
cmdTiming :: Bool
cmdTest :: Bool
..}
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Cmd
cmd, [Setting]
settings1 forall a. [a] -> [a] -> [a]
++ [Setting]
settings2 forall a. [a] -> [a] -> [a]
++ [Setting]
settings3)
where
enableGroup :: String -> String
enableGroup String
groupName =
[String] -> String
unlines
[String
"- group:"
,String
" name: " forall a. [a] -> [a] -> [a]
++ String
groupName
,String
" enabled: true"
]
runHints :: [String] -> [Setting] -> Cmd -> IO [Idea]
runHints :: [String] -> [Setting] -> Cmd -> IO [Idea]
runHints [String]
args [Setting]
settings cmd :: Cmd
cmd@CmdMain{Bool
Int
String
[String]
[Severity]
ColorMode
cmdTest :: Bool
cmdGenerateExhaustiveConf :: [Severity]
cmdGenerateJsonSummary :: [String]
cmdGenerateMdSummary :: [String]
cmdIgnoreGlob :: [String]
cmdWithRefactor :: String
cmdRefactorOptions :: String
cmdRefactor :: Bool
cmdSerialise :: Bool
cmdTiming :: Bool
cmdNoExitCode :: Bool
cmdOnly :: [String]
cmdNoSummary :: Bool
cmdSARIF :: Bool
cmdCC :: Bool
cmdJson :: Bool
cmdCppAnsi :: Bool
cmdCppSimple :: Bool
cmdCppFile :: [String]
cmdCppInclude :: [String]
cmdCppDefine :: [String]
cmdPath :: [String]
cmdDefault :: Bool
cmdDataDir :: String
cmdFindHints :: [String]
cmdCross :: Bool
cmdLanguage :: [String]
cmdExtension :: [String]
cmdIgnoreSuggestions :: Bool
cmdShowAll :: Bool
cmdIgnore :: [String]
cmdThreads :: Int
cmdColor :: ColorMode
cmdGit :: Bool
cmdWithGroups :: [String]
cmdGivenHints :: [String]
cmdReports :: [String]
cmdFiles :: [String]
cmdGenerateExhaustiveConf :: Cmd -> [Severity]
cmdGenerateJsonSummary :: Cmd -> [String]
cmdGenerateMdSummary :: Cmd -> [String]
cmdIgnoreGlob :: Cmd -> [String]
cmdWithRefactor :: Cmd -> String
cmdRefactorOptions :: Cmd -> String
cmdRefactor :: Cmd -> Bool
cmdSerialise :: Cmd -> Bool
cmdOnly :: Cmd -> [String]
cmdNoSummary :: Cmd -> Bool
cmdSARIF :: Cmd -> Bool
cmdCC :: Cmd -> Bool
cmdJson :: Cmd -> Bool
cmdCppAnsi :: Cmd -> Bool
cmdCppSimple :: Cmd -> Bool
cmdCppFile :: Cmd -> [String]
cmdCppInclude :: Cmd -> [String]
cmdCppDefine :: Cmd -> [String]
cmdPath :: Cmd -> [String]
cmdDefault :: Cmd -> Bool
cmdDataDir :: Cmd -> String
cmdFindHints :: Cmd -> [String]
cmdCross :: Cmd -> Bool
cmdLanguage :: Cmd -> [String]
cmdExtension :: Cmd -> [String]
cmdIgnoreSuggestions :: Cmd -> Bool
cmdShowAll :: Cmd -> Bool
cmdIgnore :: Cmd -> [String]
cmdThreads :: Cmd -> Int
cmdColor :: Cmd -> ColorMode
cmdGit :: Cmd -> Bool
cmdWithGroups :: Cmd -> [String]
cmdGivenHints :: Cmd -> [String]
cmdReports :: Cmd -> [String]
cmdFiles :: Cmd -> [String]
cmdNoExitCode :: Cmd -> Bool
cmdTiming :: Cmd -> Bool
cmdTest :: Cmd -> Bool
..} =
forall a. Int -> IO a -> IO a
withNumCapabilities Int
cmdThreads forall a b. (a -> b) -> a -> b
$ do
let outStrLn :: String -> IO ()
outStrLn = IO () -> IO ()
whenNormal forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> IO ()
putStrLn
[Idea]
ideas <- [Idea] -> [Idea]
filterIdeas forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Cmd -> [Setting] -> IO [Idea]
getIdeas Cmd
cmd [Setting]
settings
if Bool
cmdJson then
String -> IO ()
putStrLn forall a b. (a -> b) -> a -> b
$ [Idea] -> String
showIdeasJson [Idea]
ideas
else if Bool
cmdCC then
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ (Issue -> IO ()
printIssue forall b c a. (b -> c) -> (a -> b) -> a -> c
. Idea -> Issue
fromIdea) [Idea]
ideas
else if Bool
cmdSARIF then
[Idea] -> IO ()
SARIF.printIdeas [Idea]
ideas
else if Bool
cmdSerialise then do
Handle -> BufferMode -> IO ()
hSetBuffering Handle
stdout BufferMode
NoBuffering
forall a. Show a => a -> IO ()
print forall a b. (a -> b) -> a -> b
$ forall a b. (a -> b) -> [a] -> [b]
map (forall a. Show a => a -> String
show forall a b c. (a -> b) -> (a -> c) -> a -> (b, c)
&&& Idea -> [Refactoring SrcSpan]
ideaRefactoring) [Idea]
ideas
else if Bool
cmdRefactor then
[Idea] -> [String] -> Cmd -> IO ()
handleRefactoring [Idea]
ideas [String]
cmdFiles Cmd
cmd
else do
Bool
usecolour <- Cmd -> IO Bool
cmdUseColour Cmd
cmd
let showItem :: Idea -> String
showItem = if Bool
usecolour then Idea -> String
showIdeaANSI else forall a. Show a => a -> String
show
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ (String -> IO ()
outStrLn forall b c a. (b -> c) -> (a -> b) -> a -> c
. Idea -> String
showItem) [Idea]
ideas
[Idea] -> Cmd -> IO ()
handleReporting [Idea]
ideas Cmd
cmd
forall (f :: * -> *) a. Applicative f => a -> f a
pure [Idea]
ideas
where
filteredSeverities :: [Severity]
filteredSeverities
| Bool
cmdShowAll = []
| Bool
cmdIgnoreSuggestions = [Severity
Ignore, Severity
Suggestion]
| Bool
otherwise = [Severity
Ignore]
filterIdeas :: [Idea] -> [Idea]
filterIdeas = forall a. (a -> Bool) -> [a] -> [a]
filter (\Idea
i -> Idea -> Severity
ideaSeverity Idea
i forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`notElem` [Severity]
filteredSeverities)
getIdeas :: Cmd -> [Setting] -> IO [Idea]
getIdeas :: Cmd -> [Setting] -> IO [Idea]
getIdeas cmd :: Cmd
cmd@CmdMain{Bool
Int
String
[String]
[Severity]
ColorMode
cmdTest :: Bool
cmdGenerateExhaustiveConf :: [Severity]
cmdGenerateJsonSummary :: [String]
cmdGenerateMdSummary :: [String]
cmdIgnoreGlob :: [String]
cmdWithRefactor :: String
cmdRefactorOptions :: String
cmdRefactor :: Bool
cmdSerialise :: Bool
cmdTiming :: Bool
cmdNoExitCode :: Bool
cmdOnly :: [String]
cmdNoSummary :: Bool
cmdSARIF :: Bool
cmdCC :: Bool
cmdJson :: Bool
cmdCppAnsi :: Bool
cmdCppSimple :: Bool
cmdCppFile :: [String]
cmdCppInclude :: [String]
cmdCppDefine :: [String]
cmdPath :: [String]
cmdDefault :: Bool
cmdDataDir :: String
cmdFindHints :: [String]
cmdCross :: Bool
cmdLanguage :: [String]
cmdExtension :: [String]
cmdIgnoreSuggestions :: Bool
cmdShowAll :: Bool
cmdIgnore :: [String]
cmdThreads :: Int
cmdColor :: ColorMode
cmdGit :: Bool
cmdWithGroups :: [String]
cmdGivenHints :: [String]
cmdReports :: [String]
cmdFiles :: [String]
cmdGenerateExhaustiveConf :: Cmd -> [Severity]
cmdGenerateJsonSummary :: Cmd -> [String]
cmdGenerateMdSummary :: Cmd -> [String]
cmdIgnoreGlob :: Cmd -> [String]
cmdWithRefactor :: Cmd -> String
cmdRefactorOptions :: Cmd -> String
cmdRefactor :: Cmd -> Bool
cmdSerialise :: Cmd -> Bool
cmdOnly :: Cmd -> [String]
cmdNoSummary :: Cmd -> Bool
cmdSARIF :: Cmd -> Bool
cmdCC :: Cmd -> Bool
cmdJson :: Cmd -> Bool
cmdCppAnsi :: Cmd -> Bool
cmdCppSimple :: Cmd -> Bool
cmdCppFile :: Cmd -> [String]
cmdCppInclude :: Cmd -> [String]
cmdCppDefine :: Cmd -> [String]
cmdPath :: Cmd -> [String]
cmdDefault :: Cmd -> Bool
cmdDataDir :: Cmd -> String
cmdFindHints :: Cmd -> [String]
cmdCross :: Cmd -> Bool
cmdLanguage :: Cmd -> [String]
cmdExtension :: Cmd -> [String]
cmdIgnoreSuggestions :: Cmd -> Bool
cmdShowAll :: Cmd -> Bool
cmdIgnore :: Cmd -> [String]
cmdThreads :: Cmd -> Int
cmdColor :: Cmd -> ColorMode
cmdGit :: Cmd -> Bool
cmdWithGroups :: Cmd -> [String]
cmdGivenHints :: Cmd -> [String]
cmdReports :: Cmd -> [String]
cmdFiles :: Cmd -> [String]
cmdNoExitCode :: Cmd -> Bool
cmdTiming :: Cmd -> Bool
cmdTest :: Cmd -> Bool
..} [Setting]
settings = do
[Setting]
settings <- forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a b. (a -> b) -> a -> b
$ [Setting]
settings forall a. [a] -> [a] -> [a]
++ forall a b. (a -> b) -> [a] -> [b]
map (String -> Setting
Builtin forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (a, b) -> a
fst) [(String, Hint)]
builtinHints
let flags :: ParseFlags
flags = Cmd -> ParseFlags
cmdParseFlags Cmd
cmd
[Idea]
ideas <- if Bool
cmdCross
then ParseFlags -> [Setting] -> [String] -> IO [Idea]
applyHintFiles ParseFlags
flags [Setting]
settings [String]
cmdFiles
else forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall a. Int -> [IO a] -> IO [a]
parallel Int
cmdThreads [forall a. [a] -> IO [a]
evaluateList forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< ParseFlags -> [Setting] -> String -> Maybe String -> IO [Idea]
applyHintFile ParseFlags
flags [Setting]
settings String
x forall a. Maybe a
Nothing | String
x <- [String]
cmdFiles]
forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a b. (a -> b) -> a -> b
$ if Bool -> Bool
not (forall (t :: * -> *) a. Foldable t => t a -> Bool
null [String]
cmdOnly)
then [Idea
i | Idea
i <- [Idea]
ideas, Idea -> String
ideaHint Idea
i forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [String]
cmdOnly]
else [Idea]
ideas
handleRefactoring :: [Idea] -> [String] -> Cmd -> IO ()
handleRefactoring :: [Idea] -> [String] -> Cmd -> IO ()
handleRefactoring [Idea]
ideas [String]
files cmd :: Cmd
cmd@CmdMain{Bool
Int
String
[String]
[Severity]
ColorMode
cmdTest :: Bool
cmdGenerateExhaustiveConf :: [Severity]
cmdGenerateJsonSummary :: [String]
cmdGenerateMdSummary :: [String]
cmdIgnoreGlob :: [String]
cmdWithRefactor :: String
cmdRefactorOptions :: String
cmdRefactor :: Bool
cmdSerialise :: Bool
cmdTiming :: Bool
cmdNoExitCode :: Bool
cmdOnly :: [String]
cmdNoSummary :: Bool
cmdSARIF :: Bool
cmdCC :: Bool
cmdJson :: Bool
cmdCppAnsi :: Bool
cmdCppSimple :: Bool
cmdCppFile :: [String]
cmdCppInclude :: [String]
cmdCppDefine :: [String]
cmdPath :: [String]
cmdDefault :: Bool
cmdDataDir :: String
cmdFindHints :: [String]
cmdCross :: Bool
cmdLanguage :: [String]
cmdExtension :: [String]
cmdIgnoreSuggestions :: Bool
cmdShowAll :: Bool
cmdIgnore :: [String]
cmdThreads :: Int
cmdColor :: ColorMode
cmdGit :: Bool
cmdWithGroups :: [String]
cmdGivenHints :: [String]
cmdReports :: [String]
cmdFiles :: [String]
cmdGenerateExhaustiveConf :: Cmd -> [Severity]
cmdGenerateJsonSummary :: Cmd -> [String]
cmdGenerateMdSummary :: Cmd -> [String]
cmdIgnoreGlob :: Cmd -> [String]
cmdWithRefactor :: Cmd -> String
cmdRefactorOptions :: Cmd -> String
cmdRefactor :: Cmd -> Bool
cmdSerialise :: Cmd -> Bool
cmdOnly :: Cmd -> [String]
cmdNoSummary :: Cmd -> Bool
cmdSARIF :: Cmd -> Bool
cmdCC :: Cmd -> Bool
cmdJson :: Cmd -> Bool
cmdCppAnsi :: Cmd -> Bool
cmdCppSimple :: Cmd -> Bool
cmdCppFile :: Cmd -> [String]
cmdCppInclude :: Cmd -> [String]
cmdCppDefine :: Cmd -> [String]
cmdPath :: Cmd -> [String]
cmdDefault :: Cmd -> Bool
cmdDataDir :: Cmd -> String
cmdFindHints :: Cmd -> [String]
cmdCross :: Cmd -> Bool
cmdLanguage :: Cmd -> [String]
cmdExtension :: Cmd -> [String]
cmdIgnoreSuggestions :: Cmd -> Bool
cmdShowAll :: Cmd -> Bool
cmdIgnore :: Cmd -> [String]
cmdThreads :: Cmd -> Int
cmdColor :: Cmd -> ColorMode
cmdGit :: Cmd -> Bool
cmdWithGroups :: Cmd -> [String]
cmdGivenHints :: Cmd -> [String]
cmdReports :: Cmd -> [String]
cmdFiles :: Cmd -> [String]
cmdNoExitCode :: Cmd -> Bool
cmdTiming :: Cmd -> Bool
cmdTest :: Cmd -> Bool
..} =
case [String]
cmdFiles of
[String
file] -> do
String
path <- Maybe String -> IO String
checkRefactor (if String
cmdWithRefactor forall a. Eq a => a -> a -> Bool
== String
"" then forall a. Maybe a
Nothing else forall a. a -> Maybe a
Just String
cmdWithRefactor)
let hints :: String
hints = forall a. Show a => a -> String
show forall a b. (a -> b) -> a -> b
$ forall a b. (a -> b) -> [a] -> [b]
map (forall a. Show a => a -> String
show forall a b c. (a -> b) -> (a -> c) -> a -> (b, c)
&&& Idea -> [Refactoring SrcSpan]
ideaRefactoring) [Idea]
ideas
forall a. (String -> IO a) -> IO a
withTempFile forall a b. (a -> b) -> a -> b
$ \String
f -> do
String -> String -> IO ()
writeFile String
f String
hints
let ParseFlags{[Extension]
enabledExtensions :: ParseFlags -> [Extension]
enabledExtensions :: [Extension]
enabledExtensions, [Extension]
disabledExtensions :: ParseFlags -> [Extension]
disabledExtensions :: [Extension]
disabledExtensions} = Cmd -> ParseFlags
cmdParseFlags Cmd
cmd
forall a. ExitCode -> IO a
exitWith forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< String
-> String
-> String
-> [Extension]
-> [Extension]
-> String
-> IO ExitCode
runRefactoring String
path String
file String
f [Extension]
enabledExtensions [Extension]
disabledExtensions String
cmdRefactorOptions
[String]
_ -> forall a. HasCallStack => String -> IO a
errorIO String
"Refactor flag can only be used with an individual file"
handleReporting :: [Idea] -> Cmd -> IO ()
handleReporting :: [Idea] -> Cmd -> IO ()
handleReporting [Idea]
showideas cmd :: Cmd
cmd@CmdMain{Bool
Int
String
[String]
[Severity]
ColorMode
cmdTest :: Bool
cmdGenerateExhaustiveConf :: [Severity]
cmdGenerateJsonSummary :: [String]
cmdGenerateMdSummary :: [String]
cmdIgnoreGlob :: [String]
cmdWithRefactor :: String
cmdRefactorOptions :: String
cmdRefactor :: Bool
cmdSerialise :: Bool
cmdTiming :: Bool
cmdNoExitCode :: Bool
cmdOnly :: [String]
cmdNoSummary :: Bool
cmdSARIF :: Bool
cmdCC :: Bool
cmdJson :: Bool
cmdCppAnsi :: Bool
cmdCppSimple :: Bool
cmdCppFile :: [String]
cmdCppInclude :: [String]
cmdCppDefine :: [String]
cmdPath :: [String]
cmdDefault :: Bool
cmdDataDir :: String
cmdFindHints :: [String]
cmdCross :: Bool
cmdLanguage :: [String]
cmdExtension :: [String]
cmdIgnoreSuggestions :: Bool
cmdShowAll :: Bool
cmdIgnore :: [String]
cmdThreads :: Int
cmdColor :: ColorMode
cmdGit :: Bool
cmdWithGroups :: [String]
cmdGivenHints :: [String]
cmdReports :: [String]
cmdFiles :: [String]
cmdGenerateExhaustiveConf :: Cmd -> [Severity]
cmdGenerateJsonSummary :: Cmd -> [String]
cmdGenerateMdSummary :: Cmd -> [String]
cmdIgnoreGlob :: Cmd -> [String]
cmdWithRefactor :: Cmd -> String
cmdRefactorOptions :: Cmd -> String
cmdRefactor :: Cmd -> Bool
cmdSerialise :: Cmd -> Bool
cmdOnly :: Cmd -> [String]
cmdNoSummary :: Cmd -> Bool
cmdSARIF :: Cmd -> Bool
cmdCC :: Cmd -> Bool
cmdJson :: Cmd -> Bool
cmdCppAnsi :: Cmd -> Bool
cmdCppSimple :: Cmd -> Bool
cmdCppFile :: Cmd -> [String]
cmdCppInclude :: Cmd -> [String]
cmdCppDefine :: Cmd -> [String]
cmdPath :: Cmd -> [String]
cmdDefault :: Cmd -> Bool
cmdDataDir :: Cmd -> String
cmdFindHints :: Cmd -> [String]
cmdCross :: Cmd -> Bool
cmdLanguage :: Cmd -> [String]
cmdExtension :: Cmd -> [String]
cmdIgnoreSuggestions :: Cmd -> Bool
cmdShowAll :: Cmd -> Bool
cmdIgnore :: Cmd -> [String]
cmdThreads :: Cmd -> Int
cmdColor :: Cmd -> ColorMode
cmdGit :: Cmd -> Bool
cmdWithGroups :: Cmd -> [String]
cmdGivenHints :: Cmd -> [String]
cmdReports :: Cmd -> [String]
cmdFiles :: Cmd -> [String]
cmdNoExitCode :: Cmd -> Bool
cmdTiming :: Cmd -> Bool
cmdTest :: Cmd -> Bool
..} = do
let outStrLn :: String -> IO ()
outStrLn = IO () -> IO ()
whenNormal forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> IO ()
putStrLn
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
t a -> (a -> m b) -> m ()
forM_ [String]
cmdReports forall a b. (a -> b) -> a -> b
$ \String
x -> do
String -> IO ()
outStrLn forall a b. (a -> b) -> a -> b
$ String
"Writing report to " forall a. [a] -> [a] -> [a]
++ String
x forall a. [a] -> [a] -> [a]
++ String
" ..."
String -> String -> [Idea] -> IO ()
writeReport String
cmdDataDir String
x [Idea]
showideas
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
unless Bool
cmdNoSummary forall a b. (a -> b) -> a -> b
$ do
let (Int
nbErrors, Int
nbHints) = forall (p :: * -> * -> *) a b c d.
Bifunctor p =>
(a -> b) -> (c -> d) -> p a c -> p b d
bimap forall (t :: * -> *) a. Foldable t => t a -> Int
length forall (t :: * -> *) a. Foldable t => t a -> Int
length forall a b. (a -> b) -> a -> b
$ forall a. (a -> Bool) -> [a] -> ([a], [a])
partition (\Idea
idea -> Idea -> Severity
ideaSeverity Idea
idea forall a. Eq a => a -> a -> Bool
== Severity
Error) [Idea]
showideas
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (Int
nbErrors forall a. Ord a => a -> a -> Bool
> Int
0) (String -> IO ()
outStrLn forall a b. (a -> b) -> a -> b
$ Int -> String -> String
formatOutput Int
nbErrors String
"error")
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
unless (Int
nbErrors forall a. Ord a => a -> a -> Bool
> Int
0 Bool -> Bool -> Bool
&& Int
nbHints forall a. Eq a => a -> a -> Bool
== Int
0) (String -> IO ()
outStrLn forall a b. (a -> b) -> a -> b
$ Int -> String -> String
formatOutput Int
nbHints String
"hint")
where
formatOutput :: Int -> String -> String
formatOutput :: Int -> String -> String
formatOutput Int
number String
name =
if Int
number forall a. Eq a => a -> a -> Bool
== Int
0 then String
"No " forall a. [a] -> [a] -> [a]
++ String
name forall a. [a] -> [a] -> [a]
++ String
"s" else forall a. Show a => a -> String
show Int
number forall a. [a] -> [a] -> [a]
++ String
" " forall a. [a] -> [a] -> [a]
++ String
name forall a. [a] -> [a] -> [a]
++ [Char
's' | Int
numberforall a. Eq a => a -> a -> Bool
/=Int
1]
evaluateList :: [a] -> IO [a]
evaluateList :: forall a. [a] -> IO [a]
evaluateList [a]
xs = do
forall a. a -> IO a
evaluate forall a b. (a -> b) -> a -> b
$ forall (t :: * -> *) a. Foldable t => t a -> Int
length [a]
xs
forall (f :: * -> *) a. Applicative f => a -> f a
pure [a]
xs