Add pprSTrace for debugging with call stacks
authorBartosz Nitka <bnitka@fb.com>
Sat, 7 Nov 2015 23:21:11 +0000 (00:21 +0100)
committerBen Gamari <ben@smart-cactus.org>
Sat, 7 Nov 2015 23:54:05 +0000 (00:54 +0100)
I've spent quite a bit of time giving unique labels to my `pprTrace`
calls and then trying to intuit where the function is called from.
Thanks to the new implicit parameter CallStack functionality I don't
have to do that anymore.

Test Plan: harbormaster

Reviewers: austin, simonmar, bgamari

Reviewed By: simonmar, bgamari

Subscribers: thomie

Differential Revision: https://phabricator.haskell.org/D1440

compiler/utils/Outputable.hs

index 23fa37d..c74f738 100644 (file)
@@ -1,3 +1,4 @@
+{-# LANGUAGE CPP, ImplicitParams #-}
 {-
 (c) The University of Glasgow 2006-2012
 (c) The GRASP Project, Glasgow University, 1992-1998
@@ -73,7 +74,7 @@ module Outputable (
 
         -- * Error handling and debugging utilities
         pprPanic, pprSorry, assertPprPanic, pprPgmError,
-        pprTrace, warnPprTrace,
+        pprTrace, warnPprTrace, pprSTrace,
         trace, pgmError, panic, sorry, assertPanic,
         pprDebugAndThen,
     ) where
@@ -109,6 +110,8 @@ import Data.Graph (SCC(..))
 
 import GHC.Fingerprint
 import GHC.Show         ( showMultiLineString )
+import GHC.Stack
+import GHC.Exception
 
 {-
 ************************************************************************
@@ -1030,6 +1033,17 @@ pprTrace str doc x
    | opt_NoDebugOutput = x
    | otherwise         = pprDebugAndThen unsafeGlobalDynFlags trace (text str) doc x
 
+
+-- | If debug output is on, show some 'SDoc' on the screen along
+-- with a call stack when available.
+#if __GLASGOW_HASKELL__ >= 710
+pprSTrace :: (?location :: CallStack) => SDoc -> a -> a
+pprSTrace = pprTrace (showCallStack ?location)
+#else
+pprSTrace :: SDoc -> a -> a
+pprSTrace = pprTrace "no callstack info"
+#endif
+
 warnPprTrace :: Bool -> String -> Int -> SDoc -> a -> a
 -- ^ Just warn about an assertion failure, recording the given file and line number.
 -- Should typically be accessed with the WARN macros