module Language.Haskell.HBB.SmartInline (
smartinline,
smartinlineM,
showSmartInlineResult,
showSmartInlineResultAsByteString,
NonFirstLinesIndenting(..),
BufLoc(..),
BufSpan(..),
RealSrcSpan(..),
TTree(..),
LineBuf,
encodeTTreeToJSON,
decodeTTreeFromJSON
) where
import Language.Haskell.HBB.Internal.InternalTTreeCreation
import Language.Haskell.HBB.Internal.InterfaceTypes
import Language.Haskell.HBB.Internal.InternalTTree
import Language.Haskell.HBB.Internal.GHCHighlevel
import Language.Haskell.HBB.Internal.TTreeJSON (encodeTTreeToJSON,decodeTTreeFromJSON)
import Language.Haskell.HBB.Internal.SrcSpan
import Language.Haskell.HBB.Internal.TTree
import Language.Haskell.HBB.Internal.GHC
import qualified Data.ByteString.Lazy.Char8 as BL
import qualified Data.ByteString.Char8 as B
import Control.Monad.Reader
import GHC.Paths (libdir)
import SrcLoc
import GHC (GhcMonad)
smartinline :: [String] -> NonFirstLinesIndenting -> FilePath -> BufLoc -> Maybe BufLoc
-> IO (RealSrcSpan,TTree LineBuf (RealSrcSpan,Int) BufSpan)
smartinline ghcOptions ai fn sl mbEndLoc =
runGhcWithCmdLineFlags ghcOptions (Just libdir) $ smartinlineM ai fn sl mbEndLoc
showSmartInlineResult :: (RealSrcSpan,TTree LineBuf (RealSrcSpan,Int) BufSpan) -> String
showSmartInlineResult spanAndTree =
B.unpack $ B.concat $ BL.toChunks $ showSmartInlineResultAsByteString spanAndTree
showSmartInlineResultAsByteString :: (RealSrcSpan,TTree LineBuf (RealSrcSpan,Int) BufSpan) -> BL.ByteString
showSmartInlineResultAsByteString spanAndTree =
BL.snoc (encodeTTreeToJSON spanAndTree) '\n'
smartinlineM :: GhcMonad m => NonFirstLinesIndenting -> FilePath -> BufLoc -> Maybe BufLoc
-> m (RealSrcSpan,TTree LineBuf (RealSrcSpan,Int) BufSpan)
smartinlineM ai filename startLoc mbEndLoc = do
sti@(SearchedTokenInfo { result = (binding,_) }) <- searchFunctionBindingM filename startLoc mbEndLoc
let produceClientTTree :: FunBindInfo -> ClientTTree
produceClientTTree bi =
let richTTree = runReader (toTTree $ binding) ProduceLambda
inlCol = ((srcLocCol $ realSrcSpanStart $ occSpan bi))
insSpan = pointBufSpan 1 (case ai of AdaptIndToTargetEnv -> inlCol
IgnoreIndOfTargetEnv -> 1)
in snd $ applyIndentation (IncInline insSpan,richTTree)
return (occSpan sti,produceClientTTree sti)