{-# LANGUAGE RecordWildCards #-}
module GHC.HsToCore.Breakpoints
(
mkModBreaks, ModBreaks(..)
, BreakpointId(..), BreakTickIndex
) where
import GHC.Prelude
import Data.Array
import GHC.HsToCore.Ticks (Tick (..))
import GHC.Data.SizedSeq
import GHC.Types.SrcLoc (SrcSpan)
import GHC.Types.Name (OccName)
import GHC.Types.Tickish (BreakTickIndex, BreakpointId(..))
import GHC.Unit.Module (Module)
import GHC.Utils.Outputable
import Data.List (intersperse)
data ModBreaks
= ModBreaks
{ ModBreaks -> Array BreakTickIndex SrcSpan
modBreaks_locs :: !(Array BreakTickIndex SrcSpan)
, ModBreaks -> Array BreakTickIndex [OccName]
modBreaks_vars :: !(Array BreakTickIndex [OccName])
, ModBreaks -> Array BreakTickIndex [String]
modBreaks_decls :: !(Array BreakTickIndex [String])
, ModBreaks -> Array BreakTickIndex (String, String)
modBreaks_ccs :: !(Array BreakTickIndex (String, String))
, ModBreaks -> Module
modBreaks_module :: !Module
}
mkModBreaks :: Bool
-> Module -> SizedSeq Tick -> ModBreaks
mkModBreaks :: Bool -> Module -> SizedSeq Tick -> ModBreaks
mkModBreaks Bool
interpreterProfiled Module
modl SizedSeq Tick
extendedMixEntries
= let count :: BreakTickIndex
count = Word -> BreakTickIndex
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Word -> BreakTickIndex) -> Word -> BreakTickIndex
forall a b. (a -> b) -> a -> b
$ SizedSeq Tick -> Word
forall a. SizedSeq a -> Word
sizeSS SizedSeq Tick
extendedMixEntries
entries :: [Tick]
entries = SizedSeq Tick -> [Tick]
forall a. SizedSeq a -> [a]
ssElts SizedSeq Tick
extendedMixEntries
locsTicks :: Array BreakTickIndex SrcSpan
locsTicks = (BreakTickIndex, BreakTickIndex)
-> [SrcSpan] -> Array BreakTickIndex SrcSpan
forall i e. Ix i => (i, i) -> [e] -> Array i e
listArray (BreakTickIndex
0,BreakTickIndex
countBreakTickIndex -> BreakTickIndex -> BreakTickIndex
forall a. Num a => a -> a -> a
-BreakTickIndex
1) [ Tick -> SrcSpan
tick_loc Tick
t | Tick
t <- [Tick]
entries ]
varsTicks :: Array BreakTickIndex [OccName]
varsTicks = (BreakTickIndex, BreakTickIndex)
-> [[OccName]] -> Array BreakTickIndex [OccName]
forall i e. Ix i => (i, i) -> [e] -> Array i e
listArray (BreakTickIndex
0,BreakTickIndex
countBreakTickIndex -> BreakTickIndex -> BreakTickIndex
forall a. Num a => a -> a -> a
-BreakTickIndex
1) [ Tick -> [OccName]
tick_ids Tick
t | Tick
t <- [Tick]
entries ]
declsTicks :: Array BreakTickIndex [String]
declsTicks = (BreakTickIndex, BreakTickIndex)
-> [[String]] -> Array BreakTickIndex [String]
forall i e. Ix i => (i, i) -> [e] -> Array i e
listArray (BreakTickIndex
0,BreakTickIndex
countBreakTickIndex -> BreakTickIndex -> BreakTickIndex
forall a. Num a => a -> a -> a
-BreakTickIndex
1) [ Tick -> [String]
tick_path Tick
t | Tick
t <- [Tick]
entries ]
ccs :: Array BreakTickIndex (String, String)
ccs
| Bool
interpreterProfiled =
(BreakTickIndex, BreakTickIndex)
-> [(String, String)] -> Array BreakTickIndex (String, String)
forall i e. Ix i => (i, i) -> [e] -> Array i e
listArray
(BreakTickIndex
0, BreakTickIndex
count BreakTickIndex -> BreakTickIndex -> BreakTickIndex
forall a. Num a => a -> a -> a
- BreakTickIndex
1)
[ ( [String] -> String
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat ([String] -> String) -> [String] -> String
forall a b. (a -> b) -> a -> b
$ String -> [String] -> [String]
forall a. a -> [a] -> [a]
intersperse String
"." ([String] -> [String]) -> [String] -> [String]
forall a b. (a -> b) -> a -> b
$ Tick -> [String]
tick_path Tick
t,
SDocContext -> SDoc -> String
renderWithContext SDocContext
defaultSDocContext (SDoc -> String) -> SDoc -> String
forall a b. (a -> b) -> a -> b
$ SrcSpan -> SDoc
forall a. Outputable a => a -> SDoc
ppr (SrcSpan -> SDoc) -> SrcSpan -> SDoc
forall a b. (a -> b) -> a -> b
$ Tick -> SrcSpan
tick_loc Tick
t
)
| Tick
t <- [Tick]
entries
]
| Bool
otherwise = (BreakTickIndex, BreakTickIndex)
-> [(String, String)] -> Array BreakTickIndex (String, String)
forall i e. Ix i => (i, i) -> [e] -> Array i e
listArray (BreakTickIndex
0, -BreakTickIndex
1) []
in ModBreaks
{ modBreaks_locs :: Array BreakTickIndex SrcSpan
modBreaks_locs = Array BreakTickIndex SrcSpan
locsTicks
, modBreaks_vars :: Array BreakTickIndex [OccName]
modBreaks_vars = Array BreakTickIndex [OccName]
varsTicks
, modBreaks_decls :: Array BreakTickIndex [String]
modBreaks_decls = Array BreakTickIndex [String]
declsTicks
, modBreaks_ccs :: Array BreakTickIndex (String, String)
modBreaks_ccs = Array BreakTickIndex (String, String)
ccs
, modBreaks_module :: Module
modBreaks_module = Module
modl
}