{-# LANGUAGE CPP #-}
module Output
  ( printResults
  ) where

import           System.IO (stdout)

import           DefCounts.Output
import           GHC.Api
#if MIN_VERSION_ghc(9,2,0)
  (DynFlags, initSDocContext)
#else
  (DynFlags)
#endif
import           GHC.Output
import           HieFile (Counters)
import           MatchSigs.Output
import           UseCounts.Output

printResults :: DynFlags
             -> Counters
             -> IO ()
printResults :: DynFlags -> Counters -> IO ()
printResults DynFlags
dynFlags (DefCounter
defCounter, UsageCounter
usageCounter, SigMap
sigDupeMap, Sum Int
totalLines) = do
  let output :: SDoc
output = [SDoc] -> SDoc
vcat
        [ SDoc
separator
        , String -> SDoc
text String
""
        , SDoc -> SDoc
keyword forall a b. (a -> b) -> a -> b
$ String -> SDoc
text String
"Duplicate Type Signatures"
        , String -> SDoc
text String
""
        , SigMap -> SDoc
sigDuplicateOutput SigMap
sigDupeMap
        , String -> SDoc
text String
""
        , SDoc
separator
        , String -> SDoc
text String
""
        , SDoc -> SDoc
keyword forall a b. (a -> b) -> a -> b
$ String -> SDoc
text String
"Usage Totals"
        , String -> SDoc
text String
""
        , UsageCounter -> SDoc
usageOutput UsageCounter
usageCounter
        , String -> SDoc
text String
""
        , SDoc
separator
        , String -> SDoc
text String
""
        , SDoc -> SDoc
keyword forall a b. (a -> b) -> a -> b
$ String -> SDoc
text String
"Definition Counts"
        , String -> SDoc
text String
""
        , DefCounter -> Sum Int -> SDoc
defCountOutput DefCounter
defCounter Sum Int
totalLines
        , String -> SDoc
text String
""
        , SDoc
separator
        ]
      separator :: SDoc
separator = PprColour -> SDoc -> SDoc
coloured PprColour
colGreenFg forall a b. (a -> b) -> a -> b
$ String -> SDoc
text String
"********************************************************************************"

  DynFlags -> SDoc -> IO ()
outputSDoc DynFlags
dynFlags SDoc
output

outputSDoc :: DynFlags -> SDoc -> IO ()
outputSDoc :: DynFlags -> SDoc -> IO ()
outputSDoc DynFlags
dynFlags SDoc
sDoc = do
#if MIN_VERSION_ghc(9,2,0)
  let pprStyle :: PprStyle
pprStyle = Bool -> PprStyle -> PprStyle
setStyleColoured Bool
True PprStyle
defaultUserStyle
      sDocCtx :: SDocContext
sDocCtx = DynFlags -> PprStyle -> SDocContext
initSDocContext DynFlags
dynFlags PprStyle
pprStyle
  SDocContext -> Mode -> Handle -> SDoc -> IO ()
printSDocLn SDocContext
sDocCtx (Bool -> Mode
PageMode Bool
True) Handle
stdout SDoc
sDoc
#elif MIN_VERSION_ghc(9,0,0)
  let pprStyle = setStyleColoured True defaultUserStyle
      sDocCtx = initSDocContext dynFlags pprStyle
  printSDocLn sDocCtx PageMode stdout sDoc
#else
  let pprStyle = setStyleColoured True $ defaultUserStyle dynFlags
  printSDocLn PageMode dynFlags stdout pprStyle sDoc
#endif