{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TypeFamilies #-}
module Language.Haskell.Tools.PrettyPrint.Prepare.SourceTemplate where
import Control.Reference
import Data.Data
import Language.Haskell.Tools.AST
import SrcLoc
instance SourceInfo SrcTemplateStage where
data SpanInfo SrcTemplateStage
= SourceTemplateNode { _sourceTemplateNodeRange :: SrcSpan
, _sourceTemplateNodeElems :: [SourceTemplateElem]
, _srcTmpMinInd :: Int
, _srcTmpRelPos :: Maybe Int
}
deriving (Eq, Ord, Data)
data ListInfo SrcTemplateStage
= SourceTemplateList { _sourceTemplateListRange :: SrcSpan
, _srcTmpListBefore :: String
, _srcTmpListAfter :: String
, _srcTmpDefaultSeparator :: String
, _srcTmpIndented :: Maybe [Bool]
, _srcTmpSeparators :: [([SourceTemplateTextElem], SrcSpan)]
, _srcTmpListMinInd :: Int
, _srcTmpListRelPos :: Maybe Int
}
deriving (Eq, Ord, Data)
data OptionalInfo SrcTemplateStage
= SourceTemplateOpt { _sourceTemplateOptRange :: SrcSpan
, _srcTmpOptBefore :: String
, _srcTmpOptAfter :: String
, _srcTmpOptMinInd :: Int
, _srcTmpOptRelPos :: Maybe Int
}
deriving (Eq, Ord, Data)
sourceTemplateNodeRange :: Simple Lens (SpanInfo SrcTemplateStage) SrcSpan
sourceTemplateNodeRange = lens _sourceTemplateNodeRange (\v s -> s { _sourceTemplateNodeRange = v })
sourceTemplateNodeElems :: Simple Lens (SpanInfo SrcTemplateStage) [SourceTemplateElem]
sourceTemplateNodeElems = lens _sourceTemplateNodeElems (\v s -> s { _sourceTemplateNodeElems = v })
sourceTemplateMinimalIndent :: Simple Lens (SpanInfo SrcTemplateStage) Int
sourceTemplateMinimalIndent = lens _srcTmpMinInd (\v s -> s { _srcTmpMinInd = v })
srcTmpRelPos :: Simple Lens (SpanInfo SrcTemplateStage) (Maybe Int)
srcTmpRelPos = lens _srcTmpRelPos (\v s -> s { _srcTmpRelPos = v })
sourceTemplateListRange :: Simple Lens (ListInfo SrcTemplateStage) SrcSpan
sourceTemplateListRange = lens _sourceTemplateListRange (\v s -> s { _sourceTemplateListRange = v })
srcTmpListBefore :: Simple Lens (ListInfo SrcTemplateStage) String
srcTmpListBefore = lens _srcTmpListBefore (\v s -> s { _srcTmpListBefore = v })
srcTmpListAfter :: Simple Lens (ListInfo SrcTemplateStage) String
srcTmpListAfter = lens _srcTmpListAfter (\v s -> s { _srcTmpListAfter = v })
srcTmpDefaultSeparator :: Simple Lens (ListInfo SrcTemplateStage) String
srcTmpDefaultSeparator = lens _srcTmpDefaultSeparator (\v s -> s { _srcTmpDefaultSeparator = v })
srcTmpIndented :: Simple Lens (ListInfo SrcTemplateStage) (Maybe [Bool])
srcTmpIndented = lens _srcTmpIndented (\v s -> s { _srcTmpIndented = v })
srcTmpSeparators :: Simple Lens (ListInfo SrcTemplateStage) [([SourceTemplateTextElem], SrcSpan)]
srcTmpSeparators = lens _srcTmpSeparators (\v s -> s { _srcTmpSeparators = v })
srcTmpListMinimalIndent :: Simple Lens (ListInfo SrcTemplateStage) Int
srcTmpListMinimalIndent = lens _srcTmpListMinInd (\v s -> s { _srcTmpListMinInd = v })
srcTmpListRelPos :: Simple Lens (ListInfo SrcTemplateStage) (Maybe Int)
srcTmpListRelPos = lens _srcTmpListRelPos (\v s -> s { _srcTmpListRelPos = v })
sourceTemplateOptRange :: Simple Lens (OptionalInfo SrcTemplateStage) SrcSpan
sourceTemplateOptRange = lens _sourceTemplateOptRange (\v s -> s { _sourceTemplateOptRange = v })
srcTmpOptBefore :: Simple Lens (OptionalInfo SrcTemplateStage) String
srcTmpOptBefore = lens _srcTmpOptBefore (\v s -> s { _srcTmpOptBefore = v })
srcTmpOptAfter :: Simple Lens (OptionalInfo SrcTemplateStage) String
srcTmpOptAfter = lens _srcTmpOptAfter (\v s -> s { _srcTmpOptAfter = v })
srcTmpOptMinimalIndent :: Simple Lens (OptionalInfo SrcTemplateStage) Int
srcTmpOptMinimalIndent = lens _srcTmpOptMinInd (\v s -> s { _srcTmpOptMinInd = v })
srcTmpOptRelPos :: Simple Lens (OptionalInfo SrcTemplateStage) (Maybe Int)
srcTmpOptRelPos = lens _srcTmpOptRelPos (\v s -> s { _srcTmpOptRelPos = v })
data SourceTemplateElem
= TextElem { _sourceTemplateTextElem :: [SourceTemplateTextElem]
, _sourceTemplateTextRange :: SrcSpan
}
| ChildElem
deriving (Eq, Ord, Data)
isStayingText :: SourceTemplateTextElem -> Bool
isStayingText StayingText{} = True
isStayingText _ = False
data SourceTemplateTextElem
= NormalText { _sourceTemplateText :: String }
| StayingText { _sourceTemplateText :: String, _lineEndings :: String }
deriving (Eq, Ord, Data)
makeReferences ''SourceTemplateElem
makeReferences ''SourceTemplateTextElem
instance HasRange (SpanInfo SrcTemplateStage) where
getRange = (^. sourceTemplateNodeRange)
setRange = (sourceTemplateNodeRange .=)
instance HasRange (ListInfo SrcTemplateStage) where
getRange = (^. sourceTemplateListRange)
setRange = (sourceTemplateListRange .=)
instance HasRange (OptionalInfo SrcTemplateStage) where
getRange = (^. sourceTemplateOptRange)
setRange = (sourceTemplateOptRange .=)
instance Show (SpanInfo SrcTemplateStage) where
show (SourceTemplateNode _ sp _ _) = concatMap show sp
instance Show (ListInfo SrcTemplateStage) where
show SourceTemplateList{..} = "<*" ++ show _srcTmpListBefore ++ " " ++ show _srcTmpDefaultSeparator ++ " " ++ show _srcTmpListAfter ++ " " ++ show _srcTmpSeparators ++ "*>"
instance Show (OptionalInfo SrcTemplateStage) where
show SourceTemplateOpt{..} = "<?" ++ show _srcTmpOptBefore ++ " " ++ show _srcTmpOptAfter ++ "?>"
instance Show SourceTemplateElem where
show (TextElem s _) = show s
show ChildElem = "<.>"
instance Show SourceTemplateTextElem where
show (NormalText s) = show s
show (StayingText s _) = "|" ++ show s ++ "|"