{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE RankNTypes #-}
module Distribution.Simple.Program.Hpc
  ( markup
  , union
  ) where
import Distribution.Compat.Prelude
import Prelude ()
import Distribution.ModuleName
import Distribution.Pretty
import Distribution.Simple.Program.Run
import Distribution.Simple.Program.Types
import Distribution.Simple.Utils
import Distribution.Utils.Path
import Distribution.Verbosity
import Distribution.Version
markup
  :: Maybe (SymbolicPath CWD (Dir Pkg))
  -> ConfiguredProgram
  -> Version
  -> Verbosity
  -> SymbolicPath Pkg File
  
  -> [SymbolicPath Pkg (Dir Mix)]
  
  -> SymbolicPath Pkg (Dir Artifacts)
  
  -> [ModuleName]
  
  -> IO ()
markup :: Maybe (SymbolicPath CWD ('Dir Pkg))
-> ConfiguredProgram
-> Version
-> Verbosity
-> SymbolicPath Pkg 'File
-> [SymbolicPath Pkg ('Dir Mix)]
-> SymbolicPath Pkg ('Dir Artifacts)
-> [ModuleName]
-> IO ()
markup Maybe (SymbolicPath CWD ('Dir Pkg))
mbWorkDir ConfiguredProgram
hpc Version
hpcVer Verbosity
verbosity SymbolicPath Pkg 'File
tixFile [SymbolicPath Pkg ('Dir Mix)]
hpcDirs SymbolicPath Pkg ('Dir Artifacts)
destDir [ModuleName]
included = do
  [SymbolicPath Pkg ('Dir Mix)]
hpcDirs' <-
    if Version -> VersionRange -> Bool
withinRange Version
hpcVer (Version -> VersionRange
orLaterVersion Version
version07)
      then [SymbolicPath Pkg ('Dir Mix)] -> IO [SymbolicPath Pkg ('Dir Mix)]
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return [SymbolicPath Pkg ('Dir Mix)]
hpcDirs
      else do
        Verbosity -> String -> IO ()
warn Verbosity
verbosity (String -> IO ()) -> String -> IO ()
forall a b. (a -> b) -> a -> b
$
          String
"Your version of HPC ("
            String -> String -> String
forall a. [a] -> [a] -> [a]
++ Version -> String
forall a. Pretty a => a -> String
prettyShow Version
hpcVer
            String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
") does not properly handle multiple search paths. "
            String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"Coverage report generation may fail unexpectedly. These "
            String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"issues are addressed in version 0.7 or later (GHC 7.8 or "
            String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"later)."
            String -> String -> String
forall a. [a] -> [a] -> [a]
++ if [SymbolicPath Pkg ('Dir Mix)] -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [SymbolicPath Pkg ('Dir Mix)]
droppedDirs
              then String
""
              else
                String
" The following search paths have been abandoned: "
                  String -> String -> String
forall a. [a] -> [a] -> [a]
++ [SymbolicPath Pkg ('Dir Mix)] -> String
forall a. Show a => a -> String
show [SymbolicPath Pkg ('Dir Mix)]
droppedDirs
        [SymbolicPath Pkg ('Dir Mix)] -> IO [SymbolicPath Pkg ('Dir Mix)]
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return [SymbolicPath Pkg ('Dir Mix)]
passedDirs
  
  [SymbolicPath Pkg ('Dir Mix)]
hpcDirs'' <- (SymbolicPath Pkg ('Dir Mix) -> IO (SymbolicPath Pkg ('Dir Mix)))
-> [SymbolicPath Pkg ('Dir Mix)]
-> IO [SymbolicPath Pkg ('Dir Mix)]
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> [a] -> f [b]
traverse (Maybe (SymbolicPath CWD ('Dir Pkg))
-> SymbolicPath Pkg ('Dir Mix) -> IO (SymbolicPath Pkg ('Dir Mix))
forall dir (to :: FileOrDir).
Maybe (SymbolicPath CWD ('Dir dir))
-> SymbolicPath dir to -> IO (SymbolicPath dir to)
tryMakeRelative Maybe (SymbolicPath CWD ('Dir Pkg))
mbWorkDir) [SymbolicPath Pkg ('Dir Mix)]
hpcDirs'
  Verbosity -> ProgramInvocation -> IO ()
runProgramInvocation
    Verbosity
verbosity
    (Maybe (SymbolicPath CWD ('Dir Pkg))
-> ConfiguredProgram
-> SymbolicPath Pkg 'File
-> [SymbolicPath Pkg ('Dir Mix)]
-> SymbolicPath Pkg ('Dir Artifacts)
-> [ModuleName]
-> ProgramInvocation
markupInvocation Maybe (SymbolicPath CWD ('Dir Pkg))
mbWorkDir ConfiguredProgram
hpc SymbolicPath Pkg 'File
tixFile [SymbolicPath Pkg ('Dir Mix)]
hpcDirs'' SymbolicPath Pkg ('Dir Artifacts)
destDir [ModuleName]
included)
  where
    version07 :: Version
version07 = [Int] -> Version
mkVersion [Int
0, Int
7]
    ([SymbolicPath Pkg ('Dir Mix)]
passedDirs, [SymbolicPath Pkg ('Dir Mix)]
droppedDirs) = Int
-> [SymbolicPath Pkg ('Dir Mix)]
-> ([SymbolicPath Pkg ('Dir Mix)], [SymbolicPath Pkg ('Dir Mix)])
forall a. Int -> [a] -> ([a], [a])
splitAt Int
1 [SymbolicPath Pkg ('Dir Mix)]
hpcDirs
markupInvocation
  :: Maybe (SymbolicPath CWD (Dir Pkg))
  -> ConfiguredProgram
  -> SymbolicPath Pkg File
  
  -> [SymbolicPath Pkg (Dir Mix)]
  
  -> SymbolicPath Pkg (Dir Artifacts)
  
  
  -> [ModuleName]
  
  -> ProgramInvocation
markupInvocation :: Maybe (SymbolicPath CWD ('Dir Pkg))
-> ConfiguredProgram
-> SymbolicPath Pkg 'File
-> [SymbolicPath Pkg ('Dir Mix)]
-> SymbolicPath Pkg ('Dir Artifacts)
-> [ModuleName]
-> ProgramInvocation
markupInvocation Maybe (SymbolicPath CWD ('Dir Pkg))
mbWorkDir ConfiguredProgram
hpc SymbolicPath Pkg 'File
tixFile [SymbolicPath Pkg ('Dir Mix)]
hpcDirs SymbolicPath Pkg ('Dir Artifacts)
destDir [ModuleName]
included =
  let args :: [String]
args =
        [ String
"markup"
        , SymbolicPath Pkg 'File -> String
forall (allowAbsolute :: AllowAbsolute) from (to :: FileOrDir).
SymbolicPathX allowAbsolute from to -> String
getSymbolicPath SymbolicPath Pkg 'File
tixFile
        , String
"--destdir=" String -> String -> String
forall a. [a] -> [a] -> [a]
++ SymbolicPath Pkg ('Dir Artifacts) -> String
forall (allowAbsolute :: AllowAbsolute) from (to :: FileOrDir).
SymbolicPathX allowAbsolute from to -> String
getSymbolicPath SymbolicPath Pkg ('Dir Artifacts)
destDir
        ]
          [String] -> [String] -> [String]
forall a. [a] -> [a] -> [a]
++ (SymbolicPath Pkg ('Dir Mix) -> String)
-> [SymbolicPath Pkg ('Dir Mix)] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map ((String
"--hpcdir=" String -> String -> String
forall a. [a] -> [a] -> [a]
++) (String -> String)
-> (SymbolicPath Pkg ('Dir Mix) -> String)
-> SymbolicPath Pkg ('Dir Mix)
-> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. SymbolicPath Pkg ('Dir Mix) -> String
forall (allowAbsolute :: AllowAbsolute) from (to :: FileOrDir).
SymbolicPathX allowAbsolute from to -> String
getSymbolicPath) [SymbolicPath Pkg ('Dir Mix)]
hpcDirs
          [String] -> [String] -> [String]
forall a. [a] -> [a] -> [a]
++ [ String
"--include=" String -> String -> String
forall a. [a] -> [a] -> [a]
++ ModuleName -> String
forall a. Pretty a => a -> String
prettyShow ModuleName
moduleName
             | ModuleName
moduleName <- [ModuleName]
included
             ]
   in Maybe (SymbolicPath CWD ('Dir Pkg))
-> ConfiguredProgram -> [String] -> ProgramInvocation
forall to.
Maybe (SymbolicPath CWD ('Dir to))
-> ConfiguredProgram -> [String] -> ProgramInvocation
programInvocationCwd Maybe (SymbolicPath CWD ('Dir Pkg))
mbWorkDir ConfiguredProgram
hpc [String]
args
union
  :: Maybe (SymbolicPath CWD (Dir Pkg))
  -> ConfiguredProgram
  -> Verbosity
  -> [SymbolicPath Pkg File]
  
  -> SymbolicPath Pkg File
  
  -> [ModuleName]
  
  -> IO ()
union :: Maybe (SymbolicPath CWD ('Dir Pkg))
-> ConfiguredProgram
-> Verbosity
-> [SymbolicPath Pkg 'File]
-> SymbolicPath Pkg 'File
-> [ModuleName]
-> IO ()
union Maybe (SymbolicPath CWD ('Dir Pkg))
mbWorkDir ConfiguredProgram
hpc Verbosity
verbosity [SymbolicPath Pkg 'File]
tixFiles SymbolicPath Pkg 'File
outFile [ModuleName]
excluded =
  Verbosity -> ProgramInvocation -> IO ()
runProgramInvocation
    Verbosity
verbosity
    (Maybe (SymbolicPath CWD ('Dir Pkg))
-> ConfiguredProgram
-> [SymbolicPath Pkg 'File]
-> SymbolicPath Pkg 'File
-> [ModuleName]
-> ProgramInvocation
unionInvocation Maybe (SymbolicPath CWD ('Dir Pkg))
mbWorkDir ConfiguredProgram
hpc [SymbolicPath Pkg 'File]
tixFiles SymbolicPath Pkg 'File
outFile [ModuleName]
excluded)
unionInvocation
  :: Maybe (SymbolicPath CWD (Dir Pkg))
  -> ConfiguredProgram
  -> [SymbolicPath Pkg File]
  
  -> SymbolicPath Pkg File
  
  -> [ModuleName]
  
  -> ProgramInvocation
unionInvocation :: Maybe (SymbolicPath CWD ('Dir Pkg))
-> ConfiguredProgram
-> [SymbolicPath Pkg 'File]
-> SymbolicPath Pkg 'File
-> [ModuleName]
-> ProgramInvocation
unionInvocation Maybe (SymbolicPath CWD ('Dir Pkg))
mbWorkDir ConfiguredProgram
hpc [SymbolicPath Pkg 'File]
tixFiles SymbolicPath Pkg 'File
outFile [ModuleName]
excluded =
  Maybe (SymbolicPath CWD ('Dir Pkg))
-> ConfiguredProgram -> [String] -> ProgramInvocation
forall to.
Maybe (SymbolicPath CWD ('Dir to))
-> ConfiguredProgram -> [String] -> ProgramInvocation
programInvocationCwd Maybe (SymbolicPath CWD ('Dir Pkg))
mbWorkDir ConfiguredProgram
hpc ([String] -> ProgramInvocation) -> [String] -> ProgramInvocation
forall a b. (a -> b) -> a -> b
$
    [[String]] -> [String]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat
      [ [String
"sum", String
"--union"]
      , (SymbolicPath Pkg 'File -> String)
-> [SymbolicPath Pkg 'File] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map SymbolicPath Pkg 'File -> String
forall (allowAbsolute :: AllowAbsolute) from (to :: FileOrDir).
SymbolicPathX allowAbsolute from to -> String
getSymbolicPath [SymbolicPath Pkg 'File]
tixFiles
      , [String
"--output=" String -> String -> String
forall a. [a] -> [a] -> [a]
++ SymbolicPath Pkg 'File -> String
forall (allowAbsolute :: AllowAbsolute) from (to :: FileOrDir).
SymbolicPathX allowAbsolute from to -> String
getSymbolicPath SymbolicPath Pkg 'File
outFile]
      , [ String
"--exclude=" String -> String -> String
forall a. [a] -> [a] -> [a]
++ ModuleName -> String
forall a. Pretty a => a -> String
prettyShow ModuleName
moduleName
        | ModuleName
moduleName <- [ModuleName]
excluded
        ]
      ]