module Language.Haskell.GhcMod.DebugLogger where import GHC import FastString import Pretty import Outputable (SDoc, PprStyle, runSDoc, initSDocContext, blankLine) import qualified Outputable import ErrUtils import DynFlags (LogAction) import Language.Haskell.GhcMod.Error import Prelude debugLogAction :: (String -> IO ()) -> LogAction debugLogAction putErr dflags severity srcSpan style msg = case severity of SevOutput -> printSDoc msg style SevDump -> printSDoc (msg Outputable.$$ blankLine) style SevInteractive -> putStrSDoc msg style SevInfo -> printErrs msg style SevFatal -> printErrs msg style _ -> do putErr "\n" printErrs (mkLocMessage severity srcSpan msg) style -- careful (#2302): printErrs prints in UTF-8, -- whereas converting to string first and using -- hPutStr would just emit the low 8 bits of -- each unicode char. where printSDoc = debugLogActionHPrintDoc dflags putErr printErrs = debugLogActionHPrintDoc dflags putErr putStrSDoc = debugLogActionHPutStrDoc dflags putErr debugLogActionHPrintDoc :: DynFlags -> (String -> IO ()) -> SDoc -> PprStyle -> IO () debugLogActionHPrintDoc dflags put d sty = debugLogActionHPutStrDoc dflags put (d Outputable.$$ Outputable.text "") sty -- Adds a newline debugLogActionHPutStrDoc :: DynFlags -> (String -> IO ()) -> SDoc -> PprStyle -> IO () debugLogActionHPutStrDoc dflags put d sty = gmPrintDoc_ Pretty.PageMode (pprCols dflags) put doc where -- Don't add a newline at the end, so that successive -- calls to this log-action can output all on the same line doc = runSDoc d (initSDocContext dflags sty) gmPrintDoc :: Mode -> Int -> (String -> IO ()) -> Doc -> IO () -- printDoc adds a newline to the end gmPrintDoc mode cols put doc = gmPrintDoc_ mode cols put (doc $$ text "") gmPrintDoc_ :: Mode -> Int -> (String -> IO ()) -> Doc -> IO () gmPrintDoc_ mode pprCols putS doc = fullRender mode pprCols 1.5 put done doc where put (Chr c) next = putS [c] >> next put (Str s) next = putS s >> next put (PStr s) next = putS (unpackFS s) >> next put (ZStr s) next = putS (zString s) >> next put (LStr s _l) next = putS (unpackLitString s) >> next done = return () -- hPutChar hdl '\n'