X-Git-Url: http://git.megacz.com/?p=ghc-hetmet.git;a=blobdiff_plain;f=compiler%2FhsSyn%2FHsDoc.hs;fp=compiler%2FhsSyn%2FHsDoc.hs;h=51ef579a7588233650eeddae10820ae686bdcd04;hp=0000000000000000000000000000000000000000;hb=190f24892156953d73b55401d0467a6f1a88ce5d;hpb=aa8e9422469f1ccb3c52444fa56aae34de799334 diff --git a/compiler/hsSyn/HsDoc.hs b/compiler/hsSyn/HsDoc.hs new file mode 100644 index 0000000..51ef579 --- /dev/null +++ b/compiler/hsSyn/HsDoc.hs @@ -0,0 +1,77 @@ +module HsDoc ( + HsDoc(..), + LHsDoc, + docAppend, + docParagraph, + ppr_mbDoc + ) where + +#include "HsVersions.h" + +import RdrName +import Outputable +import SrcLoc + +import Data.Char (isSpace) + +data HsDoc id + = DocEmpty + | DocAppend (HsDoc id) (HsDoc id) + | DocString String + | DocParagraph (HsDoc id) + | DocIdentifier [id] + | DocModule String + | DocEmphasis (HsDoc id) + | DocMonospaced (HsDoc id) + | DocUnorderedList [HsDoc id] + | DocOrderedList [HsDoc id] + | DocDefList [(HsDoc id, HsDoc id)] + | DocCodeBlock (HsDoc id) + | DocURL String + | DocAName String + deriving (Eq, Show) + +type LHsDoc a = Located (HsDoc a) + +instance Outputable (HsDoc a) where + ppr _ = text "" + +ppr_mbDoc (Just doc) = ppr doc +ppr_mbDoc Nothing = empty + +-- used to make parsing easier; we group the list items later +docAppend :: HsDoc id -> HsDoc id -> HsDoc id +docAppend (DocUnorderedList ds1) (DocUnorderedList ds2) + = DocUnorderedList (ds1++ds2) +docAppend (DocUnorderedList ds1) (DocAppend (DocUnorderedList ds2) d) + = DocAppend (DocUnorderedList (ds1++ds2)) d +docAppend (DocOrderedList ds1) (DocOrderedList ds2) + = DocOrderedList (ds1++ds2) +docAppend (DocOrderedList ds1) (DocAppend (DocOrderedList ds2) d) + = DocAppend (DocOrderedList (ds1++ds2)) d +docAppend (DocDefList ds1) (DocDefList ds2) + = DocDefList (ds1++ds2) +docAppend (DocDefList ds1) (DocAppend (DocDefList ds2) d) + = DocAppend (DocDefList (ds1++ds2)) d +docAppend DocEmpty d = d +docAppend d DocEmpty = d +docAppend d1 d2 + = DocAppend d1 d2 + +-- again to make parsing easier - we spot a paragraph whose only item +-- is a DocMonospaced and make it into a DocCodeBlock +docParagraph :: HsDoc id -> HsDoc id +docParagraph (DocMonospaced p) + = DocCodeBlock p +docParagraph (DocAppend (DocString s1) (DocMonospaced p)) + | all isSpace s1 + = DocCodeBlock p +docParagraph (DocAppend (DocString s1) + (DocAppend (DocMonospaced p) (DocString s2))) + | all isSpace s1 && all isSpace s2 + = DocCodeBlock p +docParagraph (DocAppend (DocMonospaced p) (DocString s2)) + | all isSpace s2 + = DocCodeBlock p +docParagraph p + = DocParagraph p