haskell-tools-prettyprint 0.4.1.1 → 0.4.1.2
raw patch · 11 files changed
+61/−78 lines, 11 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
Files
- Language/Haskell/Tools/IndentationUtils.hs +4/−4
- Language/Haskell/Tools/PrettyPrint.hs +6/−12
- Language/Haskell/Tools/PrettyPrint/RoseTree.hs +1/−1
- Language/Haskell/Tools/Transform.hs +5/−5
- Language/Haskell/Tools/Transform/PlaceComments.hs +6/−11
- Language/Haskell/Tools/Transform/RangeTemplate.hs +5/−5
- Language/Haskell/Tools/Transform/RangeTemplateToSourceTemplate.hs +8/−11
- Language/Haskell/Tools/Transform/RangeToRangeTemplate.hs +17/−17
- Language/Haskell/Tools/Transform/SourceTemplate.hs +5/−6
- Language/Haskell/Tools/Transform/SourceTemplateHelpers.hs +3/−5
- haskell-tools-prettyprint.cabal +1/−1
Language/Haskell/Tools/IndentationUtils.hs view
@@ -1,11 +1,11 @@ -- | Utilities to modify the indentation of AST fragments module Language.Haskell.Tools.IndentationUtils where -import Control.Reference -import Control.Monad.Identity +import Control.Monad.Identity (Identity(..)) +import Control.Reference ((.=)) -import Language.Haskell.Tools.AST -import Language.Haskell.Tools.Transform.SourceTemplate +import Language.Haskell.Tools.AST (SrcTemplateStage(..), SourceInfoTrf(..), SourceInfoTraversal(..)) +import Language.Haskell.Tools.Transform.SourceTemplate (sourceTemplateMinimalIndent, srcTmpListMinimalIndent, srcTmpOptMinimalIndent) -- | Set the minimal indentation recursively for a part of the AST setMinimalIndent :: SourceInfoTraversal elem
Language/Haskell/Tools/PrettyPrint.hs view
@@ -7,24 +7,19 @@ -- | Pretty printing the AST module Language.Haskell.Tools.PrettyPrint (prettyPrint) where +import FastString (fsLit) import SrcLoc -import FastString -import Language.Haskell.Tools.AST -import Language.Haskell.Tools.PrettyPrint.RoseTree +import Language.Haskell.Tools.AST (SrcTemplateStage(..), SourceInfoTraversal(..)) +import Language.Haskell.Tools.PrettyPrint.RoseTree (RoseSourceInfo(..), RoseTree(..), toRoseTree) import Language.Haskell.Tools.Transform.SourceTemplate import Control.Monad.State -import Control.Reference -import Data.Maybe +import Data.Foldable (Foldable(..), concat) import Data.List as List -import Data.List.Split -import Data.Foldable +import Data.List.Split (splitOn) import Data.Sequence hiding (null, replicate) -import Language.Haskell.Tools.AST -import Debug.Trace - -- | Pretty prints an AST by using source templates stored as node info prettyPrint :: (SourceInfoTraversal node) => node dom SrcTemplateStage -> String prettyPrint = toList . printRose . toRoseTree @@ -41,7 +36,6 @@ -- warning: the length of the file should not exceed maxbound::Int printRose' parent (RoseTree (RoseSpan (SourceTemplateNode rng elems minInd relInd)) children) = do slide <- calculateSlide rng - actRng <- get let printTemplateElems :: [SourceTemplateElem] -> [RoseTree SrcTemplateStage] -> PPState (Seq Char) printTemplateElems (TextElem txt : rest) children = putString slide min txt >+< printTemplateElems rest children printTemplateElems (ChildElem : rest) (child : children) = printRose' parent child >+< printTemplateElems rest children @@ -129,4 +123,4 @@ printListWithSeps' _ parent _ _ _ [child] = printRose' parent child printListWithSeps' putCorrectSep parent slide minInd (sep:seps) (child:children) = printRose' parent child >+< putCorrectSep slide minInd sep >+< printListWithSeps' putCorrectSep parent slide minInd seps children - +printListWithSeps' _ _ _ _ [] _ = error "printListWithSeps': the number of elements and separators does not match"
Language/Haskell/Tools/PrettyPrint/RoseTree.hs view
@@ -6,7 +6,7 @@ -- | A simpler representation of the original AST. module Language.Haskell.Tools.PrettyPrint.RoseTree where -import Control.Monad.State +import Control.Monad.State (Monad(..), execState, modify) import Language.Haskell.Tools.AST -- | A rose tree containing additional node information
Language/Haskell/Tools/Transform.hs view
@@ -13,15 +13,15 @@ , rangeToSource, fixRanges, cutUpRanges, getLocIndices, mapLocIndices ) where -import Language.Haskell.Tools.Transform.RangeToRangeTemplate -import Language.Haskell.Tools.Transform.RangeTemplateToSourceTemplate -import Language.Haskell.Tools.Transform.RangeTemplate +import Language.Haskell.Tools.Transform.PlaceComments (getNormalComments, getPragmaComments, placeComments) +import Language.Haskell.Tools.Transform.RangeTemplate () +import Language.Haskell.Tools.Transform.RangeTemplateToSourceTemplate (rangeToSource, getLocIndices, mapLocIndices) +import Language.Haskell.Tools.Transform.RangeToRangeTemplate (cutUpRanges, fixRanges) import Language.Haskell.Tools.Transform.SourceTemplate import Language.Haskell.Tools.Transform.SourceTemplateHelpers -import Language.Haskell.Tools.Transform.PlaceComments import Language.Haskell.Tools.AST -import StringBuffer +import StringBuffer (StringBuffer(..)) -- | Prepares the AST for pretty printing prepareAST :: SourceInfoTraversal node => StringBuffer -> Ann node dom RangeStage -> Ann node dom SrcTemplateStage
Language/Haskell/Tools/Transform/PlaceComments.hs view
@@ -6,21 +6,16 @@ -- normalizing transformation should be performed that expands parents to contain their children. module Language.Haskell.Tools.Transform.PlaceComments where +import Control.Monad.State +import Control.Monad.Writer +import Control.Reference hiding (element) +import Data.Char (isSpace, isAlphaNum) import qualified Data.Map as Map -import qualified Data.Set as Set import Data.Maybe -import Data.List -import Data.Char (isSpace, isAlphaNum) -import Data.Data -import Data.Generics.Uniplate.Data -import Control.Reference hiding (element) -import Control.Monad.Writer -import Control.Monad.State +import qualified Data.Set as Set (lookupLE, lookupGE, fromList) +import ApiAnnotation (AnnotationComment(..)) import SrcLoc -import ApiAnnotation -import Outputable -import Debug.Trace import Language.Haskell.Tools.AST
Language/Haskell/Tools/Transform/RangeTemplate.hs view
@@ -8,10 +8,10 @@ -- had been cut from the parent nodes, but the annotations still contain ranges instead of text. module Language.Haskell.Tools.Transform.RangeTemplate where -import Data.Data import Control.Reference -import SrcLoc +import Data.Data import Language.Haskell.Tools.AST +import SrcLoc instance SourceInfo RngTemplateStage where data SpanInfo RngTemplateStage = RangeTemplateNode { _rngTemplateNodeRange :: RealSrcSpan @@ -93,10 +93,10 @@ instance Show (SpanInfo RngTemplateStage) where show rngNode = concatMap show $ rngNode ^. rngTemplateNodeElems instance Show (ListInfo RngTemplateStage) where - show RangeTemplateList{..} = "«*" ++ shortShowSpan (RealSrcSpan _rngTemplateListRange) ++ " " ++ show _rngTmpListBefore ++ " " ++ show _rngTmpDefaultSeparator ++ " " ++ show _rngTmpListAfter ++ "*»" + show RangeTemplateList{..} = "<*" ++ shortShowSpan (RealSrcSpan _rngTemplateListRange) ++ " " ++ show _rngTmpListBefore ++ " " ++ show _rngTmpDefaultSeparator ++ " " ++ show _rngTmpListAfter ++ "*>" instance Show (OptionalInfo RngTemplateStage) where - show RangeTemplateOpt{..} = "«?" ++ shortShowSpan (RealSrcSpan _rngTemplateOptRange) ++ " " ++ show _rngTmpOptBefore ++ " " ++ show _rngTmpOptAfter ++ "?»" + show RangeTemplateOpt{..} = "<?" ++ shortShowSpan (RealSrcSpan _rngTemplateOptRange) ++ " " ++ show _rngTmpOptBefore ++ " " ++ show _rngTmpOptAfter ++ "?>" instance Show RangeTemplateElem where show (RangeElem sp) = shortShowSpan (RealSrcSpan sp) - show RangeChildElem = "«.»" + show RangeChildElem = "<.>"
Language/Haskell/Tools/Transform/RangeTemplateToSourceTemplate.hs view
@@ -5,18 +5,14 @@ -- Basically it reads the source file and attaches parts of the source file to the AST elements that have the range of the given source code fragment. module Language.Haskell.Tools.Transform.RangeTemplateToSourceTemplate where -import SrcLoc -import StringBuffer -import Data.Map -import Data.Monoid -import Control.Reference import Control.Monad.State +import Control.Reference ((^.)) +import Data.Map import Language.Haskell.Tools.AST -import Language.Haskell.Tools.Transform.RangeToRangeTemplate import Language.Haskell.Tools.Transform.RangeTemplate import Language.Haskell.Tools.Transform.SourceTemplate - -import Debug.Trace +import SrcLoc +import StringBuffer (StringBuffer(..), nextChar, atEnd) rangeToSource :: SourceInfoTraversal node => StringBuffer -> Ann node dom RngTemplateStage -> Ann node dom SrcTemplateStage @@ -43,6 +39,7 @@ in (insert k (reverse val) new, rem)) (empty, inp) where takeSpan :: StringBuffer -> OrdSrcSpan -> (StringBuffer, String) takeSpan str (OrdSrcSpan sp) = takeSpan' (realSrcSpanStart sp) (realSrcSpanEnd sp) (str,"") + takeSpan _ (NoOrdSrcSpan {}) = error "takeSpan: missing source span" takeSpan' :: RealSrcLoc -> RealSrcLoc -> (StringBuffer, String) -> (StringBuffer, String) takeSpan' start end (sb, taken) | start < end && not (atEnd sb) @@ -63,6 +60,6 @@ (\(RangeTemplateOpt rng bef aft) -> return (SourceTemplateOpt (RealSrcSpan rng) bef aft 0 Nothing))) (return ()) (return ()) where getTextFor RangeChildElem = return ChildElem - getTextFor (RangeElem sp) = do (src:rest) <- get - put rest - return (TextElem src)+ getTextFor (RangeElem _) = do (src:rest) <- get + put rest + return (TextElem src)
Language/Haskell/Tools/Transform/RangeToRangeTemplate.hs view
@@ -8,17 +8,15 @@ import Language.Haskell.Tools.AST -import Data.Data -import Data.List -import Data.Maybe -import Control.Reference hiding (element) import Control.Monad.State -import SrcLoc -import Language.Haskell.Tools.Transform.RangeTemplate +import Control.Reference ((^.)) +import Data.List +import Data.Maybe (Maybe(..), maybe, mapMaybe) -import FastString as GHC +import FastString as GHC (unpackFS) +import SrcLoc -import Debug.Trace +import Language.Haskell.Tools.Transform.RangeTemplate -- | Creates a source template from the ranges and the input file. -- All source ranges must be good ranges. @@ -26,8 +24,7 @@ => Ann node dom NormRangeStage -> Ann node dom RngTemplateStage cutUpRanges n = evalState (cutUpRanges' n) [[],[]] - where cutUpRanges' :: SourceInfoTraversal node => Ann node dom NormRangeStage - -> State [[SrcSpan]] (Ann node dom RngTemplateStage) + where cutUpRanges' :: Ann node dom NormRangeStage -> State [[SrcSpan]] (Ann node dom RngTemplateStage) cutUpRanges' = sourceInfoTraverseUp (SourceInfoTrf (trf cutOutElemSpan) (trf cutOutElemList) (trf cutOutElemOpt)) desc asc -- keep the stack to contain the children elements on the place of the parent element @@ -35,7 +32,7 @@ asc = modify tail -- combine the current node with its children, and add it to the list of current nodes - trf :: (Show (x NormRangeStage), Show (x RngTemplateStage), HasRange (x NormRangeStage), HasRange (x RngTemplateStage)) + trf :: HasRange (x RngTemplateStage) => ([SrcSpan] -> x NormRangeStage -> x RngTemplateStage) -> x NormRangeStage -> State [[SrcSpan]] (x RngTemplateStage) trf f ni = do (below : top : xs) <- get let res = f below ni @@ -51,7 +48,7 @@ desc = modify ([]:) asc = modify tail - trf :: (HasRange (x RangeStage), HasRange (x NormRangeStage)) + trf :: HasRange (x NormRangeStage) => ([SrcSpan] -> x RangeStage -> x NormRangeStage) -> x RangeStage -> State [[SrcSpan]] (x NormRangeStage) trf f ni = do (below : top : xs) <- get let res = f below ni @@ -84,28 +81,31 @@ Just pieces -> pieces ++ rest Nothing -> elem : breakFirstHit rest sp breakFirstHit [] sp = error ("breakFirstHit: " ++ maybe "" unpackFS (srcSpanFileName_maybe sp) ++ " didn't find correct place for " ++ shortShowSpan sp ++ " in " ++ shortShowSpan sp ++ " with [" ++ concat (intersperse "," (map shortShowSpan sps)) ++ "]") +cutOutElemSpan _ (NormNodeInfo (UnhelpfulSpan {})) = error "cutOutElemSpan: no real span" cutOutElemList :: [SrcSpan] -> ListInfo NormRangeStage -> ListInfo RngTemplateStage -cutOutElemList sps lp@(NormListInfo bef aft sep indented sp) +cutOutElemList sps (NormListInfo bef aft sep indented sp) = let RealSrcSpan wholeRange = foldl1 combineSrcSpans $ sp : sps in RangeTemplateList wholeRange bef aft sep indented (getSeparators wholeRange sps) cutOutElemOpt :: [SrcSpan] -> OptionalInfo NormRangeStage -> OptionalInfo RngTemplateStage -cutOutElemOpt sps op@(NormOptInfo bef aft sp) +cutOutElemOpt sps (NormOptInfo bef aft sp) = let RealSrcSpan wholeRange = foldl1 combineSrcSpans $ sp : sps in RangeTemplateOpt wholeRange bef aft collectSpanRanges :: SrcLoc -> [SrcSpan] -> RealSrcSpan collectSpanRanges (RealSrcLoc loc) [] = realSrcLocSpan loc collectSpanRanges _ [] = error "collectSpanRanges: No real src loc for empty element" -collectSpanRanges _ ls = case foldl1 combineSrcSpans ls of RealSrcSpan sp -> sp +collectSpanRanges _ ls = case foldl1 combineSrcSpans ls of + RealSrcSpan sp -> sp + UnhelpfulSpan {} -> error "collectSpanRanges: combineSrcSpans resulted no real span" -- | Cuts out all elements from a list, the rest is the list of separators getSeparators :: RealSrcSpan -> [SrcSpan] -> [RealSrcSpan] getSeparators sp infos@(_:_:_) = mapMaybe getRangeElemSpan (cutOutElemSpan infos (NormNodeInfo (RealSrcSpan sp)) ^. rngTemplateNodeElems) -- at least two elements needed or there can be no separators -getSeparators sp _ = [] +getSeparators _ _ = [] -- | Breaks the given template element into possibly 2 or 3 parts by cutting out the given part -- if it is inside the range of the template element. Returns Nothing if the second argument is not inside. @@ -119,6 +119,6 @@ (if (realSrcSpanEnd inner) < (realSrcSpanEnd outer) then [ RangeElem (mkRealSrcSpan (realSrcSpanEnd inner) (realSrcSpanEnd outer)) ] else []) -breakUpRangeElem outer inner = Nothing +breakUpRangeElem _ _ = Nothing
Language/Haskell/Tools/Transform/SourceTemplate.hs view
@@ -9,11 +9,10 @@ -- the children specified by placeholders. module Language.Haskell.Tools.Transform.SourceTemplate where -import Data.Data -import Data.String import Control.Reference -import SrcLoc +import Data.Data import Language.Haskell.Tools.AST +import SrcLoc instance SourceInfo SrcTemplateStage where data SpanInfo SrcTemplateStage @@ -124,11 +123,11 @@ 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 SourceTemplateList{..} = "<*" ++ show _srcTmpListBefore ++ " " ++ show _srcTmpDefaultSeparator ++ " " ++ show _srcTmpListAfter ++ "*>" instance Show (OptionalInfo SrcTemplateStage) where - show SourceTemplateOpt{..} = "«?" ++ show _srcTmpOptBefore ++ " " ++ show _srcTmpOptAfter ++ "?»" + show SourceTemplateOpt{..} = "<?" ++ show _srcTmpOptBefore ++ " " ++ show _srcTmpOptAfter ++ "?>" instance Show SourceTemplateElem where show (TextElem s) = s - show ChildElem = "«.»" + show ChildElem = "<.>"
Language/Haskell/Tools/Transform/SourceTemplateHelpers.hs view
@@ -5,13 +5,11 @@ -- | Helper functions for working with source templates module Language.Haskell.Tools.Transform.SourceTemplateHelpers where -import SrcLoc -import Data.String -import Data.List -import Control.Reference -import Data.Function (on) +import Control.Reference ((.=)) +import Data.String (IsString(..), String(..)) import Language.Haskell.Tools.AST import Language.Haskell.Tools.Transform.SourceTemplate +import SrcLoc (noSrcSpan, combineSrcSpans) type ASTElement node dom = Ann node dom SrcTemplateStage type ASTOptional node dom = AnnMaybeG node dom SrcTemplateStage
haskell-tools-prettyprint.cabal view
@@ -1,5 +1,5 @@ name: haskell-tools-prettyprint -version: 0.4.1.1 +version: 0.4.1.2 synopsis: Pretty printing of Haskell-Tools AST description: Converts the Haskell-Tools AST to text. Prepares the AST for this conversion. If the AST was created from the GHC AST this pretty printing will result in the original source code. Generated AST parts will get the default formatting. Works using the source annotations that are present in the AST. Creates a rose tree first to simplify the conversion. homepage: https://github.com/haskell-tools/haskell-tools