module Language.Haskell.HGrep.Print (
printSearchResult
, printSearchResultLocation
) where
import qualified Data.List as L
import qualified Language.Haskell.GHC.ExactPrint as EP
import qualified Language.Haskell.HsColour as HsColour
import qualified Language.Haskell.HsColour.Colourise as HsColour
import Language.Haskell.HGrep.Internal.Data
import Language.Haskell.HGrep.Prelude
import qualified System.Console.ANSI as ANSI
import qualified Outputable
import qualified SrcLoc
printSearchResult :: PrintOpts -> SearchResult -> [Char]
printSearchResult (PrintOpts co) (SearchResult anns ast) =
let src = EP.exactPrint ast anns in
case co of
DefaultColours ->
hscolour src
NoColours ->
src
printSearchResultLocation :: PrintOpts -> SearchResult -> [Char]
printSearchResultLocation (PrintOpts co) (SearchResult _anns ast) =
let loc = chomp (unsafePpr (SrcLoc.getLoc ast)) in
case co of
DefaultColours ->
ansiLocationFormat <> loc <> ansiReset
NoColours ->
loc
ansiLocationFormat :: [Char]
ansiLocationFormat =
ANSI.setSGRCode [
ANSI.SetColor ANSI.Foreground ANSI.Vivid ANSI.Green
, ANSI.SetUnderlining ANSI.SingleUnderline
]
ansiReset :: [Char]
ansiReset =
ANSI.setSGRCode []
hscolour :: [Char] -> [Char]
hscolour =
HsColour.hscolour HsColour.TTY HsColour.defaultColourPrefs False False "" False
unsafePpr :: Outputable.Outputable o => o -> [Char]
unsafePpr =
Outputable.showSDocUnsafe . Outputable.ppr
chomp :: [Char] -> [Char]
chomp =
L.unlines . L.lines