{-# LANGUAGE CPP #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TemplateHaskell #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}
{-|
Module: TextShow.Compiler.Hoopl
Copyright: (C) 2014-2017 Ryan Scott
License: BSD-style (see the file LICENSE)
Maintainer: Ryan Scott
Stability: Provisional
Portability: GHC
'TextShow' instances for data types in the @hoopl@ library.
/Since: 2/
-}
module TextShow.Compiler.Hoopl () where
import Compiler.Hoopl (Label, LabelMap, LabelSet, Pointed(..),
UniqueMap, UniqueSet)
#if MIN_VERSION_hoopl(3,9,0)
import Compiler.Hoopl.Internals (lblToUnique)
#else
import Compiler.Hoopl (Unique)
import Compiler.Hoopl.GHC (lblToUnique, uniqueToInt)
#endif
import Compiler.Hoopl.Passes.Dominator (DominatorNode(..), DominatorTree(..), DPath(..))
import Data.Monoid.Compat
import TextShow (TextShow(..), TextShow1(..),
TextShow2(..), Builder, singleton, showbPrec1)
import TextShow.Data.Containers ()
import TextShow.TH (deriveTextShow, deriveTextShow1)
-- | /Since: 2/
instance TextShow Label where
showb l = singleton 'L' <> showb (lblToUnique l)
{-# INLINE showb #-}
-- | /Since: 2/
$(deriveTextShow ''LabelMap)
-- | /Since: 2/
$(deriveTextShow1 ''LabelMap)
-- | /Since: 2/
$(deriveTextShow ''LabelSet)
-- | /Since: 2/
instance TextShow a => TextShow (Pointed t b a) where
showbPrec = showbPrec1
{-# INLINE showbPrec #-}
-- | /Since: 2/
instance TextShow1 (Pointed t b) where
liftShowbPrec _ _ _ Bot = "_|_"
liftShowbPrec _ _ _ Top = singleton 'T'
liftShowbPrec sp _ _ (PElem a) = sp 0 a
{-# INLINE liftShowbPrec #-}
-- | /Since: 2/
instance TextShow2 (Pointed t) where
liftShowbPrec2 _ _ = liftShowbPrec
{-# INLINE liftShowbPrec2 #-}
#if !(MIN_VERSION_hoopl(3,9,0))
-- | /Since: 2/
instance TextShow Unique where
showb = showb . uniqueToInt
{-# INLINE showb #-}
#endif
-- | /Since: 2/
$(deriveTextShow ''UniqueMap)
-- | /Since: 2/
$(deriveTextShow1 ''UniqueMap)
-- | /Since: 2/
$(deriveTextShow ''UniqueSet)
-- | /Since: 2/
instance TextShow DominatorNode where
showb Entry = "entryNode"
showb (Labelled l) = showb l
{-# INLINE showb #-}
-- | /Since: 2/
instance TextShow DominatorTree where
showb t = mconcat $ "digraph {\n" : dot t ["}\n"]
where
dot :: DominatorTree -> [Builder] -> [Builder]
dot (Dominates root trees) =
(dotnode root :) . outedges trees . flip (foldl subtree) trees
where
outedges :: [DominatorTree] -> [Builder] -> [Builder]
outedges [] = id
outedges (Dominates n _ : ts) =
\bs -> " "
: showb root
: " -> "
: showb n
: singleton '\n'
: outedges ts bs
dotnode :: DominatorNode -> Builder
dotnode Entry = " entryNode [shape=plaintext, label=\"entry\"]\n"
dotnode (Labelled l) = " " <> showb l <> singleton '\n'
subtree :: [Builder] -> DominatorTree -> [Builder]
subtree = flip dot
-- | /Since: 2/
instance TextShow DPath where
showb (DPath ls) = mconcat $ foldr (\l path -> showb l <> " -> " : path)
["entry"]
ls
{-# INLINE showb #-}