1
+ {-# LANGUAGE BangPatterns #-}
2
+ {-# LANGUAGE CPP #-}
3
+ {-# LANGUAGE TypeApplications #-}
4
+
1
5
module Ide.Plugin.Tactic.Debug
2
6
( unsafeRender
3
7
, unsafeRender'
@@ -9,17 +13,36 @@ module Ide.Plugin.Tactic.Debug
9
13
, traceMX
10
14
) where
11
15
16
+ import Control.DeepSeq
17
+ import Control.Exception
12
18
import Debug.Trace
13
19
import DynFlags (unsafeGlobalDynFlags )
14
20
import Outputable hiding ((<>) )
21
+ import System.IO.Unsafe (unsafePerformIO )
22
+
23
+ #if __GLASGOW_HASKELL__ >= 808
24
+ import PlainPanic (PlainGhcException )
25
+ type GHC_EXCEPTION = PlainGhcException
26
+ #else
27
+ import Panic (GhcException )
28
+ type GHC_EXCEPTION = GhcException
29
+ #endif
30
+
15
31
16
32
------------------------------------------------------------------------------
17
33
-- | Print something
18
34
unsafeRender :: Outputable a => a -> String
19
35
unsafeRender = unsafeRender' . ppr
20
36
37
+
21
38
unsafeRender' :: SDoc -> String
22
- unsafeRender' = showSDoc unsafeGlobalDynFlags
39
+ unsafeRender' sdoc = unsafePerformIO $ do
40
+ let z = showSDoc unsafeGlobalDynFlags sdoc
41
+ -- We might not have unsafeGlobalDynFlags (like during testing), in which
42
+ -- case GHC panics. Instead of crashing, let's just fail to print.
43
+ ! res <- try @ GHC_EXCEPTION $ evaluate $ deepseq z z
44
+ pure $ either (const " <unsafeRender'>" ) id res
45
+ {-# NOINLINE unsafeRender' #-}
23
46
24
47
traceMX :: (Monad m , Show a ) => String -> a -> m ()
25
48
traceMX str a = traceM $ mappend (" !!!" <> str <> " : " ) $ show a
0 commit comments