haskell-tools-ast-trf-0.1.2.0: Language/Haskell/Tools/AnnTrf/SourceTemplate.hs
{-# LANGUAGE FlexibleInstances
, FlexibleContexts
, DeriveDataTypeable
, TemplateHaskell
, RecordWildCards
#-}
-- | The final version of the source annotation. Each node contains its original textual format, with the places of
-- the children specified by placeholders.
module Language.Haskell.Tools.AnnTrf.SourceTemplate where
import Data.Data
import Data.String
import Control.Reference
import SrcLoc
import Language.Haskell.Tools.AST
data SourceTemplateElem
= TextElem String -- ^ Source text belonging to the current node
| ChildElem -- ^ Placeholder for the next children of the node
| OptionalChildElem { _srcTmpBefore :: String -- ^ Text that should be put before the element if it appears
, _srcTmpAfter :: String -- ^ Text that should be put after the element if it appears
}
| ChildListElem { _srcTmpBefore :: String -- ^ Text that should be put before the first element if the list becomes populated
, _srcTmpAfter :: String -- ^ Text that should be put after the last element if the list becomes populated
, _srcTmpDefaultSeparator :: String -- ^ The default separator if the list were empty
, _srcTmpIndented :: Bool -- ^ True, if the elements need to be aligned in the same column
, _srcTmpSeparators :: [String] -- ^ The actual separators that were found in the source code
}
deriving (Eq, Ord, Data)
makeReferences ''SourceTemplateElem
-- | A pattern that controls how the original source code can be
-- retrieved from the AST. A source template is assigned to each node.
-- It has holes where the content of an other node should be printed.
data SourceTemplate = SourceTemplate { _sourceTemplateRange :: SrcSpan
, _sourceTemplateElems :: [SourceTemplateElem]
} deriving Data
makeReferences ''SourceTemplate
instance HasRange (NodeInfo sema SourceTemplate) where
getRange = (^. sourceInfo&sourceTemplateRange)
instance Show SourceTemplateElem where
show (TextElem s) = s
show ChildElem = "«.»"
show OptionalChildElem{..} = "«?" ++ show _srcTmpBefore ++ " " ++ show _srcTmpAfter ++ "?»"
show ChildListElem{..} = "«*" ++ show _srcTmpBefore ++ " " ++ show _srcTmpDefaultSeparator ++ " " ++ show _srcTmpAfter ++ "*»"
instance Show SourceTemplate where
show (SourceTemplate rng sp) = concatMap show sp