--- /dev/null
+module RnHsDoc ( rnHsDoc, rnLHsDoc, rnMbLHsDoc, rnMbHsDoc ) where
+
+import TcRnMonad ( RnM )
+import RnEnv ( dataTcOccs, lookupGreRn )
+import HsDoc ( HsDoc(..) )
+
+import RdrName ( RdrName, isRdrDataCon, isRdrTc, gre_name )
+import Name ( Name )
+import SrcLoc ( Located(..) )
+import Outputable ( ppr, defaultUserStyle )
+
+import Data.List ( (\\) )
+import Debug.Trace ( trace )
+
+rnMbHsDoc mb_doc = case mb_doc of
+ Just doc -> do
+ doc' <- rnHsDoc doc
+ return (Just doc')
+ Nothing -> return Nothing
+
+rnMbLHsDoc mb_doc = case mb_doc of
+ Just doc -> do
+ doc' <- rnLHsDoc doc
+ return (Just doc')
+ Nothing -> return Nothing
+
+rnLHsDoc (L pos doc) = do
+ doc' <- rnHsDoc doc
+ return (L pos doc')
+
+ids2string [] = []
+ids2string (x:_) = show $ ppr x defaultUserStyle
+
+rnHsDoc :: HsDoc RdrName -> RnM (HsDoc Name)
+rnHsDoc doc = case doc of
+
+ DocEmpty -> return DocEmpty
+
+ DocAppend a b -> do
+ a' <- rnHsDoc a
+ b' <- rnHsDoc b
+ return (DocAppend a' b')
+
+ DocString str -> return (DocString str)
+
+ DocParagraph doc -> do
+ doc' <- rnHsDoc doc
+ return (DocParagraph doc')
+
+ DocIdentifier ids -> do
+ let choices = concatMap dataTcOccs ids
+ mb_gres <- mapM lookupGreRn choices
+ case [gre_name gre | Just gre <- mb_gres] of
+ [] -> return (DocString (ids2string ids))
+ ids' -> return (DocIdentifier ids')
+
+ DocModule str -> return (DocModule str)
+
+ DocEmphasis doc -> do
+ doc' <- rnHsDoc doc
+ return (DocEmphasis doc')
+
+ DocMonospaced doc -> do
+ doc' <- rnHsDoc doc
+ return (DocMonospaced doc')
+
+ DocUnorderedList docs -> do
+ docs' <- mapM rnHsDoc docs
+ return (DocUnorderedList docs')
+
+ DocOrderedList docs -> do
+ docs' <- mapM rnHsDoc docs
+ return (DocOrderedList docs')
+
+ DocDefList list -> do
+ list' <- mapM (\(a,b) -> do
+ a' <- rnHsDoc a
+ b' <- rnHsDoc b
+ return (a', b')) list
+ return (DocDefList list')
+
+ DocCodeBlock doc -> do
+ doc' <- rnHsDoc doc
+ return (DocCodeBlock doc')
+
+ DocURL str -> return (DocURL str)
+
+ DocAName str -> return (DocAName str)