module DebuggerUtils where
import Outputable (Outputable)
import qualified Outputable
import DebuggerMonad
import GHC hiding (resume)
import DynFlags
import GhcMonad (liftIO)
import qualified FastString
import Text.JSON
import qualified Data.Ratio
import Name
import Control.Exception (SomeException)
-- | Remove casting to SomeException
catch :: DebuggerMonad a -> (SomeException -> DebuggerMonad a) -> DebuggerMonad a
catch = gcatch
compareNames :: Name -> Name -> Ordering
n1 `compareNames` n2 = compareWith n1 `compare` compareWith n2
where compareWith n = (getOccString n, getSrcSpan n)
-- | Prints SDoc to the debug stream
printSDoc :: Outputable.SDoc -> DebuggerMonad ()
printSDoc message = do
st <- getDebugState
dflags <- getDynFlags
unqual <- getPrintUnqual
liftIO $ Outputable.printForUser dflags (debugOutput st) unqual message
return ()
showSDoc :: Outputable.SDoc -> DebuggerMonad String
showSDoc message = do
dflags <- getDynFlags
unqual <- getPrintUnqual
return $ Outputable.showSDocForUser dflags unqual message
showOutputable :: (Outputable d) => d -> DebuggerMonad String
showOutputable str = do
showSDoc $ Outputable.ppr str
-- | Prints Outputable to the debug stream
printOutputable :: (Outputable d) => d -> DebuggerMonad ()
printOutputable = printSDoc . Outputable.ppr
printListOfOutputable :: (Outputable d) => [d] -> DebuggerMonad ()
printListOfOutputable = mapM_ printOutputable
-- | Prints String to the debug stream
printString :: String -> DebuggerMonad ()
printString = printSDoc . Outputable.text
printJSON :: [(String, T)] -> DebuggerMonad ()
printJSON = printString . getJSONLine
data T
= ConsNull
| ConsBool Bool
| ConsInt Int
| ConsStr String
| ConsArr [T]
| ConsObj [(String, T)]
instance JSON T where
readJSON _ = Error "Not implemented" -- function is not needed
showJSON (ConsNull) = JSNull
showJSON (ConsBool x) = JSBool x
showJSON (ConsInt x) = JSRational False ((toInteger x) Data.Ratio.% 1)
showJSON (ConsStr x) = JSString $ toJSString x
showJSON (ConsArr x) = JSArray $ map showJSON x
showJSON (ConsObj x) = JSObject $ toJSObject $ map (\(key, value) -> (key, showJSON value)) x
getJSONLine :: [(String, T)] -> String
getJSONLine = encode . toJSObject
-- | Used methods are marked as 'unsafe'
srcSpanAsJSON :: SrcSpan -> T
srcSpanAsJSON (UnhelpfulSpan str) = ConsObj [("span", ConsStr $ FastString.unpackFS str)]
srcSpanAsJSON (RealSrcSpan span') = ConsObj [
("file", ConsStr $ FastString.unpackFS $ srcSpanFile span'),
("startline", ConsInt $ srcSpanStartLine span'),
("endline", ConsInt $ srcSpanEndLine span'),
("startcol", ConsInt $ srcSpanStartCol span'),
("endcol", ConsInt $ srcSpanEndCol span' - 1)
]