Fixed warnings in hsSyn/HsDoc
[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 -- XXX This define is a bit of a hack, and should be done more nicely
10 #define FAST_STRING_NOT_NEEDED 1
11 #include "HsVersions.h"
12
13 import Outputable
14 import SrcLoc
15
16 import Data.Char (isSpace)
17
18 data HsDoc id
19   = DocEmpty
20   | DocAppend (HsDoc id) (HsDoc id)
21   | DocString String
22   | DocParagraph (HsDoc id)
23   | DocIdentifier [id]
24   | DocModule String
25   | DocEmphasis (HsDoc id)
26   | DocMonospaced (HsDoc id)
27   | DocUnorderedList [HsDoc id]
28   | DocOrderedList [HsDoc id]
29   | DocDefList [(HsDoc id, HsDoc id)]
30   | DocCodeBlock (HsDoc id)
31   | DocURL String
32   | DocPic String
33   | DocAName String
34   deriving (Eq, Show)
35
36 type LHsDoc a = Located (HsDoc a)
37
38 instance Outputable (HsDoc a) where
39   ppr _ = text "<document comment>"
40
41 ppr_mbDoc :: Maybe (LHsDoc a) -> SDoc
42 ppr_mbDoc (Just doc) = ppr doc
43 ppr_mbDoc Nothing    = empty
44
45 -- used to make parsing easier; we group the list items later
46 docAppend :: HsDoc id -> HsDoc id -> HsDoc id
47 docAppend (DocUnorderedList ds1) (DocUnorderedList ds2)
48   = DocUnorderedList (ds1++ds2)
49 docAppend (DocUnorderedList ds1) (DocAppend (DocUnorderedList ds2) d)
50   = DocAppend (DocUnorderedList (ds1++ds2)) d
51 docAppend (DocOrderedList ds1) (DocOrderedList ds2)
52   = DocOrderedList (ds1++ds2)
53 docAppend (DocOrderedList ds1) (DocAppend (DocOrderedList ds2) d)
54   = DocAppend (DocOrderedList (ds1++ds2)) d
55 docAppend (DocDefList ds1) (DocDefList ds2)
56   = DocDefList (ds1++ds2)
57 docAppend (DocDefList ds1) (DocAppend (DocDefList ds2) d)
58   = DocAppend (DocDefList (ds1++ds2)) d
59 docAppend DocEmpty d = d
60 docAppend d DocEmpty = d
61 docAppend d1 d2
62   = DocAppend d1 d2
63
64 -- again to make parsing easier - we spot a paragraph whose only item
65 -- is a DocMonospaced and make it into a DocCodeBlock
66 docParagraph :: HsDoc id -> HsDoc id
67 docParagraph (DocMonospaced p)
68   = DocCodeBlock (docCodeBlock p)
69 docParagraph (DocAppend (DocString s1) (DocMonospaced p))
70   | all isSpace s1
71   = DocCodeBlock (docCodeBlock p)
72 docParagraph (DocAppend (DocString s1)
73     (DocAppend (DocMonospaced p) (DocString s2)))
74   | all isSpace s1 && all isSpace s2
75   = DocCodeBlock (docCodeBlock p)
76 docParagraph (DocAppend (DocMonospaced p) (DocString s2))
77   | all isSpace s2
78   = DocCodeBlock (docCodeBlock p)
79 docParagraph p
80   = DocParagraph p
81
82
83 -- Drop trailing whitespace from @..@ code blocks.  Otherwise this:
84 --
85 --    -- @
86 --    -- foo
87 --    -- @
88 --
89 -- turns into (DocCodeBlock "\nfoo\n ") which when rendered in HTML
90 -- gives an extra vertical space after the code block.  The single space
91 -- on the final line seems to trigger the extra vertical space.
92 --
93 docCodeBlock :: HsDoc id -> HsDoc id
94 docCodeBlock (DocString s)
95   = DocString (reverse $ dropWhile (`elem` " \t") $ reverse s)
96 docCodeBlock (DocAppend l r)
97   = DocAppend l (docCodeBlock r)
98 docCodeBlock d = d