{-# LANGUAGE DeriveDataTypeable #-}
module Language.Haskell.Exts.Comments
( associateHaddock
, Comment(..), UnknownPragma(..)
) where
import Language.Haskell.Exts.Syntax
import Language.Haskell.Exts.SrcLoc
import Data.Char (isSpace)
import Data.Traversable
import Data.Data
data = Bool SrcSpan String
deriving (Comment -> Comment -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Comment -> Comment -> Bool
$c/= :: Comment -> Comment -> Bool
== :: Comment -> Comment -> Bool
$c== :: Comment -> Comment -> Bool
Eq,Int -> Comment -> ShowS
[Comment] -> ShowS
Comment -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Comment] -> ShowS
$cshowList :: [Comment] -> ShowS
show :: Comment -> String
$cshow :: Comment -> String
showsPrec :: Int -> Comment -> ShowS
$cshowsPrec :: Int -> Comment -> ShowS
Show,Typeable,Typeable Comment
Comment -> Constr
Comment -> DataType
(forall b. Data b => b -> b) -> Comment -> Comment
forall a.
Typeable a
-> (forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> a -> c a)
-> (forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c a)
-> (a -> Constr)
-> (a -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c a))
-> (forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c a))
-> ((forall b. Data b => b -> b) -> a -> a)
-> (forall r r'.
(r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall r r'.
(r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall u. (forall d. Data d => d -> u) -> a -> [u])
-> (forall u. Int -> (forall d. Data d => d -> u) -> a -> u)
-> (forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> a -> m a)
-> Data a
forall u. Int -> (forall d. Data d => d -> u) -> Comment -> u
forall u. (forall d. Data d => d -> u) -> Comment -> [u]
forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> Comment -> r
forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> Comment -> r
forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> Comment -> m Comment
forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Comment -> m Comment
forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c Comment
forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Comment -> c Comment
forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c Comment)
forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c Comment)
gmapMo :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Comment -> m Comment
$cgmapMo :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Comment -> m Comment
gmapMp :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Comment -> m Comment
$cgmapMp :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Comment -> m Comment
gmapM :: forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> Comment -> m Comment
$cgmapM :: forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> Comment -> m Comment
gmapQi :: forall u. Int -> (forall d. Data d => d -> u) -> Comment -> u
$cgmapQi :: forall u. Int -> (forall d. Data d => d -> u) -> Comment -> u
gmapQ :: forall u. (forall d. Data d => d -> u) -> Comment -> [u]
$cgmapQ :: forall u. (forall d. Data d => d -> u) -> Comment -> [u]
gmapQr :: forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> Comment -> r
$cgmapQr :: forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> Comment -> r
gmapQl :: forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> Comment -> r
$cgmapQl :: forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> Comment -> r
gmapT :: (forall b. Data b => b -> b) -> Comment -> Comment
$cgmapT :: (forall b. Data b => b -> b) -> Comment -> Comment
dataCast2 :: forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c Comment)
$cdataCast2 :: forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c Comment)
dataCast1 :: forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c Comment)
$cdataCast1 :: forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c Comment)
dataTypeOf :: Comment -> DataType
$cdataTypeOf :: Comment -> DataType
toConstr :: Comment -> Constr
$ctoConstr :: Comment -> Constr
gunfold :: forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c Comment
$cgunfold :: forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c Comment
gfoldl :: forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Comment -> c Comment
$cgfoldl :: forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Comment -> c Comment
Data)
data UnknownPragma = UnknownPragma SrcSpan String
deriving (UnknownPragma -> UnknownPragma -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: UnknownPragma -> UnknownPragma -> Bool
$c/= :: UnknownPragma -> UnknownPragma -> Bool
== :: UnknownPragma -> UnknownPragma -> Bool
$c== :: UnknownPragma -> UnknownPragma -> Bool
Eq,Int -> UnknownPragma -> ShowS
[UnknownPragma] -> ShowS
UnknownPragma -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [UnknownPragma] -> ShowS
$cshowList :: [UnknownPragma] -> ShowS
show :: UnknownPragma -> String
$cshow :: UnknownPragma -> String
showsPrec :: Int -> UnknownPragma -> ShowS
$cshowsPrec :: Int -> UnknownPragma -> ShowS
Show,Typeable,Typeable UnknownPragma
UnknownPragma -> Constr
UnknownPragma -> DataType
(forall b. Data b => b -> b) -> UnknownPragma -> UnknownPragma
forall a.
Typeable a
-> (forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> a -> c a)
-> (forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c a)
-> (a -> Constr)
-> (a -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c a))
-> (forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c a))
-> ((forall b. Data b => b -> b) -> a -> a)
-> (forall r r'.
(r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall r r'.
(r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall u. (forall d. Data d => d -> u) -> a -> [u])
-> (forall u. Int -> (forall d. Data d => d -> u) -> a -> u)
-> (forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> a -> m a)
-> Data a
forall u. Int -> (forall d. Data d => d -> u) -> UnknownPragma -> u
forall u. (forall d. Data d => d -> u) -> UnknownPragma -> [u]
forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> UnknownPragma -> r
forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> UnknownPragma -> r
forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> UnknownPragma -> m UnknownPragma
forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> UnknownPragma -> m UnknownPragma
forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c UnknownPragma
forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> UnknownPragma -> c UnknownPragma
forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c UnknownPragma)
forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c UnknownPragma)
gmapMo :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> UnknownPragma -> m UnknownPragma
$cgmapMo :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> UnknownPragma -> m UnknownPragma
gmapMp :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> UnknownPragma -> m UnknownPragma
$cgmapMp :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> UnknownPragma -> m UnknownPragma
gmapM :: forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> UnknownPragma -> m UnknownPragma
$cgmapM :: forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> UnknownPragma -> m UnknownPragma
gmapQi :: forall u. Int -> (forall d. Data d => d -> u) -> UnknownPragma -> u
$cgmapQi :: forall u. Int -> (forall d. Data d => d -> u) -> UnknownPragma -> u
gmapQ :: forall u. (forall d. Data d => d -> u) -> UnknownPragma -> [u]
$cgmapQ :: forall u. (forall d. Data d => d -> u) -> UnknownPragma -> [u]
gmapQr :: forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> UnknownPragma -> r
$cgmapQr :: forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> UnknownPragma -> r
gmapQl :: forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> UnknownPragma -> r
$cgmapQl :: forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> UnknownPragma -> r
gmapT :: (forall b. Data b => b -> b) -> UnknownPragma -> UnknownPragma
$cgmapT :: (forall b. Data b => b -> b) -> UnknownPragma -> UnknownPragma
dataCast2 :: forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c UnknownPragma)
$cdataCast2 :: forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c UnknownPragma)
dataCast1 :: forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c UnknownPragma)
$cdataCast1 :: forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c UnknownPragma)
dataTypeOf :: UnknownPragma -> DataType
$cdataTypeOf :: UnknownPragma -> DataType
toConstr :: UnknownPragma -> Constr
$ctoConstr :: UnknownPragma -> Constr
gunfold :: forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c UnknownPragma
$cgunfold :: forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c UnknownPragma
gfoldl :: forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> UnknownPragma -> c UnknownPragma
$cgfoldl :: forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> UnknownPragma -> c UnknownPragma
Data)
associateHaddock
::(Annotated ast,Traversable ast)
=> (ast SrcSpanInfo,[Comment])
-> ast (SrcSpanInfo,[Comment])
associateHaddock :: forall (ast :: * -> *).
(Annotated ast, Traversable ast) =>
(ast SrcSpanInfo, [Comment]) -> ast (SrcSpanInfo, [Comment])
associateHaddock (ast SrcSpanInfo
ast,[]) = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\SrcSpanInfo
src->(SrcSpanInfo
src,[])) ast SrcSpanInfo
ast
associateHaddock (ast SrcSpanInfo
ast,[Comment]
comments) =
let
(CommentAccumulator
ca,ast (SrcSpanInfo, [Comment])
assocs1) = forall (t :: * -> *) s a b.
Traversable t =>
(s -> a -> (s, b)) -> s -> t a -> (s, t b)
mapAccumL CommentAccumulator
-> SrcSpanInfo -> (CommentAccumulator, (SrcSpanInfo, [Comment]))
associate1 ([Comment] -> CommentAccumulator
newAccumulator [Comment]
comments) ast SrcSpanInfo
ast
in forall a b. (a, b) -> b
snd forall a b. (a -> b) -> a -> b
$ forall (t :: * -> *) s a b.
Traversable t =>
(s -> a -> (s, b)) -> s -> t a -> (s, t b)
mapAccumL [(SrcSpanInfo, [Comment])]
-> (SrcSpanInfo, [Comment])
-> ([(SrcSpanInfo, [Comment])], (SrcSpanInfo, [Comment]))
merge (CommentAccumulator -> [(SrcSpanInfo, [Comment])]
lastPost CommentAccumulator
ca) ast (SrcSpanInfo, [Comment])
assocs1
merge
:: [(SrcSpanInfo,[Comment])]
-> (SrcSpanInfo,[Comment])
-> ([(SrcSpanInfo,[Comment])], (SrcSpanInfo,[Comment]))
merge :: [(SrcSpanInfo, [Comment])]
-> (SrcSpanInfo, [Comment])
-> ([(SrcSpanInfo, [Comment])], (SrcSpanInfo, [Comment]))
merge [] (SrcSpanInfo, [Comment])
ret = ([],(SrcSpanInfo, [Comment])
ret)
merge ((SrcSpanInfo, [Comment])
x:[(SrcSpanInfo, [Comment])]
xs) (SrcSpanInfo
src,[Comment]
cmts) =
if forall a b. (a, b) -> a
fst (SrcSpanInfo, [Comment])
x forall a. Eq a => a -> a -> Bool
== SrcSpanInfo
src
then ([(SrcSpanInfo, [Comment])]
xs,(SrcSpanInfo
src,[Comment]
cmts forall a. [a] -> [a] -> [a]
++ forall a b. (a, b) -> b
snd (SrcSpanInfo, [Comment])
x))
else ((SrcSpanInfo, [Comment])
xforall a. a -> [a] -> [a]
:[(SrcSpanInfo, [Comment])]
xs,(SrcSpanInfo
src,[Comment]
cmts))
lastPost :: CommentAccumulator -> [(SrcSpanInfo, [Comment])]
lastPost :: CommentAccumulator -> [(SrcSpanInfo, [Comment])]
lastPost (CommentAccumulator (Post Comment
cmt : [HaddockComment]
rest) [SrcSpanInfo]
past [(SrcSpanInfo, [Comment])]
assocs) =
let ([HaddockComment]
toMerge, [HaddockComment]
_) = forall a. (a -> Bool) -> [a] -> ([a], [a])
span HaddockComment -> Bool
isNone [HaddockComment]
rest
psrc :: SrcSpanInfo
psrc = [SrcSpanInfo] -> SrcSpanInfo
matchPreviousSrc [SrcSpanInfo]
past
in ([(SrcSpanInfo, [Comment])]
assocs forall a. [a] -> [a] -> [a]
++ [(SrcSpanInfo
psrc, Comment
cmt forall a. a -> [a] -> [a]
: forall a b. (a -> b) -> [a] -> [b]
map HaddockComment -> Comment
hcComment [HaddockComment]
toMerge)])
lastPost (CommentAccumulator [HaddockComment]
_ [SrcSpanInfo]
_ [(SrcSpanInfo, [Comment])]
assocs) = [(SrcSpanInfo, [Comment])]
assocs
associate1
:: CommentAccumulator
-> SrcSpanInfo
-> (CommentAccumulator,(SrcSpanInfo,[Comment]))
associate1 :: CommentAccumulator
-> SrcSpanInfo -> (CommentAccumulator, (SrcSpanInfo, [Comment]))
associate1 ca :: CommentAccumulator
ca@(CommentAccumulator [] [SrcSpanInfo]
_ [(SrcSpanInfo, [Comment])]
_) SrcSpanInfo
src = (CommentAccumulator
ca,(SrcSpanInfo
src,[]))
associate1 (CommentAccumulator (hc :: HaddockComment
hc@(Pre Comment
cmt):[HaddockComment]
rest) [SrcSpanInfo]
_ [(SrcSpanInfo, [Comment])]
assocs) SrcSpanInfo
src =
if HaddockComment -> SrcSpanInfo -> Bool
isBefore HaddockComment
hc SrcSpanInfo
src
then
let ([HaddockComment]
toMerge,[HaddockComment]
next) = SrcSpanInfo
-> [HaddockComment] -> ([HaddockComment], [HaddockComment])
getToMerge SrcSpanInfo
src [HaddockComment]
rest
newAssoc :: (SrcSpanInfo, [Comment])
newAssoc = (SrcSpanInfo
src,Comment
cmt forall a. a -> [a] -> [a]
: forall a b. (a -> b) -> [a] -> [b]
map HaddockComment -> Comment
hcComment [HaddockComment]
toMerge)
in ([HaddockComment]
-> [SrcSpanInfo]
-> [(SrcSpanInfo, [Comment])]
-> CommentAccumulator
CommentAccumulator [HaddockComment]
next [] [(SrcSpanInfo, [Comment])]
assocs,(SrcSpanInfo, [Comment])
newAssoc)
else ([HaddockComment]
-> [SrcSpanInfo]
-> [(SrcSpanInfo, [Comment])]
-> CommentAccumulator
CommentAccumulator (HaddockComment
hcforall a. a -> [a] -> [a]
:[HaddockComment]
rest) [] [(SrcSpanInfo, [Comment])]
assocs,(SrcSpanInfo
src,[]))
associate1 (CommentAccumulator (hc :: HaddockComment
hc@(Post Comment
cmt):[HaddockComment]
rest) [SrcSpanInfo]
past [(SrcSpanInfo, [Comment])]
assocs) SrcSpanInfo
src =
if HaddockComment -> SrcSpanInfo -> Bool
isBefore HaddockComment
hc SrcSpanInfo
src
then
let ([HaddockComment]
toMerge,[HaddockComment]
next) = SrcSpanInfo
-> [HaddockComment] -> ([HaddockComment], [HaddockComment])
getToMerge SrcSpanInfo
src [HaddockComment]
rest
newAssocs :: [(SrcSpanInfo, [Comment])]
newAssocs =
if forall (t :: * -> *) a. Foldable t => t a -> Bool
null [SrcSpanInfo]
past
then [(SrcSpanInfo, [Comment])]
assocs
else [(SrcSpanInfo, [Comment])]
assocsforall a. [a] -> [a] -> [a]
++[([SrcSpanInfo] -> SrcSpanInfo
matchPreviousSrc [SrcSpanInfo]
past,Comment
cmt forall a. a -> [a] -> [a]
: forall a b. (a -> b) -> [a] -> [b]
map HaddockComment -> Comment
hcComment [HaddockComment]
toMerge)]
in CommentAccumulator
-> SrcSpanInfo -> (CommentAccumulator, (SrcSpanInfo, [Comment]))
associate1 ([HaddockComment]
-> [SrcSpanInfo]
-> [(SrcSpanInfo, [Comment])]
-> CommentAccumulator
CommentAccumulator [HaddockComment]
next [] [(SrcSpanInfo, [Comment])]
newAssocs) SrcSpanInfo
src
else ([HaddockComment]
-> [SrcSpanInfo]
-> [(SrcSpanInfo, [Comment])]
-> CommentAccumulator
CommentAccumulator (HaddockComment
hcforall a. a -> [a] -> [a]
:[HaddockComment]
rest) (SrcSpanInfo
srcforall a. a -> [a] -> [a]
:[SrcSpanInfo]
past) [(SrcSpanInfo, [Comment])]
assocs,(SrcSpanInfo
src,[]))
associate1 (CommentAccumulator (HaddockComment
_:[HaddockComment]
rest) [SrcSpanInfo]
past [(SrcSpanInfo, [Comment])]
assocs) SrcSpanInfo
src =
([HaddockComment]
-> [SrcSpanInfo]
-> [(SrcSpanInfo, [Comment])]
-> CommentAccumulator
CommentAccumulator [HaddockComment]
rest (SrcSpanInfo
srcforall a. a -> [a] -> [a]
:[SrcSpanInfo]
past) [(SrcSpanInfo, [Comment])]
assocs,(SrcSpanInfo
src,[]))
data =
[HaddockComment]
[SrcSpanInfo]
[(SrcSpanInfo,[Comment])]
newAccumulator :: [Comment] -> CommentAccumulator
newAccumulator :: [Comment] -> CommentAccumulator
newAccumulator [Comment]
comments = [HaddockComment]
-> [SrcSpanInfo]
-> [(SrcSpanInfo, [Comment])]
-> CommentAccumulator
CommentAccumulator ([Comment] -> [HaddockComment]
commentsToHaddock [Comment]
comments) [] []
getToMerge
:: SrcSpanInfo
-> [HaddockComment]
-> ([HaddockComment],[HaddockComment])
getToMerge :: SrcSpanInfo
-> [HaddockComment] -> ([HaddockComment], [HaddockComment])
getToMerge SrcSpanInfo
src = forall a. (a -> Bool) -> [a] -> ([a], [a])
span (\HaddockComment
hc-> HaddockComment -> Bool
isNone HaddockComment
hc Bool -> Bool -> Bool
&& HaddockComment -> SrcSpanInfo -> Bool
isBefore HaddockComment
hc SrcSpanInfo
src)
matchPreviousSrc :: [SrcSpanInfo] -> SrcSpanInfo
matchPreviousSrc :: [SrcSpanInfo] -> SrcSpanInfo
matchPreviousSrc [] =
forall a. HasCallStack => String -> a
error String
"Language.Haskell.Exts.Annotated.Comments.matchPreviousSrc: empty list"
matchPreviousSrc [SrcSpanInfo]
srcs =
let end :: (Int, Int)
end = SrcSpan -> (Int, Int)
srcSpanEnd forall a b. (a -> b) -> a -> b
$ SrcSpanInfo -> SrcSpan
srcInfoSpan forall a b. (a -> b) -> a -> b
$ forall a. [a] -> a
head [SrcSpanInfo]
srcs
in forall a. [a] -> a
last forall a b. (a -> b) -> a -> b
$ forall a. (a -> Bool) -> [a] -> [a]
filter (((Int, Int)
end forall a. Eq a => a -> a -> Bool
==) forall b c a. (b -> c) -> (a -> b) -> a -> c
. SrcSpan -> (Int, Int)
srcSpanEnd forall b c a. (b -> c) -> (a -> b) -> a -> c
. SrcSpanInfo -> SrcSpan
srcInfoSpan) [SrcSpanInfo]
srcs
isBefore :: HaddockComment -> SrcSpanInfo -> Bool
isBefore :: HaddockComment -> SrcSpanInfo -> Bool
isBefore HaddockComment
hc SrcSpanInfo
src=
let
(Comment Bool
_ SrcSpan
csrc String
_) = HaddockComment -> Comment
hcComment HaddockComment
hc
in SrcSpan
csrc forall a. Ord a => a -> a -> Bool
< SrcSpanInfo -> SrcSpan
srcInfoSpan SrcSpanInfo
src
data =
Pre
{
::Comment
}
| Post {
::Comment
}
| None {
::Comment
}
isNone :: HaddockComment -> Bool
isNone :: HaddockComment -> Bool
isNone (None Comment
_) = Bool
True
isNone HaddockComment
_ = Bool
False
commentsToHaddock :: [Comment] -> [HaddockComment]
= forall a b. (a -> b) -> [a] -> [b]
map Comment -> HaddockComment
commentToHaddock
commentToHaddock :: Comment -> HaddockComment
c :: Comment
c@(Comment Bool
_ SrcSpan
_ String
txt) =
case forall a. (a -> Bool) -> [a] -> [a]
dropWhile Char -> Bool
isSpace String
txt of
(Char
'|':String
_) -> Comment -> HaddockComment
Pre Comment
c
(Char
'^':String
_) -> Comment -> HaddockComment
Post Comment
c
String
_ -> Comment -> HaddockComment
None Comment
c