Merge Haddock comment support from ghc.haddock -- big patch
[ghc-hetmet.git] / compiler / hsSyn / HsDoc.hs
1 module HsDoc (
2   HsDoc(..),
3   LHsDoc,
4   docAppend,
5   docParagraph,
6   ppr_mbDoc
7   ) where
8
9 #include "HsVersions.h"
10
11 import RdrName
12 import Outputable
13 import SrcLoc
14
15 import Data.Char (isSpace)
16
17 data HsDoc id
18   = DocEmpty
19   | DocAppend (HsDoc id) (HsDoc id)
20   | DocString String
21   | DocParagraph (HsDoc id)
22   | DocIdentifier [id]
23   | DocModule String
24   | DocEmphasis (HsDoc id)
25   | DocMonospaced (HsDoc id)
26   | DocUnorderedList [HsDoc id]
27   | DocOrderedList [HsDoc id]
28   | DocDefList [(HsDoc id, HsDoc id)]
29   | DocCodeBlock (HsDoc id)
30   | DocURL String
31   | DocAName String
32   deriving (Eq, Show)
33
34 type LHsDoc a = Located (HsDoc a)
35
36 instance Outputable (HsDoc a) where
37   ppr _ = text "<document comment>"
38
39 ppr_mbDoc (Just doc) = ppr doc
40 ppr_mbDoc Nothing    = empty
41
42 -- used to make parsing easier; we group the list items later
43 docAppend :: HsDoc id -> HsDoc id -> HsDoc id
44 docAppend (DocUnorderedList ds1) (DocUnorderedList ds2)
45   = DocUnorderedList (ds1++ds2)
46 docAppend (DocUnorderedList ds1) (DocAppend (DocUnorderedList ds2) d)
47   = DocAppend (DocUnorderedList (ds1++ds2)) d
48 docAppend (DocOrderedList ds1) (DocOrderedList ds2)
49   = DocOrderedList (ds1++ds2)
50 docAppend (DocOrderedList ds1) (DocAppend (DocOrderedList ds2) d)
51   = DocAppend (DocOrderedList (ds1++ds2)) d
52 docAppend (DocDefList ds1) (DocDefList ds2)
53   = DocDefList (ds1++ds2)
54 docAppend (DocDefList ds1) (DocAppend (DocDefList ds2) d)
55   = DocAppend (DocDefList (ds1++ds2)) d
56 docAppend DocEmpty d = d
57 docAppend d DocEmpty = d
58 docAppend d1 d2
59   = DocAppend d1 d2
60
61 -- again to make parsing easier - we spot a paragraph whose only item
62 -- is a DocMonospaced and make it into a DocCodeBlock
63 docParagraph :: HsDoc id -> HsDoc id
64 docParagraph (DocMonospaced p)
65   = DocCodeBlock p
66 docParagraph (DocAppend (DocString s1) (DocMonospaced p))
67   | all isSpace s1
68   = DocCodeBlock p
69 docParagraph (DocAppend (DocString s1)
70     (DocAppend (DocMonospaced p) (DocString s2)))
71   | all isSpace s1 && all isSpace s2
72   = DocCodeBlock p
73 docParagraph (DocAppend (DocMonospaced p) (DocString s2))
74   | all isSpace s2
75   = DocCodeBlock p
76 docParagraph p
77   = DocParagraph p