{-# LANGUAGE ImplicitParams, KindSignatures, ConstraintKinds #-} -- | A compatibility layer for `CallStack`, so that we can have -- uniform signatures even in old GHC versions (even if the -- functionality itself does not work there). module Data.GI.Base.CallStack ( HasCallStack , CallStack , prettyCallStack , callStack ) where #if MIN_VERSION_base(4,9,0) import GHC.Stack (HasCallStack, prettyCallStack, callStack, CallStack) #elif MIN_VERSION_base(4,8,1) import Data.List (intercalate) import qualified GHC.Stack as S import GHC.SrcLoc (SrcLoc(..)) import GHC.Exts (Constraint) type HasCallStack = ((?callStack :: S.CallStack) :: Constraint) type CallStack = [(String, SrcLoc)] #else import GHC.Exts (Constraint) type HasCallStack = (() :: Constraint) type CallStack = () #endif #if !MIN_VERSION_base(4,9,0) -- | Return the current `CallStack`. callStack :: HasCallStack => CallStack #if MIN_VERSION_base(4,8,1) callStack = drop 1 (S.getCallStack ?callStack) #else callStack = () #endif #endif #if !MIN_VERSION_base(4,9,0) prettyCallStack :: CallStack -> String #if MIN_VERSION_base(4,8,1) -- | Give a text representation of the current `CallStack`. prettyCallStack = intercalate "\n" . prettyCallStackLines where prettySrcLoc :: SrcLoc -> String prettySrcLoc l = foldr (++) "" [ srcLocFile l, ":" , show (srcLocStartLine l), ":" , show (srcLocStartCol l), " in " , srcLocPackage l, ":", srcLocModule l ] prettyCallStackLines :: CallStack -> [String] prettyCallStackLines cs = case cs of [] -> [] stk -> "CallStack (from HasCallStack):" : map ((" " ++) . prettyCallSite) stk prettyCallSite (f, loc) = f ++ ", called at " ++ prettySrcLoc loc #else prettyCallStack _ = "= 7.10.2>" #endif #endif