From 143094b0badbeb217e33e7da4ad4ba669c4e7bd5 Mon Sep 17 00:00:00 2001
From: Alec Theriault <alec.theriault@gmail.com>
Date: Mon, 7 May 2018 18:53:15 -0700
Subject: Filter out CRLFs in hyperlinker backend (#813)

This prevents spurious lines from appearing in the final output.
---
 haddock-api/src/Haddock/Backends/Hyperlinker/Parser.hs | 9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)

(limited to 'haddock-api')

diff --git a/haddock-api/src/Haddock/Backends/Hyperlinker/Parser.hs b/haddock-api/src/Haddock/Backends/Hyperlinker/Parser.hs
index 34512de8..277634b9 100644
--- a/haddock-api/src/Haddock/Backends/Hyperlinker/Parser.hs
+++ b/haddock-api/src/Haddock/Backends/Hyperlinker/Parser.hs
@@ -24,8 +24,13 @@ import Haddock.Backends.Hyperlinker.Types as T
 -- (In reality, this only holds for input not containing '\r', '\t', '\f', '\v',
 -- characters, since GHC transforms those into ' ' and '\n')
 parse :: DynFlags -> FilePath -> String -> [T.Token]
-parse dflags fp s = ghcToks (processCPP dflags fp s)
-
+parse dflags fp = ghcToks . processCPP dflags fp . filterCRLF
+  where
+    -- Remove CRLFs from source
+    filterCRLF :: String -> String
+    filterCRLF ('\r':'\n':cs) = '\n' : filterCRLF cs
+    filterCRLF (c:cs) = c : filterCRLF cs
+    filterCRLF [] = []
 
 -- | Parse the source into tokens using the GHC lexer.
 --
-- 
cgit v1.2.3


From 22bfe0a50a63fa2685ed94bd7f3d1ab565f31f6a Mon Sep 17 00:00:00 2001
From: Alec Theriault <alec.theriault@gmail.com>
Date: Tue, 8 May 2018 02:15:45 -0700
Subject: Remove 'TokenGroup' from Hyperlinker (#818)

Since the hyperlinker backend now relies on the GHC tokenizer, something
like 'Bar.Baz.foo' already gets bunched together into one token (as
opposed to being spread across 'Bar', '.', 'Baz', '.', and 'foo').
---
 .../src/Haddock/Backends/Hyperlinker/Renderer.hs   | 64 +++++-----------------
 1 file changed, 14 insertions(+), 50 deletions(-)

(limited to 'haddock-api')

diff --git a/haddock-api/src/Haddock/Backends/Hyperlinker/Renderer.hs b/haddock-api/src/Haddock/Backends/Hyperlinker/Renderer.hs
index 5291220a..d7ea70a6 100644
--- a/haddock-api/src/Haddock/Backends/Hyperlinker/Renderer.hs
+++ b/haddock-api/src/Haddock/Backends/Hyperlinker/Renderer.hs
@@ -1,6 +1,5 @@
 {-# LANGUAGE RecordWildCards #-}
 
-
 module Haddock.Backends.Hyperlinker.Renderer (render) where
 
 
@@ -28,36 +27,10 @@ render :: Maybe FilePath -> Maybe FilePath -> SrcMap -> [RichToken]
        -> Html
 render mcss mjs srcs tokens = header mcss mjs <> body srcs tokens
 
-
-data TokenGroup
-    = GrpNormal Token
-    | GrpRich TokenDetails [Token]
-
-
--- | Group consecutive tokens pointing to the same element.
---
--- We want to render qualified identifiers as one entity. For example,
--- @Bar.Baz.foo@ consists of 5 tokens (@Bar@, @.@, @Baz@, @.@, @foo@) but for
--- better user experience when highlighting and clicking links, these tokens
--- should be regarded as one identifier. Therefore, before rendering we must
--- group consecutive elements pointing to the same 'GHC.Name' (note that even
--- dot token has it if it is part of qualified name).
-groupTokens :: [RichToken] -> [TokenGroup]
-groupTokens [] = []
-groupTokens ((RichToken tok Nothing):rest) = (GrpNormal tok):(groupTokens rest)
-groupTokens ((RichToken tok (Just det)):rest) =
-    let (grp, rest') = span same rest
-    in (GrpRich det (tok:(map rtkToken grp))):(groupTokens rest')
-  where
-    same (RichToken _ (Just det')) = det == det'
-    same _ = False
-
-
 body :: SrcMap -> [RichToken] -> Html
-body srcs tokens =
-    Html.body . Html.pre $ hypsrc
+body srcs tokens = Html.body . Html.pre $ hypsrc
   where
-    hypsrc = mconcat . map (tokenGroup srcs) . groupTokens $ tokens
+    hypsrc = mconcat . map (richToken srcs) $ tokens
 
 
 header :: Maybe FilePath -> Maybe FilePath -> Html
@@ -78,29 +51,20 @@ header mcss mjs =
         , Html.src scriptFile
         ]
 
-
-tokenGroup :: SrcMap -> TokenGroup -> Html
-tokenGroup _ (GrpNormal tok@(Token { .. }))
+-- | Given information about the source position of definitions, render a token
+richToken :: SrcMap -> RichToken -> Html
+richToken srcs (RichToken Token{..} details)
     | tkType == TkSpace = renderSpace (GHC.srcSpanStartLine tkSpan) tkValue
-    | otherwise = tokenSpan tok ! attrs
-  where
-    attrs = [ multiclass . tokenStyle $ tkType ]
-tokenGroup srcs (GrpRich det tokens) =
-    externalAnchor det . internalAnchor det . hyperlink srcs det $ content
+    | otherwise = linked content
   where
-    content = mconcat . map (richToken det) $ tokens
-
-
-richToken :: TokenDetails -> Token -> Html
-richToken det tok =
-    tokenSpan tok ! [ multiclass style ]
-  where
-    style = (tokenStyle . tkType) tok ++ richTokenStyle det
-
-
-tokenSpan :: Token -> Html
-tokenSpan = Html.thespan . Html.toHtml . tkValue
-
+    content = tokenSpan ! [ multiclass style ]
+    tokenSpan = Html.thespan (Html.toHtml tkValue)
+    style = tokenStyle tkType ++ maybe [] richTokenStyle details
+
+    -- If we have name information, we can make links
+    linked = case details of
+      Just d -> externalAnchor d . internalAnchor d . hyperlink srcs d
+      Nothing -> id
 
 richTokenStyle :: TokenDetails -> [StyleClass]
 richTokenStyle (RtkVar _) = ["hs-var"]
-- 
cgit v1.2.3


From a8840a37976209c5a3c4cf929eff502cdca80ecf Mon Sep 17 00:00:00 2001
From: Simon Jakobi <simon.jakobi@gmail.com>
Date: Tue, 8 May 2018 19:48:11 +0200
Subject: Renamer: Warn about out of scope identifiers. (#819)

---
 haddock-api/src/Haddock/Interface/LexParseRn.hs | 17 +++++++++++------
 1 file changed, 11 insertions(+), 6 deletions(-)

(limited to 'haddock-api')

diff --git a/haddock-api/src/Haddock/Interface/LexParseRn.hs b/haddock-api/src/Haddock/Interface/LexParseRn.hs
index 9a978f9f..cbe55dc4 100644
--- a/haddock-api/src/Haddock/Interface/LexParseRn.hs
+++ b/haddock-api/src/Haddock/Interface/LexParseRn.hs
@@ -104,7 +104,9 @@ rename dflags gre = rn
           -- We found no names in the env so we start guessing.
           [] ->
             case choices of
+              -- This shouldn't happen as 'dataTcOccs' always returns at least its input.
               [] -> pure (DocMonospaced (DocString (showPpr dflags x)))
+
               -- There was nothing in the environment so we need to
               -- pick some default from what's available to us. We
               -- diverge here from the old way where we would default
@@ -113,7 +115,7 @@ rename dflags gre = rn
               -- type constructor names (such as in #253). So now we
               -- only get type constructor links if they are actually
               -- in scope.
-              a:_ -> pure (outOfScope dflags a)
+              a:_ -> outOfScope dflags a
 
           -- There is only one name in the environment that matches so
           -- use it.
@@ -154,12 +156,15 @@ rename dflags gre = rn
 -- users shouldn't rely on this doing the right thing. See tickets
 -- #253 and #375 on the confusion this causes depending on which
 -- default we pick in 'rename'.
-outOfScope :: DynFlags -> RdrName -> Doc a
+outOfScope :: DynFlags -> RdrName -> ErrMsgM (Doc a)
 outOfScope dflags x =
   case x of
-    Unqual occ -> monospaced occ
-    Qual mdl occ -> DocIdentifierUnchecked (mdl, occ)
-    Orig _ occ -> monospaced occ
-    Exact name -> monospaced name  -- Shouldn't happen since x is out of scope
+    Unqual occ -> warnAndMonospace occ
+    Qual mdl occ -> pure (DocIdentifierUnchecked (mdl, occ))
+    Orig _ occ -> warnAndMonospace occ
+    Exact name -> warnAndMonospace name  -- Shouldn't happen since x is out of scope
   where
+    warnAndMonospace a = do
+      tell ["Warning: '" ++ showPpr dflags a ++ "' is out of scope."]
+      pure (monospaced a)
     monospaced a = DocMonospaced (DocString (showPpr dflags a))
-- 
cgit v1.2.3


From 00ccfecdfedb55d44c84dfa4f0f1de90cfe6fafd Mon Sep 17 00:00:00 2001
From: Ryan Scott <ryan.gl.scott@gmail.com>
Date: Thu, 10 May 2018 11:19:47 -0400
Subject: Remove Hoogle backend hack that butchers infix datatype names

---
 haddock-api/src/Haddock/Backends/Hoogle.hs | 3 +--
 hoogle-test/ref/Bug825/test.txt            | 9 +++++++++
 hoogle-test/src/Bug825/Bug825.hs           | 6 ++++++
 3 files changed, 16 insertions(+), 2 deletions(-)
 create mode 100644 hoogle-test/ref/Bug825/test.txt
 create mode 100644 hoogle-test/src/Bug825/Bug825.hs

(limited to 'haddock-api')

diff --git a/haddock-api/src/Haddock/Backends/Hoogle.hs b/haddock-api/src/Haddock/Backends/Hoogle.hs
index e7ce9d30..484841ba 100644
--- a/haddock-api/src/Haddock/Backends/Hoogle.hs
+++ b/haddock-api/src/Haddock/Backends/Hoogle.hs
@@ -225,11 +225,10 @@ ppData dflags decl@(DataDecl { tcdDataDefn = defn }) subdocs
 
         -- GHC gives out "data Bar =", we want to delete the equals
         -- also writes data : a b, when we want data (:) a b
-        showData d = unwords $ map f $ if last xs == "=" then init xs else xs
+        showData d = unwords $ if last xs == "=" then init xs else xs
             where
                 xs = words $ out dflags d
                 nam = out dflags $ tyClDeclLName d
-                f w = if w == nam then operator nam else w
 ppData _ _ _ = panic "ppData"
 
 -- | for constructors, and named-fields...
diff --git a/hoogle-test/ref/Bug825/test.txt b/hoogle-test/ref/Bug825/test.txt
new file mode 100644
index 00000000..a88202dc
--- /dev/null
+++ b/hoogle-test/ref/Bug825/test.txt
@@ -0,0 +1,9 @@
+-- Hoogle documentation, generated by Haddock
+-- See Hoogle, http://www.haskell.org/hoogle/
+
+@package test
+@version 0.0.0
+
+module Bug825
+data a :~: b
+data (:~~:) a b
diff --git a/hoogle-test/src/Bug825/Bug825.hs b/hoogle-test/src/Bug825/Bug825.hs
new file mode 100644
index 00000000..bfe07139
--- /dev/null
+++ b/hoogle-test/src/Bug825/Bug825.hs
@@ -0,0 +1,6 @@
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE TypeOperators #-}
+module Bug825 where
+
+data a :~: b
+data (:~~:) a b
-- 
cgit v1.2.3


From 72ff1ba81d29613c8336a7a88c3a01ae540d81d0 Mon Sep 17 00:00:00 2001
From: Ryan Scott <ryan.gl.scott@gmail.com>
Date: Thu, 10 May 2018 11:24:38 -0400
Subject: Wibbles

---
 haddock-api/src/Haddock/Backends/Hoogle.hs | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

(limited to 'haddock-api')

diff --git a/haddock-api/src/Haddock/Backends/Hoogle.hs b/haddock-api/src/Haddock/Backends/Hoogle.hs
index 484841ba..59a4f53c 100644
--- a/haddock-api/src/Haddock/Backends/Hoogle.hs
+++ b/haddock-api/src/Haddock/Backends/Hoogle.hs
@@ -223,12 +223,12 @@ ppData dflags decl@(DataDecl { tcdDataDefn = defn }) subdocs
       concatMap (ppCtor dflags decl subdocs . unL) (dd_cons defn)
     where
 
-        -- GHC gives out "data Bar =", we want to delete the equals
-        -- also writes data : a b, when we want data (:) a b
+        -- GHC gives out "data Bar =", we want to delete the equals.
+        -- There's no need to worry about parenthesizing infix data type names,
+        -- since this Outputable instance for TyClDecl gets this right already.
         showData d = unwords $ if last xs == "=" then init xs else xs
             where
                 xs = words $ out dflags d
-                nam = out dflags $ tyClDeclLName d
 ppData _ _ _ = panic "ppData"
 
 -- | for constructors, and named-fields...
-- 
cgit v1.2.3


From 4f148a9282491d7c9d6fa87dc01e4be4acdec13f Mon Sep 17 00:00:00 2001
From: Alec Theriault <alec.theriault@gmail.com>
Date: Wed, 23 May 2018 02:29:05 -0700
Subject: Use `ClassOpSig` instead of `TypeSig` for class methods (#835)

* Fix minimal pragma handling

Class declarations contain 'ClassOpSig' not 'Typesig'. This should fix #834.

* Accept html-test output
---
 haddock-api/src/Haddock/Backends/Xhtml/Decl.hs |  8 ++--
 html-test/ref/Bug26.html                       | 14 +++----
 html-test/ref/Bug613.html                      | 14 +++----
 html-test/ref/Bug647.html                      |  8 ----
 html-test/ref/Bug679.html                      |  8 ----
 html-test/ref/DeprecatedClass.html             | 28 +++++--------
 html-test/ref/Hash.html                        | 16 ++++---
 html-test/ref/Instances.html                   | 24 +++++++++++
 html-test/ref/Minimal.html                     | 36 +++++++++++-----
 html-test/ref/Operators.html                   | 34 +++++++--------
 html-test/ref/OrphanInstancesClass.html        |  8 ----
 html-test/ref/Test.html                        | 58 ++++++++++++--------------
 html-test/ref/Ticket61.html                    |  8 ----
 13 files changed, 124 insertions(+), 140 deletions(-)

(limited to 'haddock-api')

diff --git a/haddock-api/src/Haddock/Backends/Xhtml/Decl.hs b/haddock-api/src/Haddock/Backends/Xhtml/Decl.hs
index 815ecee9..1daf9ace 100644
--- a/haddock-api/src/Haddock/Backends/Xhtml/Decl.hs
+++ b/haddock-api/src/Haddock/Backends/Xhtml/Decl.hs
@@ -475,9 +475,9 @@ ppShortClassDecl summary links (ClassDecl { tcdCtxt = lctxt, tcdLName = lname, t
 
                 -- ToDo: add associated type defaults
 
-            [ ppFunSig summary links loc doc names (hsSigWcType typ)
+            [ ppFunSig summary links loc doc names (hsSigType typ)
                        [] splice unicode pkg qual
-              | L _ (TypeSig lnames typ) <- sigs
+              | L _ (ClassOpSig False lnames typ) <- sigs
               , let doc = lookupAnySubdoc (head names) subdocs
                     names = map unLoc lnames ]
               -- FIXME: is taking just the first name ok? Is it possible that
@@ -537,12 +537,12 @@ ppClassDecl summary links instances fixities loc d subdocs
     minimalBit = case [ s | MinimalSig _ (L _ s) <- sigs ] of
       -- Miminal complete definition = every shown method
       And xs : _ | sort [getName n | L _ (Var (L _ n)) <- xs] ==
-                   sort [getName n | TypeSig ns _ <- sigs, L _ n <- ns]
+                   sort [getName n | ClassOpSig _ ns _ <- sigs, L _ n <- ns]
         -> noHtml
 
       -- Minimal complete definition = the only shown method
       Var (L _ n) : _ | [getName n] ==
-                        [getName n' | L _ (TypeSig ns _) <- lsigs, L _ n' <- ns]
+                        [getName n' | L _ (ClassOpSig _ ns _) <- lsigs, L _ n' <- ns]
         -> noHtml
 
       -- Minimal complete definition = nothing
diff --git a/html-test/ref/Bug26.html b/html-test/ref/Bug26.html
index e50169ba..a363fef3 100644
--- a/html-test/ref/Bug26.html
+++ b/html-test/ref/Bug26.html
@@ -71,7 +71,11 @@
 	      > a <span class="keyword"
 	      >where</span
 	      ><ul class="subs"
-	      ></ul
+	      ><li
+		><a href="#"
+		  >c_f</a
+		  > :: a</li
+		></ul
 	      ></li
 	    ></ul
 	  ></details
@@ -126,14 +130,6 @@
 	      >Since: 1.0</em
 	      ></p
 	    ></div
-	  ><div class="subs minimal"
-	  ><p class="caption"
-	    >Minimal complete definition</p
-	    ><p class="src"
-	    ><a href="#" title="Bug26"
-	      >c_f</a
-	      ></p
-	    ></div
 	  ><div class="subs methods"
 	  ><p class="caption"
 	    >Methods</p
diff --git a/html-test/ref/Bug613.html b/html-test/ref/Bug613.html
index 12717922..71e30832 100644
--- a/html-test/ref/Bug613.html
+++ b/html-test/ref/Bug613.html
@@ -51,7 +51,11 @@
 	      > f <span class="keyword"
 	      >where</span
 	      ><ul class="subs"
-	      ></ul
+	      ><li
+		><a href="#"
+		  >fmap</a
+		  > :: (a -&gt; b) -&gt; f a -&gt; f b</li
+		></ul
 	      ></li
 	    ><li class="src short"
 	    ><span class="keyword"
@@ -78,14 +82,6 @@
 	    > <a href="#" class="selflink"
 	    >#</a
 	    ></p
-	  ><div class="subs minimal"
-	  ><p class="caption"
-	    >Minimal complete definition</p
-	    ><p class="src"
-	    ><a href="#" title="Bug613"
-	      >fmap</a
-	      ></p
-	    ></div
 	  ><div class="subs methods"
 	  ><p class="caption"
 	    >Methods</p
diff --git a/html-test/ref/Bug647.html b/html-test/ref/Bug647.html
index 3375546d..0928c1ec 100644
--- a/html-test/ref/Bug647.html
+++ b/html-test/ref/Bug647.html
@@ -52,14 +52,6 @@
 	    > <a href="#" class="selflink"
 	    >#</a
 	    ></p
-	  ><div class="subs minimal"
-	  ><p class="caption"
-	    >Minimal complete definition</p
-	    ><p class="src"
-	    ><a href="#" title="Bug647"
-	      >f</a
-	      ></p
-	    ></div
 	  ><div class="subs methods"
 	  ><p class="caption"
 	    >Methods</p
diff --git a/html-test/ref/Bug679.html b/html-test/ref/Bug679.html
index 093c9046..71eb9360 100644
--- a/html-test/ref/Bug679.html
+++ b/html-test/ref/Bug679.html
@@ -126,14 +126,6 @@
 	    > <a href="#" class="selflink"
 	    >#</a
 	    ></p
-	  ><div class="subs minimal"
-	  ><p class="caption"
-	    >Minimal complete definition</p
-	    ><p class="src"
-	    ><a href="#" title="Bug679"
-	      >foo</a
-	      ></p
-	    ></div
 	  ><div class="subs methods"
 	  ><p class="caption"
 	    >Methods</p
diff --git a/html-test/ref/DeprecatedClass.html b/html-test/ref/DeprecatedClass.html
index fc78c987..55abc489 100644
--- a/html-test/ref/DeprecatedClass.html
+++ b/html-test/ref/DeprecatedClass.html
@@ -51,7 +51,11 @@
 	      > a <span class="keyword"
 	      >where</span
 	      ><ul class="subs"
-	      ></ul
+	      ><li
+		><a href="#"
+		  >foo</a
+		  > :: a -&gt; a</li
+		></ul
 	      ></li
 	    ><li class="src short"
 	    ><span class="keyword"
@@ -61,7 +65,11 @@
 	      > a <span class="keyword"
 	      >where</span
 	      ><ul class="subs"
-	      ></ul
+	      ><li
+		><a href="#"
+		  >bar</a
+		  > :: a -&gt; a</li
+		></ul
 	      ></li
 	    ></ul
 	  ></details
@@ -88,14 +96,6 @@
 	    ><p
 	    >some class</p
 	    ></div
-	  ><div class="subs minimal"
-	  ><p class="caption"
-	    >Minimal complete definition</p
-	    ><p class="src"
-	    ><a href="#" title="DeprecatedClass"
-	      >foo</a
-	      ></p
-	    ></div
 	  ><div class="subs methods"
 	  ><p class="caption"
 	    >Methods</p
@@ -132,14 +132,6 @@
 	      >Deprecated: SomeOtherClass</p
 	      ></div
 	    ></div
-	  ><div class="subs minimal"
-	  ><p class="caption"
-	    >Minimal complete definition</p
-	    ><p class="src"
-	    ><a href="#" title="DeprecatedClass"
-	      >bar</a
-	      ></p
-	    ></div
 	  ><div class="subs methods"
 	  ><p class="caption"
 	    >Methods</p
diff --git a/html-test/ref/Hash.html b/html-test/ref/Hash.html
index 8c48cee4..517428fa 100644
--- a/html-test/ref/Hash.html
+++ b/html-test/ref/Hash.html
@@ -126,7 +126,13 @@
 	      > a <span class="keyword"
 	      >where</span
 	      ><ul class="subs"
-	      ></ul
+	      ><li
+		><a href="#"
+		  >hash</a
+		  > :: a -&gt; <a href="#" title="Data.Int"
+		  >Int</a
+		  ></li
+		></ul
 	      ></li
 	    ></ul
 	  ></details
@@ -259,14 +265,6 @@
 	  ><p
 	    >A class of types which can be hashed.</p
 	    ></div
-	  ><div class="subs minimal"
-	  ><p class="caption"
-	    >Minimal complete definition</p
-	    ><p class="src"
-	    ><a href="#" title="Hash"
-	      >hash</a
-	      ></p
-	    ></div
 	  ><div class="subs methods"
 	  ><p class="caption"
 	    >Methods</p
diff --git a/html-test/ref/Instances.html b/html-test/ref/Instances.html
index 3dc26133..1b4f276f 100644
--- a/html-test/ref/Instances.html
+++ b/html-test/ref/Instances.html
@@ -146,6 +146,12 @@
 	    > <a href="#" class="selflink"
 	    >#</a
 	    ></p
+	  ><div class="subs minimal"
+	  ><p class="caption"
+	    >Minimal complete definition</p
+	    ><p class="src"
+	    >Nothing</p
+	    ></div
 	  ><div class="subs methods"
 	  ><p class="caption"
 	    >Methods</p
@@ -642,6 +648,12 @@
 	    > <a href="#" class="selflink"
 	    >#</a
 	    ></p
+	  ><div class="subs minimal"
+	  ><p class="caption"
+	    >Minimal complete definition</p
+	    ><p class="src"
+	    >Nothing</p
+	    ></div
 	  ><div class="subs methods"
 	  ><p class="caption"
 	    >Methods</p
@@ -1196,6 +1208,12 @@
 	    > <a href="#" class="selflink"
 	    >#</a
 	    ></p
+	  ><div class="subs minimal"
+	  ><p class="caption"
+	    >Minimal complete definition</p
+	    ><p class="src"
+	    >Nothing</p
+	    ></div
 	  ><div class="subs methods"
 	  ><p class="caption"
 	    >Methods</p
@@ -1922,6 +1940,12 @@
 	    > <a href="#" class="selflink"
 	    >#</a
 	    ></p
+	  ><div class="subs minimal"
+	  ><p class="caption"
+	    >Minimal complete definition</p
+	    ><p class="src"
+	    >Nothing</p
+	    ></div
 	  ><div class="subs associated-types"
 	  ><p class="caption"
 	    >Associated Types</p
diff --git a/html-test/ref/Minimal.html b/html-test/ref/Minimal.html
index 5fe252ba..bc2da115 100644
--- a/html-test/ref/Minimal.html
+++ b/html-test/ref/Minimal.html
@@ -128,6 +128,26 @@
 	    > <a href="#" class="selflink"
 	    >#</a
 	    ></p
+	  ><div class="subs minimal"
+	  ><p class="caption"
+	    >Minimal complete definition</p
+	    ><p class="src"
+	    >(<a href="#" title="Minimal"
+	      >a</a
+	      >, <a href="#" title="Minimal"
+	      >b</a
+	      >, <a href="#" title="Minimal"
+	      >c</a
+	      > | (<a href="#" title="Minimal"
+	      >d</a
+	      > | <a href="#" title="Minimal"
+	      >e</a
+	      >, (<a href="#" title="Minimal"
+	      >f</a
+	      > | <a href="#" title="Minimal"
+	      >g</a
+	      >)))</p
+	    ></div
 	  ><div class="subs methods"
 	  ><p class="caption"
 	    >Methods</p
@@ -230,16 +250,6 @@
 	    > <a href="#" class="selflink"
 	    >#</a
 	    ></p
-	  ><div class="subs minimal"
-	  ><p class="caption"
-	    >Minimal complete definition</p
-	    ><p class="src"
-	    ><a href="#" title="Minimal"
-	      >aaa</a
-	      >, <a href="#" title="Minimal"
-	      >bbb</a
-	      ></p
-	    ></div
 	  ><div class="subs methods"
 	  ><p class="caption"
 	    >Methods</p
@@ -298,6 +308,12 @@
 	    > <a href="#" class="selflink"
 	    >#</a
 	    ></p
+	  ><div class="subs minimal"
+	  ><p class="caption"
+	    >Minimal complete definition</p
+	    ><p class="src"
+	    >Nothing</p
+	    ></div
 	  ><div class="subs methods"
 	  ><p class="caption"
 	    >Methods</p
diff --git a/html-test/ref/Operators.html b/html-test/ref/Operators.html
index 075affab..26b7e7f0 100644
--- a/html-test/ref/Operators.html
+++ b/html-test/ref/Operators.html
@@ -145,6 +145,22 @@
 		  > a <a href="#"
 		  >&gt;&lt;&lt;</a
 		  > b</li
+		><li
+		><a href="#"
+		  >(&gt;&gt;&lt;)</a
+		  >, <a href="#"
+		  >(&lt;&lt;&gt;)</a
+		  > :: a -&gt; b -&gt; ()</li
+		><li
+		><a href="#"
+		  >(**&gt;)</a
+		  >, <a href="#"
+		  >(**&lt;)</a
+		  >, <a href="#"
+		  >(&gt;**)</a
+		  >, <a href="#"
+		  >(&lt;**)</a
+		  > :: a -&gt; a -&gt; ()</li
 		></ul
 	      ></li
 	    ><li class="src short"
@@ -376,24 +392,6 @@
 	  ><p
 	    >Class with fixity, including associated types</p
 	    ></div
-	  ><div class="subs minimal"
-	  ><p class="caption"
-	    >Minimal complete definition</p
-	    ><p class="src"
-	    ><a href="#" title="Operators"
-	      >(&gt;&gt;&lt;)</a
-	      >, <a href="#" title="Operators"
-	      >(&lt;&lt;&gt;)</a
-	      >, <a href="#" title="Operators"
-	      >(**&gt;)</a
-	      >, <a href="#" title="Operators"
-	      >(**&lt;)</a
-	      >, <a href="#" title="Operators"
-	      >(&gt;**)</a
-	      >, <a href="#" title="Operators"
-	      >(&lt;**)</a
-	      ></p
-	    ></div
 	  ><div class="subs associated-types"
 	  ><p class="caption"
 	    >Associated Types</p
diff --git a/html-test/ref/OrphanInstancesClass.html b/html-test/ref/OrphanInstancesClass.html
index 7b7085ea..81651e18 100644
--- a/html-test/ref/OrphanInstancesClass.html
+++ b/html-test/ref/OrphanInstancesClass.html
@@ -52,14 +52,6 @@
 	    > <a href="#" class="selflink"
 	    >#</a
 	    ></p
-	  ><div class="subs minimal"
-	  ><p class="caption"
-	    >Minimal complete definition</p
-	    ><p class="src"
-	    ><a href="#" title="OrphanInstancesClass"
-	      >aClass</a
-	      ></p
-	    ></div
 	  ><div class="subs methods"
 	  ><p class="caption"
 	    >Methods</p
diff --git a/html-test/ref/Test.html b/html-test/ref/Test.html
index 369541f3..26481afe 100644
--- a/html-test/ref/Test.html
+++ b/html-test/ref/Test.html
@@ -478,7 +478,17 @@
 	      > a <span class="keyword"
 	      >where</span
 	      ><ul class="subs"
-	      ></ul
+	      ><li
+		><a href="#"
+		  >a</a
+		  > :: <a href="#" title="System.IO"
+		  >IO</a
+		  > a</li
+		><li
+		><a href="#"
+		  >b</a
+		  > :: [a]</li
+		></ul
 	      ></li
 	    ><li class="src short"
 	    ><span class="keyword"
@@ -488,7 +498,17 @@
 	      > a <span class="keyword"
 	      >where</span
 	      ><ul class="subs"
-	      ></ul
+	      ><li
+		><a href="#"
+		  >d</a
+		  > :: <a href="#" title="Test"
+		  >T</a
+		  > a b</li
+		><li
+		><a href="#"
+		  >e</a
+		  > :: (a, a)</li
+		></ul
 	      ></li
 	    ><li class="src short"
 	    ><span class="keyword"
@@ -504,7 +524,11 @@
 	      > a <span class="keyword"
 	      >where</span
 	      ><ul class="subs"
-	      ></ul
+	      ><li
+		><a href="#"
+		  >ff</a
+		  > :: a</li
+		></ul
 	      ></li
 	    ><li class="src short"
 	    ><a href="#"
@@ -1558,16 +1582,6 @@
 		></code
 	      > class)</p
 	    ></div
-	  ><div class="subs minimal"
-	  ><p class="caption"
-	    >Minimal complete definition</p
-	    ><p class="src"
-	    ><a href="#" title="Test"
-	      >a</a
-	      >, <a href="#" title="Test"
-	      >b</a
-	      ></p
-	    ></div
 	  ><div class="subs methods"
 	  ><p class="caption"
 	    >Methods</p
@@ -1618,16 +1632,6 @@
 	  ><p
 	    >This is a class declaration with no separate docs for the methods</p
 	    ></div
-	  ><div class="subs minimal"
-	  ><p class="caption"
-	    >Minimal complete definition</p
-	    ><p class="src"
-	    ><a href="#" title="Test"
-	      >d</a
-	      >, <a href="#" title="Test"
-	      >e</a
-	      ></p
-	    ></div
 	  ><div class="subs methods"
 	  ><p class="caption"
 	    >Methods</p
@@ -1790,14 +1794,6 @@
 	    > <a href="#" class="selflink"
 	    >#</a
 	    ></p
-	  ><div class="subs minimal"
-	  ><p class="caption"
-	    >Minimal complete definition</p
-	    ><p class="src"
-	    ><a href="#" title="Test"
-	      >ff</a
-	      ></p
-	    ></div
 	  ><div class="subs methods"
 	  ><p class="caption"
 	    >Methods</p
diff --git a/html-test/ref/Ticket61.html b/html-test/ref/Ticket61.html
index e70ee3bd..9cab5271 100644
--- a/html-test/ref/Ticket61.html
+++ b/html-test/ref/Ticket61.html
@@ -52,14 +52,6 @@
 	    > <a href="#" class="selflink"
 	    >#</a
 	    ></p
-	  ><div class="subs minimal"
-	  ><p class="caption"
-	    >Minimal complete definition</p
-	    ><p class="src"
-	    ><a href="#" title="Ticket61"
-	      >f</a
-	      ></p
-	    ></div
 	  ><div class="subs methods"
 	  ><p class="caption"
 	    >Methods</p
-- 
cgit v1.2.3


From ee1ce11ceaf41d05973bb2c9ca7abd41a2ad078c Mon Sep 17 00:00:00 2001
From: Simon Jakobi <simon.jakobi@gmail.com>
Date: Tue, 5 Jun 2018 19:47:06 +0200
Subject: Bump a few dependency bounds (#845)

---
 haddock-api/haddock-api.cabal         | 6 +++---
 haddock-library/haddock-library.cabal | 8 ++++----
 2 files changed, 7 insertions(+), 7 deletions(-)

(limited to 'haddock-api')

diff --git a/haddock-api/haddock-api.cabal b/haddock-api/haddock-api.cabal
index acb4d9e4..b2d7829c 100644
--- a/haddock-api/haddock-api.cabal
+++ b/haddock-api/haddock-api.cabal
@@ -166,12 +166,12 @@ test-suite spec
     Haddock.Backends.Hyperlinker.Parser
     Haddock.Backends.Hyperlinker.Types
 
-  build-depends: Cabal           ^>= 2.0.0
+  build-depends: Cabal           ^>= 2.2
                , ghc             ^>= 8.4
                , ghc-paths       ^>= 0.1.0.9
                , haddock-library ^>= 1.6.0
                , xhtml           ^>= 3000.2.2
-               , hspec           ^>= 2.4.4
+               , hspec           >= 2.4.4 && < 2.6
                , QuickCheck      ^>= 2.11
 
   -- Versions for the dependencies below are transitively pinned by
@@ -188,7 +188,7 @@ test-suite spec
                , transformers
 
   build-tool-depends:
-    hspec-discover:hspec-discover ^>= 2.4.4
+    hspec-discover:hspec-discover >= 2.4.4 && < 2.6
 
 source-repository head
   type:     git
diff --git a/haddock-library/haddock-library.cabal b/haddock-library/haddock-library.cabal
index 49ec826c..eb961041 100644
--- a/haddock-library/haddock-library.cabal
+++ b/haddock-library/haddock-library.cabal
@@ -72,18 +72,18 @@ test-suite spec
 
   build-depends:
       base         >= 4.5     && < 4.12
-    , base-compat   ^>= 0.9.3
+    , base-compat  >= 0.9.3   && < 0.11
     , bytestring   >= 0.9.2.1 && < 0.11
     , containers   >= 0.4.2.1 && < 0.6
     , transformers   >= 0.3.0   && < 0.6
-    , hspec         ^>= 2.4.4
+    , hspec        >= 2.4.4   && < 2.6
     , QuickCheck    ^>= 2.11
     , text         >= 1.2.3.0  && < 1.3
     , parsec       >= 3.1.13.0 && < 3.2
     , deepseq      >= 1.3     && < 1.5
 
   build-tool-depends:
-    hspec-discover:hspec-discover ^>= 2.4.4
+    hspec-discover:hspec-discover >= 2.4.4 && < 2.6
 
 test-suite fixtures
   type:             exitcode-stdio-1.0
@@ -93,7 +93,7 @@ test-suite fixtures
   hs-source-dirs:   fixtures
   build-depends:
       base         >= 4.5     && < 4.12
-    , base-compat           ^>= 0.9.3
+    , base-compat  >= 0.9.3   && < 0.11
     , directory             ^>= 1.3.0.2
     , filepath              ^>= 1.4.1.2
     , optparse-applicative  ^>= 0.14.0.0
-- 
cgit v1.2.3


From bea565ec5a029b8c19965aa22f34c23a112c0a7f Mon Sep 17 00:00:00 2001
From: Alec Theriault <alec.theriault@gmail.com>
Date: Tue, 5 Jun 2018 10:47:16 -0700
Subject: Improve hyperlinker's 'spanToNewline' (#846)

'spanToNewline' is used to help break apart the source into lines which
can then be partioned into CPP and non-CPP chunks. It is important that
'spanToNewline' not break apart tokens, so it needs to properly handle
things like

  * block comments, possibly nested
  * string literals, possibly multi-line
  * CPP macros, possibly multi-line

String literals in particular were not being properly handled. The fix
is to to fall back in 'Text.Read.lex' to help lex things that are not
comments.

Fixes #837.
---
 .../src/Haddock/Backends/Hyperlinker/Parser.hs     |  32 ++-
 hypsrc-test/ref/src/CPP.html                       | 216 +++++++++++++++++++++
 hypsrc-test/src/CPP.hs                             |  26 +++
 3 files changed, 267 insertions(+), 7 deletions(-)
 create mode 100644 hypsrc-test/ref/src/CPP.html
 create mode 100644 hypsrc-test/src/CPP.hs

(limited to 'haddock-api')

diff --git a/haddock-api/src/Haddock/Backends/Hyperlinker/Parser.hs b/haddock-api/src/Haddock/Backends/Hyperlinker/Parser.hs
index 277634b9..456050d1 100644
--- a/haddock-api/src/Haddock/Backends/Hyperlinker/Parser.hs
+++ b/haddock-api/src/Haddock/Backends/Hyperlinker/Parser.hs
@@ -3,6 +3,8 @@ module Haddock.Backends.Hyperlinker.Parser (parse) where
 import Data.Either         ( isRight, isLeft )
 import Data.List           ( foldl', isPrefixOf, isSuffixOf )
 import Data.Maybe          ( maybeToList )
+import Data.Char           ( isSpace )
+import qualified Text.Read as R
 
 import GHC                 ( DynFlags, addSourceToTokens )
 import SrcLoc
@@ -109,12 +111,9 @@ isCPPline :: String -> Bool
 isCPPline = isPrefixOf "#" . dropWhile (`elem` " \t") . take 5
 
 
--- | Split a "line" off the front of a string, supporting newline escapes.
---
--- By "line", we understand: the shortest substring ending in a '\n' that is not
---
---   1. immediately preceded by a '\\'
---   2. not inside some (possibly nested) block comment
+-- | Split a "line" off the front of a string, hopefully without cutting tokens
+-- in half. I say "hopefully" because knowing what a token is requires lexing,
+-- yet lexing depends on this function.
 --
 -- All characters in the input are present in the output:
 --
@@ -122,17 +121,36 @@ isCPPline = isPrefixOf "#" . dropWhile (`elem` " \t") . take 5
 spanToNewline :: Int                 -- ^ open '{-'
               -> String              -- ^ input
               -> (String, String)
-spanToNewline _ [] = ([], [])
+
+-- Base case and space characters
+spanToNewline _ "" = ("", "")
+spanToNewline n ('\n':str) | n <= 0 = ("\n", str)
 spanToNewline n ('\n':str) | n <= 0 = ("\n", str)
 spanToNewline n ('\\':'\n':str) =
     let (str', rest) = spanToNewline n str
     in ('\\':'\n':str', rest)
+
+-- Block comments
 spanToNewline n ('{':'-':str) =
     let (str', rest) = spanToNewline (n+1) str
     in ('{':'-':str', rest)
 spanToNewline n ('-':'}':str) =
     let (str', rest) = spanToNewline (n-1) str
     in ('-':'}':str', rest)
+
+-- When not in a block comment, try to lex a Haskell token
+spanToNewline 0 str@(c:_) | ((lexed, str') : _) <- R.lex str, not (isSpace c) =
+    if all (== '-') lexed && length lexed >= 2
+      -- A Haskell line comment
+      then case span (/= '\n') str' of
+             (str'', '\n':rest) -> (lexed ++ str'' ++ "\n", rest)
+             (_, _) -> (str, "") 
+
+      -- An actual Haskell token
+      else let (str'', rest) = spanToNewline 0 str'
+           in (lexed ++ str'', rest)
+
+-- In all other cases, advance one character at a time
 spanToNewline n (c:str) =
     let (str', rest) = spanToNewline n str
     in (c:str', rest)
diff --git a/hypsrc-test/ref/src/CPP.html b/hypsrc-test/ref/src/CPP.html
new file mode 100644
index 00000000..fb85bd2f
--- /dev/null
+++ b/hypsrc-test/ref/src/CPP.html
@@ -0,0 +1,216 @@
+<html xmlns="http://www.w3.org/1999/xhtml"
+><head
+  ><link rel="stylesheet" type="text/css" href="style.css"
+     /><script type="text/javascript" src="highlight.js"
+    ></script
+    ></head
+  ><body
+  ><pre
+    ><span class="hs-pragma"
+      >{-# LANGUAGE CPP #-}</span
+      ><span
+      >
+</span
+      ><a name="line-2"
+      ></a
+      ><span class="hs-keyword"
+      >module</span
+      ><span
+      > </span
+      ><span class="hs-identifier"
+      >CPP</span
+      ><span
+      > </span
+      ><span class="hs-keyword"
+      >where</span
+      ><span
+      >
+</span
+      ><a name="line-3"
+      ></a
+      ><span
+      >
+</span
+      ><a name="line-4"
+      ></a
+      ><span class="hs-cpp"
+      >#define SOMETHING1
+</span
+      ><span
+      >
+</span
+      ><a name="line-6"
+      ></a
+      ><span class="hs-identifier"
+      >foo</span
+      ><span
+      > </span
+      ><span class="hs-glyph"
+      >::</span
+      ><span
+      > </span
+      ><span class="hs-identifier hs-type"
+      >String</span
+      ><span
+      >
+</span
+      ><a name="line-7"
+      ></a
+      ><a name="foo"
+      ><a href="CPP.html#foo"
+	><span class="hs-identifier"
+	  >foo</span
+	  ></a
+	></a
+      ><span
+      > </span
+      ><span class="hs-glyph"
+      >=</span
+      ><span
+      > </span
+      ><span class="hs-comment"
+      >{-  &quot; single quotes are fine in block comments
+          {- nested block comments are fine -}
+       -}</span
+      ><span
+      > </span
+      ><span class="hs-string"
+      >&quot;foo&quot;</span
+      ><span
+      >
+</span
+      ><a name="line-10"
+      ></a
+      ><span
+      >
+</span
+      ><a name="line-11"
+      ></a
+      ><span class="hs-cpp"
+      >#define SOMETHING2
+</span
+      ><span
+      >
+</span
+      ><a name="line-13"
+      ></a
+      ><span class="hs-identifier"
+      >bar</span
+      ><span
+      > </span
+      ><span class="hs-glyph"
+      >::</span
+      ><span
+      > </span
+      ><span class="hs-identifier hs-type"
+      >String</span
+      ><span
+      >
+</span
+      ><a name="line-14"
+      ></a
+      ><a name="bar"
+      ><a href="CPP.html#bar"
+	><span class="hs-identifier"
+	  >bar</span
+	  ></a
+	></a
+      ><span
+      > </span
+      ><span class="hs-glyph"
+      >=</span
+      ><span
+      > </span
+      ><span class="hs-string"
+      >&quot;block comment in a string is not a comment {- &quot;</span
+      ><span
+      >
+</span
+      ><a name="line-15"
+      ></a
+      ><span
+      >
+</span
+      ><a name="line-16"
+      ></a
+      ><span class="hs-cpp"
+      >#define SOMETHING3
+</span
+      ><span
+      >
+</span
+      ><a name="line-18"
+      ></a
+      ><span class="hs-comment"
+      >-- &quot; single quotes are fine in line comments</span
+      ><span
+      >
+</span
+      ><a name="line-19"
+      ></a
+      ><span class="hs-comment"
+      >-- {- unclosed block comments are fine in line comments</span
+      ><span
+      >
+</span
+      ><a name="line-20"
+      ></a
+      ><span
+      >
+</span
+      ><a name="line-21"
+      ></a
+      ><span class="hs-comment"
+      >-- Multiline CPP is also fine</span
+      ><span
+      >
+</span
+      ><a name="line-22"
+      ></a
+      ><span class="hs-cpp"
+      >#define FOO\
+  1
+</span
+      ><span
+      >
+</span
+      ><a name="line-25"
+      ></a
+      ><span class="hs-identifier"
+      >baz</span
+      ><span
+      > </span
+      ><span class="hs-glyph"
+      >::</span
+      ><span
+      > </span
+      ><span class="hs-identifier hs-type"
+      >String</span
+      ><span
+      >
+</span
+      ><a name="line-26"
+      ></a
+      ><a name="baz"
+      ><a href="CPP.html#baz"
+	><span class="hs-identifier"
+	  >baz</span
+	  ></a
+	></a
+      ><span
+      > </span
+      ><span class="hs-glyph"
+      >=</span
+      ><span
+      > </span
+      ><span class="hs-string"
+      >&quot;line comment in a string is not a comment --&quot;</span
+      ><span
+      >
+</span
+      ><a name="line-27"
+      ></a
+      ></pre
+    ></body
+  ></html
+>
\ No newline at end of file
diff --git a/hypsrc-test/src/CPP.hs b/hypsrc-test/src/CPP.hs
new file mode 100644
index 00000000..f00ce031
--- /dev/null
+++ b/hypsrc-test/src/CPP.hs
@@ -0,0 +1,26 @@
+{-# LANGUAGE CPP #-}
+module CPP where
+
+#define SOMETHING1
+
+foo :: String
+foo = {-  " single quotes are fine in block comments
+          {- nested block comments are fine -}
+       -} "foo"
+
+#define SOMETHING2
+
+bar :: String
+bar = "block comment in a string is not a comment {- "
+
+#define SOMETHING3
+
+-- " single quotes are fine in line comments
+-- {- unclosed block comments are fine in line comments
+
+-- Multiline CPP is also fine
+#define FOO\
+  1
+
+baz :: String
+baz = "line comment in a string is not a comment --"
-- 
cgit v1.2.3


From ef16b9f8f73e6a4d639919152925ab83d9b1024f Mon Sep 17 00:00:00 2001
From: Simon Jakobi <simon.jakobi@gmail.com>
Date: Fri, 8 Jun 2018 22:20:30 +0200
Subject: Renamer: Warn about ambiguous identifiers (#831)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

* Renamer: Warn about ambiguous identifiers

Example:

    Warning: 'elem' is ambiguous. It is defined
        * in ‘Data.Foldable’
        * at /home/simon/tmp/hdk/src/Lib.hs:7:1
        You may be able to disambiguate the identifier by qualifying it or
        by hiding some imports.
        Defaulting to 'elem' defined at /home/simon/tmp/hdk/src/Lib.hs:7:1

Fixes #830.

* Deduplicate warnings

Fixes #832.
---
 haddock-api/src/Haddock/Interface.hs            |  4 ++--
 haddock-api/src/Haddock/Interface/LexParseRn.hs | 20 +++++++++++++++++---
 2 files changed, 19 insertions(+), 5 deletions(-)

(limited to 'haddock-api')

diff --git a/haddock-api/src/Haddock/Interface.hs b/haddock-api/src/Haddock/Interface.hs
index 89064a6c..a66745ea 100644
--- a/haddock-api/src/Haddock/Interface.hs
+++ b/haddock-api/src/Haddock/Interface.hs
@@ -184,10 +184,10 @@ processModule verbosity modsum flags modMap instIfaceMap = do
 
   if not $ isBootSummary modsum then do
     out verbosity verbose "Creating interface..."
-    (interface, msg) <- {-# SCC createIterface #-}
+    (interface, msgs) <- {-# SCC createIterface #-}
                         withTiming getDynFlags "createInterface" (const ()) $ do
                           runWriterGhc $ createInterface tm flags modMap instIfaceMap
-    liftIO $ mapM_ putStrLn msg
+    liftIO $ mapM_ putStrLn (nub msgs)
     dflags <- getDynFlags
     let (haddockable, haddocked) = ifaceHaddockCoverage interface
         percentage = round (fromIntegral haddocked * 100 / fromIntegral haddockable :: Double) :: Int
diff --git a/haddock-api/src/Haddock/Interface/LexParseRn.hs b/haddock-api/src/Haddock/Interface/LexParseRn.hs
index cbe55dc4..5d3cf2a6 100644
--- a/haddock-api/src/Haddock/Interface/LexParseRn.hs
+++ b/haddock-api/src/Haddock/Interface/LexParseRn.hs
@@ -28,7 +28,7 @@ import Haddock.Interface.ParseModuleHeader
 import Haddock.Parser
 import Haddock.Types
 import Name
-import Outputable ( showPpr )
+import Outputable ( showPpr, showSDoc )
 import RdrName
 import EnumSet
 import RnEnv (dataTcOccs)
@@ -120,11 +120,11 @@ rename dflags gre = rn
           -- There is only one name in the environment that matches so
           -- use it.
           [a] -> pure (DocIdentifier a)
+
           -- But when there are multiple names available, default to
           -- type constructors: somewhat awfully GHC returns the
           -- values in the list positionally.
-          a:b:_ | isTyConName a -> pure (DocIdentifier a)
-                | otherwise -> pure (DocIdentifier b)
+          a:b:_ -> ambiguous dflags x (if isTyConName a then a else b) names
 
       DocWarning doc -> DocWarning <$> rn doc
       DocEmphasis doc -> DocEmphasis <$> rn doc
@@ -168,3 +168,17 @@ outOfScope dflags x =
       tell ["Warning: '" ++ showPpr dflags a ++ "' is out of scope."]
       pure (monospaced a)
     monospaced a = DocMonospaced (DocString (showPpr dflags a))
+
+-- | Warn about an ambiguous identifier.
+ambiguous :: DynFlags -> RdrName -> Name -> [Name] -> ErrMsgM (Doc Name)
+ambiguous dflags x dflt names = do
+  tell [msg]
+  pure (DocIdentifier dflt)
+  where
+    msg = "Warning: " ++ x_str ++ " is ambiguous. It is defined\n" ++
+          concatMap (\n -> "    * " ++ defnLoc n ++ "\n") names ++
+          "    You may be able to disambiguate the identifier by qualifying it or\n" ++
+          "    by hiding some imports.\n" ++
+          "    Defaulting to " ++ x_str ++ " defined " ++ defnLoc dflt
+    x_str = '\'' : showPpr dflags x ++ "'"
+    defnLoc = showSDoc dflags . pprNameDefnLoc
-- 
cgit v1.2.3


From 88316b972e3d47197b1019111bae0f7f87275fce Mon Sep 17 00:00:00 2001
From: Alec Theriault <alec.theriault@gmail.com>
Date: Thu, 5 Jul 2018 10:43:35 -0400
Subject: Export more fixities for Hoogle (#871)

This exports fixities for more things, including class methods and
type-level operators.
---
 haddock-api/src/Haddock/Backends/Hoogle.hs |  4 ++--
 hoogle-test/ref/Bug722/test.txt            | 16 ++++++++++++++++
 hoogle-test/src/Bug722/Bug722.hs           | 13 +++++++++++++
 3 files changed, 31 insertions(+), 2 deletions(-)
 create mode 100644 hoogle-test/ref/Bug722/test.txt
 create mode 100644 hoogle-test/src/Bug722/Bug722.hs

(limited to 'haddock-api')

diff --git a/haddock-api/src/Haddock/Backends/Hoogle.hs b/haddock-api/src/Haddock/Backends/Hoogle.hs
index 59a4f53c..df626c4c 100644
--- a/haddock-api/src/Haddock/Backends/Hoogle.hs
+++ b/haddock-api/src/Haddock/Backends/Hoogle.hs
@@ -123,7 +123,7 @@ ppExport dflags ExportDecl { expItemDecl    = L _ decl
                            , expItemMbDoc   = (dc, _)
                            , expItemSubDocs = subdocs
                            , expItemFixities = fixities
-                           } = ppDocumentation dflags dc ++ f decl
+                           } = ppDocumentation dflags dc ++ f decl ++ ppFixities
     where
         f (TyClD d@DataDecl{})  = ppData dflags d subdocs
         f (TyClD d@SynDecl{})   = ppSynonym dflags d
@@ -131,7 +131,7 @@ ppExport dflags ExportDecl { expItemDecl    = L _ decl
         f (TyClD (FamDecl d))   = ppFam dflags d
         f (ForD (ForeignImport name typ _ _)) = [pp_sig dflags [name] (hsSigType typ)]
         f (ForD (ForeignExport name typ _ _)) = [pp_sig dflags [name] (hsSigType typ)]
-        f (SigD sig) = ppSig dflags sig ++ ppFixities
+        f (SigD sig) = ppSig dflags sig
         f _ = []
 
         ppFixities = concatMap (ppFixity dflags) fixities
diff --git a/hoogle-test/ref/Bug722/test.txt b/hoogle-test/ref/Bug722/test.txt
new file mode 100644
index 00000000..96f3747b
--- /dev/null
+++ b/hoogle-test/ref/Bug722/test.txt
@@ -0,0 +1,16 @@
+-- Hoogle documentation, generated by Haddock
+-- See Hoogle, http://www.haskell.org/hoogle/
+
+@package test
+@version 0.0.0
+
+module Bug722
+class Foo a
+(!@#) :: Foo a => a -> a -> a
+infixl 4 !@#
+type family &* :: * -> * -> *
+infixr 3 &*
+data a :-& b
+(:^&) :: a -> b -> (:-&) a b
+infixl 6 :-&
+infixl 6 :^&
diff --git a/hoogle-test/src/Bug722/Bug722.hs b/hoogle-test/src/Bug722/Bug722.hs
new file mode 100644
index 00000000..a33d5b24
--- /dev/null
+++ b/hoogle-test/src/Bug722/Bug722.hs
@@ -0,0 +1,13 @@
+{-# LANGUAGE TypeOperators, TypeFamilies #-}
+module Bug722 where
+
+class Foo a where
+  (!@#) :: a -> a -> a
+infixl 4 !@#
+
+type family (&*) :: * -> * -> *
+infixr 3 &*
+
+data a :-& b = a :^& b
+infixl 6 :-&, :^&
+
-- 
cgit v1.2.3


From 657b1b3d519545f8d4ca048c06210d6cbf0f0da0 Mon Sep 17 00:00:00 2001
From: Alec Theriault <alec.theriault@gmail.com>
Date: Fri, 6 Jul 2018 10:06:32 -0400
Subject: Avoid line breaks due to line length in Hoogle (#868)

* Avoid line breaks due to line length in Hoogle

Hoogle operates in a line-oriented fashion, so we should avoid ever
breaking due to long lines.

One way of doing this non-intrusively is to modify the 'DynFlags' that
are threaded through the 'Hoogle' module (note this is anyways only
passed through for use in the various 'showSDoc' functions).

* Amend test case
---
 haddock-api/src/Haddock/Backends/Hoogle.hs | 8 +++++---
 hoogle-test/ref/Bug806/test.txt            | 1 +
 hoogle-test/src/Bug806/Bug806.hs           | 1 +
 3 files changed, 7 insertions(+), 3 deletions(-)

(limited to 'haddock-api')

diff --git a/haddock-api/src/Haddock/Backends/Hoogle.hs b/haddock-api/src/Haddock/Backends/Hoogle.hs
index df626c4c..a89ac2c7 100644
--- a/haddock-api/src/Haddock/Backends/Hoogle.hs
+++ b/haddock-api/src/Haddock/Backends/Hoogle.hs
@@ -45,13 +45,15 @@ prefix = ["-- Hoogle documentation, generated by Haddock"
 
 ppHoogle :: DynFlags -> String -> Version -> String -> Maybe (Doc RdrName) -> [Interface] -> FilePath -> IO ()
 ppHoogle dflags package version synopsis prologue ifaces odir = do
-    let filename = package ++ ".txt"
+    let -- Since Hoogle is line based, we want to avoid breaking long lines.
+        dflags' = dflags{ pprCols = maxBound }
+        filename = package ++ ".txt"
         contents = prefix ++
-                   docWith dflags (drop 2 $ dropWhile (/= ':') synopsis) prologue ++
+                   docWith dflags' (drop 2 $ dropWhile (/= ':') synopsis) prologue ++
                    ["@package " ++ package] ++
                    ["@version " ++ showVersion version
                    | not (null (versionBranch version)) ] ++
-                   concat [ppModule dflags i | i <- ifaces, OptHide `notElem` ifaceOptions i]
+                   concat [ppModule dflags' i | i <- ifaces, OptHide `notElem` ifaceOptions i]
     createDirectoryIfMissing True odir
     h <- openFile (odir </> filename) WriteMode
     hSetEncoding h utf8
diff --git a/hoogle-test/ref/Bug806/test.txt b/hoogle-test/ref/Bug806/test.txt
index d9a908b3..67e9fd61 100644
--- a/hoogle-test/ref/Bug806/test.txt
+++ b/hoogle-test/ref/Bug806/test.txt
@@ -21,4 +21,5 @@ class C a where {
     
     -- | <a>AT</a> docs
     type family AT a;
+    type AT a = Proxy (Proxy (Proxy (Proxy (Proxy (Proxy (Proxy (Proxy (Proxy (Proxy)))))))));
 }
diff --git a/hoogle-test/src/Bug806/Bug806.hs b/hoogle-test/src/Bug806/Bug806.hs
index 6efcb5cf..45efda77 100644
--- a/hoogle-test/src/Bug806/Bug806.hs
+++ b/hoogle-test/src/Bug806/Bug806.hs
@@ -21,3 +21,4 @@ v = 42
 class C a where
   -- | 'AT' docs
   type AT a
+  type AT a = Proxy (Proxy (Proxy (Proxy (Proxy (Proxy (Proxy (Proxy (Proxy (Proxy)))))))))
-- 
cgit v1.2.3


From c3eb3f0581f69e816f9453b1747a9f2a3ba02bb9 Mon Sep 17 00:00:00 2001
From: Simon Jakobi <simon.jakobi@gmail.com>
Date: Thu, 19 Jul 2018 13:36:45 +0200
Subject: tyThingToLHsDecl: Preserve type synonyms that contain a forall (#880)

* tyThingToLHsDecls: Preserve type synonyms that contain a forall

Fixes #879.

* Add Note [Invariant: Never expand type synonyms]

* Clarify Note [Invariant: Never expand type synonyms]
---
 haddock-api/src/Haddock/Convert.hs | 48 ++++++++++++++++++++++++++++++++++++--
 1 file changed, 46 insertions(+), 2 deletions(-)

(limited to 'haddock-api')

diff --git a/haddock-api/src/Haddock/Convert.hs b/haddock-api/src/Haddock/Convert.hs
index 8b227c50..7595f798 100644
--- a/haddock-api/src/Haddock/Convert.hs
+++ b/haddock-api/src/Haddock/Convert.hs
@@ -31,7 +31,7 @@ import NameSet ( emptyNameSet )
 import RdrName ( mkVarUnqual )
 import PatSyn
 import SrcLoc ( Located, noLoc, unLoc, GenLocated(..), srcLocSpan )
-import TcType ( tcSplitSigmaTy )
+import TcType
 import TyCon
 import Type
 import TyCoRep
@@ -515,7 +515,7 @@ synifyType _ (FunTy t1 t2) = let
   s2 = synifyType WithinType t2
   in noLoc $ HsFunTy s1 s2
 synifyType s forallty@(ForAllTy _tv _ty) =
-  let (tvs, ctx, tau) = tcSplitSigmaTy forallty
+  let (tvs, ctx, tau) = tcSplitSigmaTyPreserveSynonyms forallty
       sPhi = HsQualTy { hst_ctxt = synifyCtx ctx
                       , hst_body = synifyType WithinType tau }
   in case s of
@@ -610,3 +610,47 @@ synifyFamInst fi opaque = do
     ts' = synifyTypes ts
     annot_ts = zipWith3 annotHsType is_poly_tvs ts ts'
     is_poly_tvs = mkIsPolyTvs (tyConVisibleTyVars fam_tc)
+
+{-
+Note [Invariant: Never expand type synonyms]
+
+In haddock, we never want to expand a type synonym that may be presented to the
+user, as we want to keep the link to the abstraction captured in the synonym.
+
+All code in Haddock.Convert must make sure that this invariant holds.
+
+See https://github.com/haskell/haddock/issues/879 for a bug where this
+invariant didn't hold.
+-}
+
+-- | A version of 'TcType.tcSplitSigmaTy' that preserves type synonyms.
+--
+-- See Note [Invariant: Never expand type synonyms]
+tcSplitSigmaTyPreserveSynonyms :: Type -> ([TyVar], ThetaType, Type)
+tcSplitSigmaTyPreserveSynonyms ty =
+    case tcSplitForAllTysPreserveSynonyms ty of
+      (tvs, rho) -> case tcSplitPhiTyPreserveSynonyms rho of
+        (theta, tau) -> (tvs, theta, tau)
+
+-- | See Note [Invariant: Never expand type synonyms]
+tcSplitForAllTysPreserveSynonyms :: Type -> ([TyVar], Type)
+tcSplitForAllTysPreserveSynonyms ty = split ty ty []
+  where
+    split _       (ForAllTy (TvBndr tv _) ty') tvs = split ty' ty' (tv:tvs)
+    split orig_ty _                            tvs = (reverse tvs, orig_ty)
+
+-- | See Note [Invariant: Never expand type synonyms]
+tcSplitPhiTyPreserveSynonyms :: Type -> (ThetaType, Type)
+tcSplitPhiTyPreserveSynonyms ty0 = split ty0 []
+  where
+    split ty ts
+      = case tcSplitPredFunTyPreserveSynonyms_maybe ty of
+          Just (pred_, ty') -> split ty' (pred_:ts)
+          Nothing           -> (reverse ts, ty)
+
+-- | See Note [Invariant: Never expand type synonyms]
+tcSplitPredFunTyPreserveSynonyms_maybe :: Type -> Maybe (PredType, Type)
+tcSplitPredFunTyPreserveSynonyms_maybe (FunTy arg res)
+  | isPredTy arg = Just (arg, res)
+tcSplitPredFunTyPreserveSynonyms_maybe _
+  = Nothing
-- 
cgit v1.2.3


From 133e9c2c168db19c1135479f7ab144c4e33af2a4 Mon Sep 17 00:00:00 2001
From: Alec Theriault <alec.theriault@gmail.com>
Date: Fri, 20 Jul 2018 03:01:49 -0700
Subject: Preserve docs on type family instances (#867)

* Preserve docs on type family instances

The only problem was that the instance location was slightly off
for type family instances.

* Accept output
---
 haddock-api/src/Haddock/Interface/Create.hs |  7 +++++--
 haddock-api/src/Haddock/Types.hs            |  3 +++
 html-test/ref/TypeFamilies.html             | 30 +++++++++++++++++++----------
 html-test/ref/TypeFamilies2.html            | 18 +++++++++++------
 4 files changed, 40 insertions(+), 18 deletions(-)

(limited to 'haddock-api')

diff --git a/haddock-api/src/Haddock/Interface/Create.hs b/haddock-api/src/Haddock/Interface/Create.hs
index a35e2053..ced7cae5 100644
--- a/haddock-api/src/Haddock/Interface/Create.hs
+++ b/haddock-api/src/Haddock/Interface/Create.hs
@@ -419,9 +419,12 @@ mkMaps dflags pkgName gre instances decls = do
     instanceMap = M.fromList [ (getSrcSpan n, n) | n <- instances ]
 
     names :: SrcSpan -> HsDecl GhcRn -> [Name]
-    names l (InstD d) = maybeToList (M.lookup loc instanceMap) -- See note [2].
+    names _ (InstD d) = maybeToList (M.lookup loc instanceMap) -- See note [2].
       where loc = case d of
-              TyFamInstD _ -> l -- The CoAx's loc is the whole line, but only for TFs
+              -- The CoAx's loc is the whole line, but only for TFs. The
+              -- workaround is to dig into the family instance declaration and
+              -- get the identifier with the right location.
+              TyFamInstD (TyFamInstDecl d') -> getLoc (feqn_tycon (hsib_body d'))
               _ -> getInstLoc d
     names l (DerivD {}) = maybeToList (M.lookup l instanceMap) -- See note [2].
     names _ decl = getMainDeclBinder decl
diff --git a/haddock-api/src/Haddock/Types.hs b/haddock-api/src/Haddock/Types.hs
index 36ed7baf..5ef5a7b9 100644
--- a/haddock-api/src/Haddock/Types.hs
+++ b/haddock-api/src/Haddock/Types.hs
@@ -28,6 +28,7 @@ module Haddock.Types (
 import Control.Exception
 import Control.Arrow hiding ((<+>))
 import Control.DeepSeq
+import Control.Monad.IO.Class (MonadIO(..))
 import Data.Typeable
 import Data.Map (Map)
 import Data.Data (Data)
@@ -661,6 +662,8 @@ instance Monad ErrMsgGhc where
   m >>= k = WriterGhc $ runWriterGhc m >>= \ (a, msgs1) ->
                fmap (second (msgs1 ++)) (runWriterGhc (k a))
 
+instance MonadIO ErrMsgGhc where
+  liftIO m = WriterGhc (fmap (\x -> (x, [])) (liftIO m))
 
 -----------------------------------------------------------------------------
 -- * Pass sensitive types
diff --git a/html-test/ref/TypeFamilies.html b/html-test/ref/TypeFamilies.html
index 190f376e..1fe20c4b 100644
--- a/html-test/ref/TypeFamilies.html
+++ b/html-test/ref/TypeFamilies.html
@@ -352,8 +352,10 @@
 		    > <a href="#" class="selflink"
 		    >#</a
 		    ></td
-		  ><td class="doc empty"
-		  ></td
+		  ><td class="doc"
+		  ><p
+		    >External instance</p
+		    ></td
 		  ></tr
 		><tr
 		><td colspan="2"
@@ -586,8 +588,10 @@
 		    > <a href="#" class="selflink"
 		    >#</a
 		    ></td
-		  ><td class="doc empty"
-		  ></td
+		  ><td class="doc"
+		  ><p
+		    >Doc for: type instance Foo X = Y</p
+		    ></td
 		  ></tr
 		><tr
 		><td colspan="2"
@@ -944,8 +948,10 @@
 		    > <a href="#" class="selflink"
 		    >#</a
 		    ></td
-		  ><td class="doc empty"
-		  ></td
+		  ><td class="doc"
+		  ><p
+		    >Doc for: type instance Foo Y = X</p
+		    ></td
 		  ></tr
 		><tr
 		><td colspan="2"
@@ -1234,8 +1240,10 @@
 		    > <a href="#" class="selflink"
 		    >#</a
 		    ></td
-		  ><td class="doc empty"
-		  ></td
+		  ><td class="doc"
+		  ><p
+		    >Doc for: type instance Foo Y = X</p
+		    ></td
 		  ></tr
 		><tr
 		><td colspan="2"
@@ -1274,8 +1282,10 @@
 		    > <a href="#" class="selflink"
 		    >#</a
 		    ></td
-		  ><td class="doc empty"
-		  ></td
+		  ><td class="doc"
+		  ><p
+		    >Doc for: type instance Foo X = Y</p
+		    ></td
 		  ></tr
 		><tr
 		><td colspan="2"
diff --git a/html-test/ref/TypeFamilies2.html b/html-test/ref/TypeFamilies2.html
index a5d0d9a9..1b4eed8c 100644
--- a/html-test/ref/TypeFamilies2.html
+++ b/html-test/ref/TypeFamilies2.html
@@ -142,8 +142,10 @@
 		    > <a href="#" class="selflink"
 		    >#</a
 		    ></td
-		  ><td class="doc empty"
-		  ></td
+		  ><td class="doc"
+		  ><p
+		    >Should be visible, but with a hidden right hand side</p
+		    ></td
 		  ></tr
 		><tr
 		><td colspan="2"
@@ -202,8 +204,10 @@
 		    > <a href="#" class="selflink"
 		    >#</a
 		    ></td
-		  ><td class="doc empty"
-		  ></td
+		  ><td class="doc"
+		  ><p
+		    >Should be visible, but with a hidden right hand side</p
+		    ></td
 		  ></tr
 		><tr
 		><td colspan="2"
@@ -240,8 +244,10 @@
 		    > <a href="#" class="selflink"
 		    >#</a
 		    ></td
-		  ><td class="doc empty"
-		  ></td
+		  ><td class="doc"
+		  ><p
+		    >External instance</p
+		    ></td
 		  ></tr
 		><tr
 		><td colspan="2"
-- 
cgit v1.2.3


From 2de7c2acf9b1ec85b09027a8bb58bf8512e91c05 Mon Sep 17 00:00:00 2001
From: Alec Theriault <alec.theriault@gmail.com>
Date: Fri, 20 Jul 2018 03:02:16 -0700
Subject: Fix broken instance source links (#869)

The problem manifests itself in instances that are defined in
modules other than the module where the class is defined. The fix
is just to thread through the 'Module' of the instance further
along.

Since orphan instances appear to already have been working, I didn't
do anything there.
---
 haddock-api/src/Haddock/Backends/Xhtml/Decl.hs   |  8 +++---
 haddock-api/src/Haddock/Backends/Xhtml/Layout.hs | 33 +++++++++++++-----------
 2 files changed, 22 insertions(+), 19 deletions(-)

(limited to 'haddock-api')

diff --git a/haddock-api/src/Haddock/Backends/Xhtml/Decl.hs b/haddock-api/src/Haddock/Backends/Xhtml/Decl.hs
index 1daf9ace..01380c94 100644
--- a/haddock-api/src/Haddock/Backends/Xhtml/Decl.hs
+++ b/haddock-api/src/Haddock/Backends/Xhtml/Decl.hs
@@ -572,9 +572,9 @@ ppInstances links origin instances splice unicode pkg qual
   -- force Splice = True to use line URLs
   where
     instName = getOccString origin
-    instDecl :: Int -> DocInstance DocNameI -> (SubDecl,Located DocName)
+    instDecl :: Int -> DocInstance DocNameI -> (SubDecl, Maybe Module, Located DocName)
     instDecl no (inst, mdoc, loc, mdl) =
-        ((ppInstHead links splice unicode qual mdoc origin False no inst mdl), loc)
+        ((ppInstHead links splice unicode qual mdoc origin False no inst mdl), mdl, loc)
 
 
 ppOrphanInstances :: LinksInfo
@@ -587,9 +587,9 @@ ppOrphanInstances links instances splice unicode pkg qual
     instOrigin :: InstHead name -> InstOrigin (IdP name)
     instOrigin inst = OriginClass (ihdClsName inst)
 
-    instDecl :: Int -> DocInstance DocNameI -> (SubDecl,Located DocName)
+    instDecl :: Int -> DocInstance DocNameI -> (SubDecl, Maybe Module, Located DocName)
     instDecl no (inst, mdoc, loc, mdl) =
-        ((ppInstHead links splice unicode qual mdoc (instOrigin inst) True no inst mdl), loc)
+        ((ppInstHead links splice unicode qual mdoc (instOrigin inst) True no inst Nothing), mdl, loc)
 
 
 ppInstHead :: LinksInfo -> Splice -> Unicode -> Qualification
diff --git a/haddock-api/src/Haddock/Backends/Xhtml/Layout.hs b/haddock-api/src/Haddock/Backends/Xhtml/Layout.hs
index 501caa4b..1c44ffda 100644
--- a/haddock-api/src/Haddock/Backends/Xhtml/Layout.hs
+++ b/haddock-api/src/Haddock/Backends/Xhtml/Layout.hs
@@ -40,7 +40,6 @@ module Haddock.Backends.Xhtml.Layout (
   topDeclElem, declElem,
 ) where
 
-
 import Haddock.Backends.Xhtml.DocMarkup
 import Haddock.Backends.Xhtml.Types
 import Haddock.Backends.Xhtml.Utils
@@ -48,6 +47,7 @@ import Haddock.Types
 import Haddock.Utils (makeAnchorId, nameAnchorId)
 import qualified Data.Map as Map
 import Text.XHtml hiding ( name, title, quote )
+import Data.Maybe (fromMaybe)
 
 import FastString            ( unpackFS )
 import GHC
@@ -151,20 +151,22 @@ subTable pkg qual decls = Just $ table << aboves (concatMap subRow decls)
 
 -- | Sub table with source information (optional).
 subTableSrc :: Maybe Package -> Qualification -> LinksInfo -> Bool
-            -> [(SubDecl,Located DocName)] -> Maybe Html
+            -> [(SubDecl, Maybe Module, Located DocName)] -> Maybe Html
 subTableSrc _ _ _ _ [] = Nothing
 subTableSrc pkg qual lnks splice decls = Just $ table << aboves (concatMap subRow decls)
   where
-    subRow ((decl, mdoc, subs),L loc dn) =
+    subRow ((decl, mdoc, subs), mdl, L loc dn) =
       (td ! [theclass "src clearfix"] <<
         (thespan ! [theclass "inst-left"] << decl)
-        <+> linkHtml loc dn
+        <+> linkHtml loc mdl dn
       <->
       docElement td << fmap (docToHtml Nothing pkg qual) mdoc
       )
       : map (cell . (td <<)) subs
-    linkHtml loc@(RealSrcSpan _) dn = links lnks loc splice dn
-    linkHtml _ _ = noHtml
+
+    linkHtml :: SrcSpan -> Maybe Module -> DocName -> Html
+    linkHtml loc@(RealSrcSpan _) mdl dn = links lnks loc splice mdl dn
+    linkHtml _ _ _ = noHtml
 
 subBlock :: [Html] -> Maybe Html
 subBlock [] = Nothing
@@ -197,7 +199,7 @@ subEquations pkg qual = divSubDecls "equations" "Equations" . subTable pkg qual
 subInstances :: Maybe Package -> Qualification
              -> String -- ^ Class name, used for anchor generation
              -> LinksInfo -> Bool
-             -> [(SubDecl,Located DocName)] -> Html
+             -> [(SubDecl, Maybe Module, Located DocName)] -> Html
 subInstances pkg qual nm lnks splice = maybe noHtml wrap . instTable
   where
     wrap contents = subSection (collapseDetails id_ DetailsOpen (summary +++ contents))
@@ -209,7 +211,7 @@ subInstances pkg qual nm lnks splice = maybe noHtml wrap . instTable
 
 subOrphanInstances :: Maybe Package -> Qualification
                    -> LinksInfo -> Bool
-                   -> [(SubDecl,Located DocName)] -> Html
+                   -> [(SubDecl, Maybe Module, Located DocName)] -> Html
 subOrphanInstances pkg qual lnks splice  = maybe noHtml wrap . instTable
   where
     wrap = ((h1 << "Orphan instances") +++)
@@ -268,13 +270,13 @@ declElem = paragraph ! [theclass "src"]
 -- it adds a source and wiki link at the right hand side of the box
 topDeclElem :: LinksInfo -> SrcSpan -> Bool -> [DocName] -> Html -> Html
 topDeclElem lnks loc splice names html =
-    declElem << (html <+> (links lnks loc splice $ head names))
+    declElem << (html <+> (links lnks loc splice Nothing $ head names))
         -- FIXME: is it ok to simply take the first name?
 
 -- | Adds a source and wiki link at the right hand side of the box.
 -- Name must be documented, otherwise we wouldn't get here.
-links :: LinksInfo -> SrcSpan -> Bool -> DocName -> Html
-links ((_,_,sourceMap,lineMap), (_,_,maybe_wiki_url)) loc splice docName@(Documented n mdl) =
+links :: LinksInfo -> SrcSpan -> Bool -> Maybe Module -> DocName -> Html
+links ((_,_,sourceMap,lineMap), (_,_,maybe_wiki_url)) loc splice mdl' docName@(Documented n mdl) =
   srcLink <+> wikiLink <+> (selfLink ! [theclass "selflink"] << "#")
   where selfLink = linkedAnchor (nameAnchorId (nameOccName (getName docName)))
 
@@ -298,12 +300,13 @@ links ((_,_,sourceMap,lineMap), (_,_,maybe_wiki_url)) loc splice docName@(Docume
 
         -- For source links, we want to point to the original module,
         -- because only that will have the source.
-        -- TODO: do something about type instances. They will point to
-        -- the module defining the type family, which is wrong.
-        origMod = nameModule n
+        --
+        -- 'mdl'' is a way of "overriding" the module. Without it, instances
+        -- will point to the module defining the class/family, which is wrong.
+        origMod = fromMaybe (nameModule n) mdl'
         origPkg = moduleUnitId origMod
 
         fname = case loc of
           RealSrcSpan l -> unpackFS (srcSpanFile l)
           UnhelpfulSpan _ -> error "links: UnhelpfulSpan"
-links _ _ _ _ = noHtml
+links _ _ _ _ _ = noHtml
-- 
cgit v1.2.3


From ab9cb915c95a2436d76ed86a1e36f00ad92c1699 Mon Sep 17 00:00:00 2001
From: Simon Jakobi <simon.jakobi@gmail.com>
Date: Fri, 20 Jul 2018 16:02:02 +0200
Subject: Update the ghc-8.6 branch (#889)

* Revert "Bump GHC version to 8.6"

This was applied to the wrong branch; there's now a `ghc-8.6` branch;
ghc-head is always supposed to point to GHC HEAD, i.e. an odd major version.
The next version bump to `ghc-head` is supposed to go from e.g. 8.5 to 8.7

This reverts commit 5e3cf5d8868323079ff5494a8225b0467404a5d1.

* README updates (#856)

* README: Remove mentions of master branch

* README: Add instructions for using html-test

* README: Change command to run _all_ the testsuites

* README: Add project overview section

(cherry picked from commit 61d6f935da97eb96685f07bf385102c2dbc2a33c)

* Export more fixities for Hoogle (#871)

This exports fixities for more things, including class methods and
type-level operators.

(cherry picked from commit 88316b972e3d47197b1019111bae0f7f87275fce)

* Avoid line breaks due to line length in Hoogle (#868)

* Avoid line breaks due to line length in Hoogle

Hoogle operates in a line-oriented fashion, so we should avoid ever
breaking due to long lines.

One way of doing this non-intrusively is to modify the 'DynFlags' that
are threaded through the 'Hoogle' module (note this is anyways only
passed through for use in the various 'showSDoc' functions).

* Amend test case

(cherry picked from commit 657b1b3d519545f8d4ca048c06210d6cbf0f0da0)

* tyThingToLHsDecl: Preserve type synonyms that contain a forall (#880)

* tyThingToLHsDecls: Preserve type synonyms that contain a forall

Fixes #879.

* Add Note [Invariant: Never expand type synonyms]

* Clarify Note [Invariant: Never expand type synonyms]

(cherry picked from commit c3eb3f0581f69e816f9453b1747a9f2a3ba02bb9)

* Fix HEAD html-test (#860)

* Update tests for 'StarIsType'

* Accept tests

* Revert "Update tests for 'StarIsType'"

This reverts commit 7f0c01383bbba6dc5af554ee82988d2cf44e407a.

* Refactor handling of parens in types (#874)

* Fix type parenthesization in Hoogle backend

Ported the logic in the HTML and LaTeX backends for adding in parens
into something top-level in 'GhcUtil'. Calling that from the Hoogle
backend fixes #873.

* Remove parenthesizing logic from LaTeX and XHTML backends

Now, the only times that parenthesis in types are added in any backend
is through the explicit 'HsParTy' constructor. Precedence is also
represented as its own datatype.

* List out cases explicitly vs. catch-all

* Fix printing of parens for QuantifiedConstraints

The priority of printing 'forall' types was just one too high.

Fixes #877.

* Accept HTML output for quantified contexts test

* Preserve docs on type family instances (#867)

* Preserve docs on type family instances

The only problem was that the instance location was slightly off
for type family instances.

* Accept output

(cherry picked from commit 133e9c2c168db19c1135479f7ab144c4e33af2a4)

* Fix broken instance source links (#869)

The problem manifests itself in instances that are defined in
modules other than the module where the class is defined. The fix
is just to thread through the 'Module' of the instance further
along.

Since orphan instances appear to already have been working, I didn't
do anything there.

(cherry picked from commit 2de7c2acf9b1ec85b09027a8bb58bf8512e91c05)

* Add some more unicode related tests (#872)

This has been fixed for sure ever since we switched from attoparsec to
parsec. Parts of it may have been working before that, but there was a
point where this would have failed (see #191).

A regression test never hurt anyone. :)

(cherry picked from commit 5ec7715d418bfac0f26aec6039792a99a6e89370)

* Misc tests (#858)

* More tests

* spliced types
* constructor/pattern argument docs
* strictness marks on fields with argument docs

* latex test cases need seperate directory

* Accept tests

* Additional tests for the identifier parser (#816)

* Add tests for the identifier parser

* docs: Clarify how to delimit identifiers

(cherry picked from commit 0861affeca4d72938f05a2eceddfae2c19199071)
---
 README.md                                          |  41 +-
 doc/markup.rst                                     |  13 +-
 haddock-api/haddock-api.cabal                      |   4 +-
 haddock-api/src/Haddock/Backends/Hoogle.hs         |  14 +-
 haddock-api/src/Haddock/Backends/LaTeX.hs          | 123 ++--
 haddock-api/src/Haddock/Backends/Xhtml/Decl.hs     | 130 ++--
 haddock-api/src/Haddock/Backends/Xhtml/Layout.hs   |  33 +-
 haddock-api/src/Haddock/Convert.hs                 |  48 +-
 haddock-api/src/Haddock/GhcUtils.hs                |  96 +++
 haddock-api/src/Haddock/Interface/Create.hs        |   7 +-
 haddock-api/src/Haddock/Types.hs                   |   3 +
 .../test/Documentation/Haddock/ParserSpec.hs       |  48 +-
 haddock-test/src/Test/Haddock.hs                   |   4 +-
 haddock.cabal                                      |   2 +-
 hoogle-test/ref/Bug722/test.txt                    |  16 +
 hoogle-test/ref/Bug806/test.txt                    |   1 +
 hoogle-test/ref/Bug873/test.txt                    |  26 +
 hoogle-test/ref/type-sigs/test.txt                 |   4 +-
 hoogle-test/src/Bug722/Bug722.hs                   |  13 +
 hoogle-test/src/Bug806/Bug806.hs                   |   1 +
 hoogle-test/src/Bug873/Bug873.hs                   |   5 +
 html-test/ref/A.html                               |  24 +-
 html-test/ref/Bug280.html                          |   4 +-
 html-test/ref/Bug3.html                            |   8 +-
 html-test/ref/Bug310.html                          |  44 +-
 html-test/ref/Bug387.html                          |  16 +-
 html-test/ref/Bug4.html                            |   8 +-
 html-test/ref/Bug546.html                          |  20 +-
 html-test/ref/Bug548.html                          | 270 ++++++--
 html-test/ref/Bug574.html                          |  86 +++
 html-test/ref/Bug6.html                            |  60 +-
 html-test/ref/Bug613.html                          |  10 +-
 html-test/ref/Bug8.html                            |   4 +-
 html-test/ref/BugDeprecated.html                   |  48 +-
 html-test/ref/BugExportHeadings.html               |  48 +-
 html-test/ref/Bugs.html                            |   4 +-
 html-test/ref/BundledPatterns.html                 |  20 +-
 html-test/ref/BundledPatterns2.html                |  20 +-
 html-test/ref/ConstructorArgs.html                 | 720 +++++++++++++++++++++
 html-test/ref/ConstructorPatternExport.html        |  26 +-
 html-test/ref/DeprecatedFunction.html              |  16 +-
 html-test/ref/DeprecatedFunction2.html             |   8 +-
 html-test/ref/DeprecatedFunction3.html             |   8 +-
 html-test/ref/DeprecatedModule.html                |   4 +-
 html-test/ref/DeprecatedModule2.html               |   4 +-
 html-test/ref/DeprecatedNewtype.html               |  16 +-
 html-test/ref/DeprecatedReExport.html              |   8 +-
 html-test/ref/DeprecatedRecord.html                |  16 +-
 html-test/ref/DeprecatedTypeSynonym.html           |  16 +-
 html-test/ref/Examples.html                        |  16 +-
 html-test/ref/FunArgs.html                         |  16 +-
 html-test/ref/GADTRecords.html                     |  32 +-
 html-test/ref/GadtConstructorArgs.html             | 192 ++++++
 html-test/ref/Hash.html                            |  96 ++-
 html-test/ref/HiddenInstances.html                 |  26 +-
 html-test/ref/Hyperlinks.html                      |   8 +-
 html-test/ref/Instances.html                       | 398 ++++++++++--
 html-test/ref/Math.html                            |   8 +-
 html-test/ref/ModuleWithWarning.html               |   4 +-
 html-test/ref/NoLayout.html                        |   8 +-
 html-test/ref/OrphanInstances.html                 |   4 +-
 html-test/ref/OrphanInstancesClass.html            |   8 +-
 html-test/ref/OrphanInstancesType.html             |   8 +-
 html-test/ref/PatternSyns.html                     |  24 +-
 html-test/ref/PromotedTypes.html                   |   8 +-
 html-test/ref/Properties.html                      |  16 +-
 html-test/ref/QuantifiedConstraints.html           | 100 +++
 html-test/ref/QuasiExpr.html                       |  80 ++-
 html-test/ref/QuasiQuote.html                      |   4 +-
 html-test/ref/SpuriousSuperclassConstraints.html   |  38 +-
 html-test/ref/TH.html                              |   6 +-
 html-test/ref/Test.html                            | 320 +++++++--
 html-test/ref/Threaded.html                        |   8 +-
 html-test/ref/Threaded_TH.html                     |  12 +-
 html-test/ref/Ticket112.html                       |   4 +-
 html-test/ref/Ticket75.html                        |   8 +-
 html-test/ref/TitledPicture.html                   |  16 +-
 html-test/ref/TypeFamilies.html                    |  98 ++-
 html-test/ref/TypeFamilies2.html                   |  18 +-
 html-test/ref/Unicode.html                         |   8 +-
 html-test/ref/Unicode2.html                        | 100 +++
 html-test/ref/Visible.html                         |   6 +-
 html-test/src/Bug745.hs                            |   8 +
 html-test/src/ConstructorArgs.hs                   |  56 ++
 html-test/src/GadtConstructorArgs.hs               |  13 +
 html-test/src/QuantifiedConstraints.hs             |  11 +
 html-test/src/Unicode2.hs                          |  18 +
 latex-test/ref/ConstructorArgs/ConstructorArgs.tex |  69 ++
 latex-test/ref/ConstructorArgs/haddock.sty         |  57 ++
 latex-test/ref/ConstructorArgs/main.tex            |  11 +
 .../GadtConstructorArgs/GadtConstructorArgs.tex    |  25 +
 latex-test/ref/GadtConstructorArgs/haddock.sty     |  57 ++
 latex-test/ref/GadtConstructorArgs/main.tex        |  11 +
 latex-test/src/ConstructorArgs/ConstructorArgs.hs  |  56 ++
 .../src/GadtConstructorArgs/GadtConstructorArgs.hs |  13 +
 95 files changed, 3658 insertions(+), 613 deletions(-)
 create mode 100644 hoogle-test/ref/Bug722/test.txt
 create mode 100644 hoogle-test/ref/Bug873/test.txt
 create mode 100644 hoogle-test/src/Bug722/Bug722.hs
 create mode 100644 hoogle-test/src/Bug873/Bug873.hs
 create mode 100644 html-test/ref/Bug574.html
 create mode 100644 html-test/ref/ConstructorArgs.html
 create mode 100644 html-test/ref/GadtConstructorArgs.html
 create mode 100644 html-test/ref/QuantifiedConstraints.html
 create mode 100644 html-test/ref/Unicode2.html
 create mode 100644 html-test/src/Bug745.hs
 create mode 100644 html-test/src/ConstructorArgs.hs
 create mode 100644 html-test/src/GadtConstructorArgs.hs
 create mode 100644 html-test/src/QuantifiedConstraints.hs
 create mode 100644 html-test/src/Unicode2.hs
 create mode 100644 latex-test/ref/ConstructorArgs/ConstructorArgs.tex
 create mode 100644 latex-test/ref/ConstructorArgs/haddock.sty
 create mode 100644 latex-test/ref/ConstructorArgs/main.tex
 create mode 100644 latex-test/ref/GadtConstructorArgs/GadtConstructorArgs.tex
 create mode 100644 latex-test/ref/GadtConstructorArgs/haddock.sty
 create mode 100644 latex-test/ref/GadtConstructorArgs/main.tex
 create mode 100644 latex-test/src/ConstructorArgs/ConstructorArgs.hs
 create mode 100644 latex-test/src/GadtConstructorArgs/GadtConstructorArgs.hs

(limited to 'haddock-api')

diff --git a/README.md b/README.md
index bfc2261b..51642aab 100644
--- a/README.md
+++ b/README.md
@@ -11,6 +11,32 @@ Full documentation can be found in the `doc/` subdirectory, in
 [reStructedText format](http://www.sphinx-doc.org/en/stable/rest.html)
 format.
 
+
+## Project overview
+
+This project consists of three packages:
+
+* haddock
+* haddock-api
+* haddock-library
+
+### haddock
+
+The haddock package provides the `haddock` executable. It is implemented as a
+tiny wrapper around haddock-api's `Documentation.Haddock.haddock` function.
+
+### haddock-api
+
+haddock-api contains the program logic of the `haddock` tool. [The haddocks for
+the `Documentation.Haddock` module](http://hackage.haskell.org/package/haddock-api-2.19.0.1/docs/Documentation-Haddock.html)
+offer a good overview of haddock-api's functionality.
+
+### haddock-library
+
+haddock-library is concerned with the parsing and processing of the Haddock
+markup language.
+
+
 ## Contributing
 
 Please create issues when you have any problems and pull requests if you have some code.
@@ -33,7 +59,7 @@ and then proceed using your favourite build tool.
 ```bash
 cabal new-build -w ghc-8.4.1
 # build & run the test suite
-cabal new-test -w ghc-8.4.1
+cabal new-test -w ghc-8.4.1 all
 ```
 
 #### Using Cabal sandboxes
@@ -65,11 +91,16 @@ stack test
 ### Git Branches
 
 If you're a GHC developer and want to update Haddock to work with your
-changes, you should be working on `ghc-head` branch instead of `master`.
+changes, you should be working on `ghc-head` branch.
 See instructions at
 https://ghc.haskell.org/trac/ghc/wiki/WorkingConventions/Git/Submodules
 for an example workflow.
 
-The `master` branch usually requires a GHC from the latest GHC stable
-branch. The required GHC version can be inferred from the version
-bounds on `ghc` in the respective `.cabal` files.
+### Updating `html-test`
+
+When accepting any changes in the output of `html-test`, it is important
+to use the `--haddock-path` option. For example:
+
+```
+cabal new-run -- html-test --haddock-path $(find dist-newstyle/ -executable -type f -name haddock) --accept
+```
diff --git a/doc/markup.rst b/doc/markup.rst
index 1a278da3..a9878837 100644
--- a/doc/markup.rst
+++ b/doc/markup.rst
@@ -859,10 +859,13 @@ Hyperlinked Identifiers
 ~~~~~~~~~~~~~~~~~~~~~~~
 
 Referring to a Haskell identifier, whether it be a type, class,
-constructor, or function, is done by surrounding it with single quotes: ::
+constructor, or function, is done by surrounding it with a combination
+of single quotes and backticks. For example: ::
 
     -- | This module defines the type 'T'.
 
+```T``` is also ok. ``'T``` and ```T'`` are accepted but less common.
+
 If there is an entity ``T`` in scope in the current module, then the
 documentation will hyperlink the reference in the text to the definition
 of ``T`` (if the output format supports hyperlinking, of course; in a
@@ -890,14 +893,6 @@ apostrophes themselves: to hyperlink ``foo'`` one would simply type
 ``'foo''``. To hyperlink identifiers written in infix form, simply put
 them in quotes as always: ``'`elem`'``.
 
-For compatibility with other systems, the following alternative form of
-markup is accepted [3]_: ```T'``.
-
-.. [3]
-   We chose not to use this as the primary markup for identifiers
-   because strictly speaking the ````` character should not be used as a
-   left quote, it is a grave accent.
-
 Emphasis, Bold and Monospaced Text
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
diff --git a/haddock-api/haddock-api.cabal b/haddock-api/haddock-api.cabal
index e1a52824..6a7a932b 100644
--- a/haddock-api/haddock-api.cabal
+++ b/haddock-api/haddock-api.cabal
@@ -42,7 +42,7 @@ library
   -- this package typically supports only single major versions
   build-depends: base            ^>= 4.12.0
                , Cabal           ^>= 2.3.0
-               , ghc             ^>= 8.6
+               , ghc             ^>= 8.5
                , ghc-paths       ^>= 0.1.0.9
                , haddock-library ^>= 1.6.0
                , xhtml           ^>= 3000.2.2
@@ -167,7 +167,7 @@ test-suite spec
     Haddock.Backends.Hyperlinker.Types
 
   build-depends: Cabal           ^>= 2.3
-               , ghc             ^>= 8.6
+               , ghc             ^>= 8.5
                , ghc-paths       ^>= 0.1.0.9
                , haddock-library ^>= 1.6.0
                , xhtml           ^>= 3000.2.2
diff --git a/haddock-api/src/Haddock/Backends/Hoogle.hs b/haddock-api/src/Haddock/Backends/Hoogle.hs
index 257a8d6d..885c608b 100644
--- a/haddock-api/src/Haddock/Backends/Hoogle.hs
+++ b/haddock-api/src/Haddock/Backends/Hoogle.hs
@@ -46,13 +46,15 @@ prefix = ["-- Hoogle documentation, generated by Haddock"
 
 ppHoogle :: DynFlags -> String -> Version -> String -> Maybe (Doc RdrName) -> [Interface] -> FilePath -> IO ()
 ppHoogle dflags package version synopsis prologue ifaces odir = do
-    let filename = package ++ ".txt"
+    let -- Since Hoogle is line based, we want to avoid breaking long lines.
+        dflags' = dflags{ pprCols = maxBound }
+        filename = package ++ ".txt"
         contents = prefix ++
-                   docWith dflags (drop 2 $ dropWhile (/= ':') synopsis) prologue ++
+                   docWith dflags' (drop 2 $ dropWhile (/= ':') synopsis) prologue ++
                    ["@package " ++ package] ++
                    ["@version " ++ showVersion version
                    | not (null (versionBranch version)) ] ++
-                   concat [ppModule dflags i | i <- ifaces, OptHide `notElem` ifaceOptions i]
+                   concat [ppModule dflags' i | i <- ifaces, OptHide `notElem` ifaceOptions i]
     createDirectoryIfMissing True odir
     h <- openFile (odir </> filename) WriteMode
     hSetEncoding h utf8
@@ -89,7 +91,7 @@ dropHsDocTy = f
 
 outHsType :: (a ~ GhcPass p, OutputableBndrId a)
           => DynFlags -> HsType a -> String
-outHsType dflags = out dflags . dropHsDocTy
+outHsType dflags = out dflags . reparenType . dropHsDocTy
 
 
 dropComment :: String -> String
@@ -123,7 +125,7 @@ ppExport dflags ExportDecl { expItemDecl    = L _ decl
                            , expItemMbDoc   = (dc, _)
                            , expItemSubDocs = subdocs
                            , expItemFixities = fixities
-                           } = ppDocumentation dflags dc ++ f decl
+                           } = ppDocumentation dflags dc ++ f decl ++ ppFixities
     where
         f (TyClD _ d@DataDecl{})  = ppData dflags d subdocs
         f (TyClD _ d@SynDecl{})   = ppSynonym dflags d
@@ -131,7 +133,7 @@ ppExport dflags ExportDecl { expItemDecl    = L _ decl
         f (TyClD _ (FamDecl _ d)) = ppFam dflags d
         f (ForD _ (ForeignImport _ name typ _)) = [pp_sig dflags [name] (hsSigType typ)]
         f (ForD _ (ForeignExport _ name typ _)) = [pp_sig dflags [name] (hsSigType typ)]
-        f (SigD _ sig) = ppSig dflags sig ++ ppFixities
+        f (SigD _ sig) = ppSig dflags sig
         f _ = []
 
         ppFixities = concatMap (ppFixity dflags) fixities
diff --git a/haddock-api/src/Haddock/Backends/LaTeX.hs b/haddock-api/src/Haddock/Backends/LaTeX.hs
index c0da1f0c..4a3e9d03 100644
--- a/haddock-api/src/Haddock/Backends/LaTeX.hs
+++ b/haddock-api/src/Haddock/Backends/LaTeX.hs
@@ -906,24 +906,6 @@ sumParens = ubxparens . hsep . punctuate (text " | ")
 -- Stolen from Html and tweaked for LaTeX generation
 -------------------------------------------------------------------------------
 
-
-pREC_TOP, pREC_FUN, pREC_OP, pREC_CON :: Int
-
-pREC_TOP = (0 :: Int)   -- type in ParseIface.y in GHC
-pREC_FUN = (1 :: Int)   -- btype in ParseIface.y in GHC
-                        -- Used for LH arg of (->)
-pREC_OP  = (2 :: Int)   -- Used for arg of any infix operator
-                        -- (we don't keep their fixities around)
-pREC_CON = (3 :: Int)   -- Used for arg of type applicn:
-                        -- always parenthesise unless atomic
-
-maybeParen :: Int           -- Precedence of context
-           -> Int           -- Precedence of top-level operator
-           -> LaTeX -> LaTeX  -- Wrap in parens if (ctxt >= op)
-maybeParen ctxt_prec op_prec p | ctxt_prec >= op_prec = parens p
-                               | otherwise            = p
-
-
 ppLType, ppLParendType, ppLFunLhType :: Bool -> Located (HsType DocNameI) -> LaTeX
 ppLType       unicode y = ppType unicode (unLoc y)
 ppLParendType unicode y = ppParendType unicode (unLoc y)
@@ -931,72 +913,70 @@ ppLFunLhType  unicode y = ppFunLhType unicode (unLoc y)
 
 
 ppType, ppParendType, ppFunLhType :: Bool -> HsType DocNameI -> LaTeX
-ppType       unicode ty = ppr_mono_ty pREC_TOP ty unicode
-ppParendType unicode ty = ppr_mono_ty pREC_CON ty unicode
-ppFunLhType  unicode ty = ppr_mono_ty pREC_FUN ty unicode
+ppType       unicode ty = ppr_mono_ty (reparenTypePrec PREC_TOP ty) unicode
+ppParendType unicode ty = ppr_mono_ty (reparenTypePrec PREC_TOP ty) unicode
+ppFunLhType  unicode ty = ppr_mono_ty (reparenTypePrec PREC_FUN ty) unicode
 
 ppLKind :: Bool -> LHsKind DocNameI -> LaTeX
 ppLKind unicode y = ppKind unicode (unLoc y)
 
 ppKind :: Bool -> HsKind DocNameI -> LaTeX
-ppKind unicode ki = ppr_mono_ty pREC_TOP ki unicode
+ppKind unicode ki = ppr_mono_ty (reparenTypePrec PREC_TOP ki) unicode
 
 
 -- Drop top-level for-all type variables in user style
 -- since they are implicit in Haskell
 
-ppr_mono_lty :: Int -> LHsType DocNameI -> Bool -> LaTeX
-ppr_mono_lty ctxt_prec ty unicode = ppr_mono_ty ctxt_prec (unLoc ty) unicode
-
-
-ppr_mono_ty :: Int -> HsType DocNameI -> Bool -> LaTeX
-ppr_mono_ty ctxt_prec (HsForAllTy _ tvs ty) unicode
-  = maybeParen ctxt_prec pREC_FUN $
-    sep [ hsep (forallSymbol unicode : ppTyVars tvs) <> dot
-        , ppr_mono_lty pREC_TOP ty unicode ]
-ppr_mono_ty ctxt_prec (HsQualTy _ ctxt ty) unicode
-  = maybeParen ctxt_prec pREC_FUN $
-    sep [ ppLContext ctxt unicode
-        , ppr_mono_lty pREC_TOP ty unicode ]
-
-ppr_mono_ty _         (HsBangTy _ b ty)     u = ppBang b <> ppLParendType u ty
-ppr_mono_ty _         (HsTyVar _ NotPromoted (L _ name)) _ = ppDocName name
-ppr_mono_ty _         (HsTyVar _ Promoted    (L _ name)) _ = char '\'' <> ppDocName name
-ppr_mono_ty ctxt_prec (HsFunTy _ ty1 ty2)   u = ppr_fun_ty ctxt_prec ty1 ty2 u
-ppr_mono_ty _         (HsTupleTy _ con tys) u = tupleParens con (map (ppLType u) tys)
-ppr_mono_ty _         (HsSumTy _ tys) u       = sumParens (map (ppLType u) tys)
-ppr_mono_ty _         (HsKindSig _ ty kind) u = parens (ppr_mono_lty pREC_TOP ty u <+> dcolon u <+> ppLKind u kind)
-ppr_mono_ty _         (HsListTy _ ty)       u = brackets (ppr_mono_lty pREC_TOP ty u)
-ppr_mono_ty _         (HsIParamTy _ (L _ n) ty) u = brackets (ppIPName n <+> dcolon u <+> ppr_mono_lty pREC_TOP ty u)
-ppr_mono_ty _         (HsSpliceTy {})     _ = error "ppr_mono_ty HsSpliceTy"
-ppr_mono_ty _         (HsRecTy {})        _ = text "{..}"
-ppr_mono_ty _         (XHsType (NHsCoreTy {}))  _ = error "ppr_mono_ty HsCoreTy"
-ppr_mono_ty _         (HsExplicitListTy _ Promoted tys) u = Pretty.quote $ brackets $ hsep $ punctuate comma $ map (ppLType u) tys
-ppr_mono_ty _         (HsExplicitListTy _ NotPromoted tys) u = brackets $ hsep $ punctuate comma $ map (ppLType u) tys
-ppr_mono_ty _         (HsExplicitTupleTy _ tys) u = Pretty.quote $ parenList $ map (ppLType u) tys
-
-ppr_mono_ty ctxt_prec (HsAppTy _ fun_ty arg_ty) unicode
-  = maybeParen ctxt_prec pREC_CON $
-    hsep [ppr_mono_lty pREC_FUN fun_ty unicode, ppr_mono_lty pREC_CON arg_ty unicode]
-
-ppr_mono_ty ctxt_prec (HsOpTy _ ty1 op ty2) unicode
-  = maybeParen ctxt_prec pREC_FUN $
-    ppr_mono_lty pREC_OP ty1 unicode <+> ppr_op <+> ppr_mono_lty pREC_OP ty2 unicode
+ppr_mono_lty :: LHsType DocNameI -> Bool -> LaTeX
+ppr_mono_lty ty unicode = ppr_mono_ty (unLoc ty) unicode
+
+
+ppr_mono_ty :: HsType DocNameI -> Bool -> LaTeX
+ppr_mono_ty (HsForAllTy _ tvs ty) unicode
+  = sep [ hsep (forallSymbol unicode : ppTyVars tvs) <> dot
+        , ppr_mono_lty ty unicode ]
+ppr_mono_ty (HsQualTy _ ctxt ty) unicode
+  = sep [ ppLContext ctxt unicode
+        , ppr_mono_lty ty unicode ]
+ppr_mono_ty (HsFunTy _ ty1 ty2)   u
+  = sep [ ppr_mono_lty ty1 u
+        , arrow u <+> ppr_mono_lty ty2 u ]
+
+ppr_mono_ty (HsBangTy _ b ty)     u = ppBang b <> ppLParendType u ty
+ppr_mono_ty (HsTyVar _ NotPromoted (L _ name)) _ = ppDocName name
+ppr_mono_ty (HsTyVar _ Promoted    (L _ name)) _ = char '\'' <> ppDocName name
+ppr_mono_ty (HsTupleTy _ con tys) u = tupleParens con (map (ppLType u) tys)
+ppr_mono_ty (HsSumTy _ tys) u       = sumParens (map (ppLType u) tys)
+ppr_mono_ty (HsKindSig _ ty kind) u = parens (ppr_mono_lty ty u <+> dcolon u <+> ppLKind u kind)
+ppr_mono_ty (HsListTy _ ty)       u = brackets (ppr_mono_lty ty u)
+ppr_mono_ty (HsIParamTy _ (L _ n) ty) u = brackets (ppIPName n <+> dcolon u <+> ppr_mono_lty ty u)
+ppr_mono_ty (HsSpliceTy {})     _ = error "ppr_mono_ty HsSpliceTy"
+ppr_mono_ty (HsRecTy {})        _ = text "{..}"
+ppr_mono_ty (XHsType (NHsCoreTy {}))  _ = error "ppr_mono_ty HsCoreTy"
+ppr_mono_ty (HsExplicitListTy _ Promoted tys) u = Pretty.quote $ brackets $ hsep $ punctuate comma $ map (ppLType u) tys
+ppr_mono_ty (HsExplicitListTy _ NotPromoted tys) u = brackets $ hsep $ punctuate comma $ map (ppLType u) tys
+ppr_mono_ty (HsExplicitTupleTy _ tys) u = Pretty.quote $ parenList $ map (ppLType u) tys
+
+ppr_mono_ty (HsAppTy _ fun_ty arg_ty) unicode
+  = hsep [ppr_mono_lty fun_ty unicode, ppr_mono_lty arg_ty unicode]
+
+ppr_mono_ty (HsOpTy _ ty1 op ty2) unicode
+  = ppr_mono_lty ty1 unicode <+> ppr_op <+> ppr_mono_lty ty2 unicode
   where
     ppr_op = if not (isSymOcc occName) then char '`' <> ppLDocName op <> char '`' else ppLDocName op
     occName = nameOccName . getName . unLoc $ op
 
-ppr_mono_ty ctxt_prec (HsParTy _ ty) unicode
---  = parens (ppr_mono_lty pREC_TOP ty)
-  = ppr_mono_lty ctxt_prec ty unicode
+ppr_mono_ty (HsParTy _ ty) unicode
+  = parens (ppr_mono_lty ty unicode)
+--  = ppr_mono_lty ty unicode
 
-ppr_mono_ty ctxt_prec (HsDocTy _ ty _) unicode
-  = ppr_mono_lty ctxt_prec ty unicode
+ppr_mono_ty (HsDocTy _ ty _) unicode
+  = ppr_mono_lty ty unicode
 
-ppr_mono_ty _ (HsWildCardTy (AnonWildCard _)) _ = char '_'
+ppr_mono_ty (HsWildCardTy (AnonWildCard _)) _ = char '_'
 
-ppr_mono_ty _ (HsTyLit _ t) u = ppr_tylit t u
-ppr_mono_ty _ (HsStarTy _ isUni) unicode = starSymbol (isUni || unicode)
+ppr_mono_ty (HsTyLit _ t) u = ppr_tylit t u
+ppr_mono_ty (HsStarTy _ isUni) unicode = starSymbol (isUni || unicode)
 
 
 ppr_tylit :: HsTyLit -> Bool -> LaTeX
@@ -1006,15 +986,6 @@ ppr_tylit (HsStrTy _ s) _ = text (show s)
   -- XXX: Do something with Unicode parameter?
 
 
-ppr_fun_ty :: Int -> LHsType DocNameI -> LHsType DocNameI -> Bool -> LaTeX
-ppr_fun_ty ctxt_prec ty1 ty2 unicode
-  = let p1 = ppr_mono_lty pREC_FUN ty1 unicode
-        p2 = ppr_mono_lty pREC_TOP ty2 unicode
-    in
-    maybeParen ctxt_prec pREC_FUN $
-    sep [p1, arrow unicode <+> p2]
-
-
 -------------------------------------------------------------------------------
 -- * Names
 -------------------------------------------------------------------------------
diff --git a/haddock-api/src/Haddock/Backends/Xhtml/Decl.hs b/haddock-api/src/Haddock/Backends/Xhtml/Decl.hs
index fdb80141..cc271fef 100644
--- a/haddock-api/src/Haddock/Backends/Xhtml/Decl.hs
+++ b/haddock-api/src/Haddock/Backends/Xhtml/Decl.hs
@@ -620,9 +620,9 @@ ppInstances links origin instances splice unicode pkg qual
   -- force Splice = True to use line URLs
   where
     instName = getOccString origin
-    instDecl :: Int -> DocInstance DocNameI -> (SubDecl,Located DocName)
+    instDecl :: Int -> DocInstance DocNameI -> (SubDecl, Maybe Module, Located DocName)
     instDecl no (inst, mdoc, loc, mdl) =
-        ((ppInstHead links splice unicode qual mdoc origin False no inst mdl), loc)
+        ((ppInstHead links splice unicode qual mdoc origin False no inst mdl), mdl, loc)
 
 
 ppOrphanInstances :: LinksInfo
@@ -635,9 +635,9 @@ ppOrphanInstances links instances splice unicode pkg qual
     instOrigin :: InstHead name -> InstOrigin (IdP name)
     instOrigin inst = OriginClass (ihdClsName inst)
 
-    instDecl :: Int -> DocInstance DocNameI -> (SubDecl,Located DocName)
+    instDecl :: Int -> DocInstance DocNameI -> (SubDecl, Maybe Module, Located DocName)
     instDecl no (inst, mdoc, loc, mdl) =
-        ((ppInstHead links splice unicode qual mdoc (instOrigin inst) True no inst mdl), loc)
+        ((ppInstHead links splice unicode qual mdoc (instOrigin inst) True no inst Nothing), mdl, loc)
 
 
 ppInstHead :: LinksInfo -> Splice -> Unicode -> Qualification
@@ -1101,38 +1101,18 @@ sumParens = ubxSumList
 -- * Rendering of HsType
 --------------------------------------------------------------------------------
 
-
-pREC_TOP, pREC_CTX, pREC_FUN, pREC_OP, pREC_CON :: Int
-
-pREC_TOP = 0 :: Int   -- type in ParseIface.y in GHC
-pREC_CTX = 1 :: Int   -- Used for single contexts, eg. ctx => type
-                      -- (as opposed to (ctx1, ctx2) => type)
-pREC_FUN = 2 :: Int   -- btype in ParseIface.y in GHC
-                      -- Used for LH arg of (->)
-pREC_OP  = 3 :: Int   -- Used for arg of any infix operator
-                      -- (we don't keep their fixities around)
-pREC_CON = 4 :: Int   -- Used for arg of type applicn:
-                      -- always parenthesise unless atomic
-
-maybeParen :: Int           -- Precedence of context
-           -> Int           -- Precedence of top-level operator
-           -> Html -> Html  -- Wrap in parens if (ctxt >= op)
-maybeParen ctxt_prec op_prec p | ctxt_prec >= op_prec = parens p
-                               | otherwise            = p
-
-
 ppLType, ppLParendType, ppLFunLhType :: Unicode -> Qualification -> HideEmptyContexts -> Located (HsType DocNameI) -> Html
 ppLType       unicode qual emptyCtxts y = ppType unicode qual emptyCtxts (unLoc y)
 ppLParendType unicode qual emptyCtxts y = ppParendType unicode qual emptyCtxts (unLoc y)
 ppLFunLhType  unicode qual emptyCtxts y = ppFunLhType unicode qual emptyCtxts (unLoc y)
 
 ppCtxType :: Unicode -> Qualification -> HsType DocNameI -> Html
-ppCtxType unicode qual ty = ppr_mono_ty pREC_CTX ty unicode qual HideEmptyContexts
+ppCtxType unicode qual ty = ppr_mono_ty (reparenTypePrec PREC_CTX ty) unicode qual HideEmptyContexts
 
 ppType, ppParendType, ppFunLhType :: Unicode -> Qualification -> HideEmptyContexts -> HsType DocNameI -> Html
-ppType       unicode qual emptyCtxts ty = ppr_mono_ty pREC_TOP ty unicode qual emptyCtxts
-ppParendType unicode qual emptyCtxts ty = ppr_mono_ty pREC_CON ty unicode qual emptyCtxts
-ppFunLhType  unicode qual emptyCtxts ty = ppr_mono_ty pREC_FUN ty unicode qual emptyCtxts
+ppType       unicode qual emptyCtxts ty = ppr_mono_ty (reparenTypePrec PREC_TOP ty) unicode qual emptyCtxts
+ppParendType unicode qual emptyCtxts ty = ppr_mono_ty (reparenTypePrec PREC_CON ty) unicode qual emptyCtxts
+ppFunLhType  unicode qual emptyCtxts ty = ppr_mono_ty (reparenTypePrec PREC_FUN ty) unicode qual emptyCtxts
 
 ppHsTyVarBndr :: Unicode -> Qualification -> HsTyVarBndr DocNameI -> Html
 ppHsTyVarBndr _       qual (UserTyVar _ (L _ name)) =
@@ -1146,7 +1126,7 @@ ppLKind :: Unicode -> Qualification -> LHsKind DocNameI -> Html
 ppLKind unicode qual y = ppKind unicode qual (unLoc y)
 
 ppKind :: Unicode -> Qualification -> HsKind DocNameI -> Html
-ppKind unicode qual ki = ppr_mono_ty pREC_TOP ki unicode qual HideEmptyContexts
+ppKind unicode qual ki = ppr_mono_ty (reparenTypePrec PREC_TOP ki) unicode qual HideEmptyContexts
 
 patSigContext :: LHsType name -> HideEmptyContexts
 patSigContext typ | hasNonEmptyContext typ && isFirstContextEmpty typ =  ShowEmptyToplevelContexts
@@ -1177,57 +1157,56 @@ ppPatSigType unicode qual typ =
 ppForAllPart :: Unicode -> Qualification -> [LHsTyVarBndr DocNameI] -> Html
 ppForAllPart unicode qual tvs = hsep (forallSymbol unicode : ppTyVars unicode qual tvs) +++ dot
 
-ppr_mono_lty :: Int -> LHsType DocNameI -> Unicode -> Qualification -> HideEmptyContexts -> Html
-ppr_mono_lty ctxt_prec ty = ppr_mono_ty ctxt_prec (unLoc ty)
+ppr_mono_lty :: LHsType DocNameI -> Unicode -> Qualification -> HideEmptyContexts -> Html
+ppr_mono_lty ty = ppr_mono_ty (unLoc ty)
 
 
-ppr_mono_ty :: Int -> HsType DocNameI -> Unicode -> Qualification -> HideEmptyContexts -> Html
-ppr_mono_ty ctxt_prec (HsForAllTy _ tvs ty) unicode qual emptyCtxts
-  = maybeParen ctxt_prec pREC_FUN $
-    ppForAllPart unicode qual tvs <+> ppr_mono_lty pREC_TOP ty unicode qual emptyCtxts
+ppr_mono_ty :: HsType DocNameI -> Unicode -> Qualification -> HideEmptyContexts -> Html
+ppr_mono_ty (HsForAllTy _ tvs ty) unicode qual emptyCtxts
+  = ppForAllPart unicode qual tvs <+> ppr_mono_lty ty unicode qual emptyCtxts
 
-ppr_mono_ty ctxt_prec (HsQualTy _ ctxt ty) unicode qual emptyCtxts
-  = maybeParen ctxt_prec pREC_FUN $
-    ppLContext ctxt unicode qual emptyCtxts <+> ppr_mono_lty pREC_TOP ty unicode qual emptyCtxts
+ppr_mono_ty (HsQualTy _ ctxt ty) unicode qual emptyCtxts
+  = ppLContext ctxt unicode qual emptyCtxts <+> ppr_mono_lty ty unicode qual emptyCtxts
 
 -- UnicodeSyntax alternatives
-ppr_mono_ty _ (HsTyVar _ _ (L _ name)) True _ _
+ppr_mono_ty (HsTyVar _ _ (L _ name)) True _ _
   | getOccString (getName name) == "(->)" = toHtml "(→)"
 
-ppr_mono_ty _ (HsBangTy _ b ty) u q _ =
+ppr_mono_ty (HsBangTy _ b ty) u q _ =
   ppBang b +++ ppLParendType u q HideEmptyContexts ty
-ppr_mono_ty _ (HsTyVar _ _ (L _ name)) _ q _ =
+ppr_mono_ty (HsTyVar _ _ (L _ name)) _ q _ =
   ppDocName q Prefix True name
-ppr_mono_ty _ (HsStarTy _ isUni) u _ _ =
+ppr_mono_ty (HsStarTy _ isUni) u _ _ =
   toHtml (if u || isUni then "★" else "*")
-ppr_mono_ty ctxt_prec (HsFunTy _ ty1 ty2) u q e =
-  ppr_fun_ty ctxt_prec ty1 ty2 u q e
-ppr_mono_ty _ (HsTupleTy _ con tys) u q _ =
+ppr_mono_ty (HsFunTy _ ty1 ty2) u q e =
+  hsep [ ppr_mono_lty ty1 u q HideEmptyContexts
+       , arrow u <+> ppr_mono_lty ty2 u q e
+       ]
+ppr_mono_ty (HsTupleTy _ con tys) u q _ =
   tupleParens con (map (ppLType u q HideEmptyContexts) tys)
-ppr_mono_ty _ (HsSumTy _ tys) u q _ =
+ppr_mono_ty (HsSumTy _ tys) u q _ =
   sumParens (map (ppLType u q HideEmptyContexts) tys)
-ppr_mono_ty _ (HsKindSig _ ty kind) u q e =
-  parens (ppr_mono_lty pREC_TOP ty u q e <+> dcolon u <+> ppLKind u q kind)
-ppr_mono_ty _         (HsListTy _ ty)       u q _ = brackets (ppr_mono_lty pREC_TOP ty u q HideEmptyContexts)
-ppr_mono_ty ctxt_prec (HsIParamTy _ (L _ n) ty) u q _ =
-    maybeParen ctxt_prec pREC_CTX $ ppIPName n <+> dcolon u <+> ppr_mono_lty pREC_TOP ty u q HideEmptyContexts
-ppr_mono_ty _         (HsSpliceTy {})     _ _ _ = error "ppr_mono_ty HsSpliceTy"
-ppr_mono_ty _         (HsRecTy {})        _ _ _ = toHtml "{..}"
+ppr_mono_ty (HsKindSig _ ty kind) u q e =
+  parens (ppr_mono_lty ty u q e <+> dcolon u <+> ppLKind u q kind)
+ppr_mono_ty (HsListTy _ ty)       u q _ = brackets (ppr_mono_lty ty u q HideEmptyContexts)
+ppr_mono_ty (HsIParamTy _ (L _ n) ty) u q _ =
+  ppIPName n <+> dcolon u <+> ppr_mono_lty ty u q HideEmptyContexts
+ppr_mono_ty (HsSpliceTy {})     _ _ _ = error "ppr_mono_ty HsSpliceTy"
+ppr_mono_ty (HsRecTy {})        _ _ _ = toHtml "{..}"
        -- Can now legally occur in ConDeclGADT, the output here is to provide a
        -- placeholder in the signature, which is followed by the field
        -- declarations.
-ppr_mono_ty _         (XHsType (NHsCoreTy {})) _ _ _ = error "ppr_mono_ty HsCoreTy"
-ppr_mono_ty _         (HsExplicitListTy _ Promoted tys) u q _ = promoQuote $ brackets $ hsep $ punctuate comma $ map (ppLType u q HideEmptyContexts) tys
-ppr_mono_ty _         (HsExplicitListTy _ NotPromoted tys) u q _ = brackets $ hsep $ punctuate comma $ map (ppLType u q HideEmptyContexts) tys
-ppr_mono_ty _         (HsExplicitTupleTy _ tys) u q _ = promoQuote $ parenList $ map (ppLType u q HideEmptyContexts) tys
-
-ppr_mono_ty ctxt_prec (HsAppTy _ fun_ty arg_ty) unicode qual _
-  = maybeParen ctxt_prec pREC_CON $
-    hsep [ppr_mono_lty pREC_FUN fun_ty unicode qual HideEmptyContexts, ppr_mono_lty pREC_CON arg_ty unicode qual HideEmptyContexts]
-
-ppr_mono_ty ctxt_prec (HsOpTy _ ty1 op ty2) unicode qual _
-  = maybeParen ctxt_prec pREC_FUN $
-    ppr_mono_lty pREC_OP ty1 unicode qual HideEmptyContexts <+> ppr_op <+> ppr_mono_lty pREC_OP ty2 unicode qual HideEmptyContexts
+ppr_mono_ty (XHsType (NHsCoreTy {})) _ _ _ = error "ppr_mono_ty HsCoreTy"
+ppr_mono_ty (HsExplicitListTy _ Promoted tys) u q _ = promoQuote $ brackets $ hsep $ punctuate comma $ map (ppLType u q HideEmptyContexts) tys
+ppr_mono_ty (HsExplicitListTy _ NotPromoted tys) u q _ = brackets $ hsep $ punctuate comma $ map (ppLType u q HideEmptyContexts) tys
+ppr_mono_ty (HsExplicitTupleTy _ tys) u q _ = promoQuote $ parenList $ map (ppLType u q HideEmptyContexts) tys
+
+ppr_mono_ty (HsAppTy _ fun_ty arg_ty) unicode qual _
+  = hsep [ ppr_mono_lty fun_ty unicode qual HideEmptyContexts
+         , ppr_mono_lty arg_ty unicode qual HideEmptyContexts ]
+
+ppr_mono_ty (HsOpTy _ ty1 op ty2) unicode qual _
+  = ppr_mono_lty ty1 unicode qual HideEmptyContexts <+> ppr_op <+> ppr_mono_lty ty2 unicode qual HideEmptyContexts
   where
     -- `(:)` is valid in type signature only as constructor to promoted list
     -- and needs to be quoted in code so we explicitly quote it here too.
@@ -1236,24 +1215,17 @@ ppr_mono_ty ctxt_prec (HsOpTy _ ty1 op ty2) unicode qual _
         | otherwise = ppr_op'
     ppr_op' = ppLDocName qual Infix op
 
-ppr_mono_ty ctxt_prec (HsParTy _ ty) unicode qual emptyCtxts
---  = parens (ppr_mono_lty pREC_TOP ty)
-  = ppr_mono_lty ctxt_prec ty unicode qual emptyCtxts
+ppr_mono_ty (HsParTy _ ty) unicode qual emptyCtxts
+  = parens (ppr_mono_lty ty unicode qual emptyCtxts)
+--  = parens (ppr_mono_lty ctxt_prec ty unicode qual emptyCtxts)
 
-ppr_mono_ty ctxt_prec (HsDocTy _ ty _) unicode qual emptyCtxts
-  = ppr_mono_lty ctxt_prec ty unicode qual emptyCtxts
+ppr_mono_ty (HsDocTy _ ty _) unicode qual emptyCtxts
+  = ppr_mono_lty ty unicode qual emptyCtxts
 
-ppr_mono_ty _ (HsWildCardTy (AnonWildCard _)) _ _ _ = char '_'
-ppr_mono_ty _ (HsTyLit _ n) _ _ _ = ppr_tylit n
+ppr_mono_ty (HsWildCardTy (AnonWildCard _)) _ _ _ = char '_'
+ppr_mono_ty (HsTyLit _ n) _ _ _ = ppr_tylit n
 
 ppr_tylit :: HsTyLit -> Html
 ppr_tylit (HsNumTy _ n) = toHtml (show n)
 ppr_tylit (HsStrTy _ s) = toHtml (show s)
 
-ppr_fun_ty :: Int -> LHsType DocNameI -> LHsType DocNameI -> Unicode -> Qualification -> HideEmptyContexts -> Html
-ppr_fun_ty ctxt_prec ty1 ty2 unicode qual emptyCtxts
-  = let p1 = ppr_mono_lty pREC_FUN ty1 unicode qual HideEmptyContexts
-        p2 = ppr_mono_lty pREC_TOP ty2 unicode qual emptyCtxts
-    in
-    maybeParen ctxt_prec pREC_FUN $
-    hsep [p1, arrow unicode <+> p2]
diff --git a/haddock-api/src/Haddock/Backends/Xhtml/Layout.hs b/haddock-api/src/Haddock/Backends/Xhtml/Layout.hs
index 501caa4b..1c44ffda 100644
--- a/haddock-api/src/Haddock/Backends/Xhtml/Layout.hs
+++ b/haddock-api/src/Haddock/Backends/Xhtml/Layout.hs
@@ -40,7 +40,6 @@ module Haddock.Backends.Xhtml.Layout (
   topDeclElem, declElem,
 ) where
 
-
 import Haddock.Backends.Xhtml.DocMarkup
 import Haddock.Backends.Xhtml.Types
 import Haddock.Backends.Xhtml.Utils
@@ -48,6 +47,7 @@ import Haddock.Types
 import Haddock.Utils (makeAnchorId, nameAnchorId)
 import qualified Data.Map as Map
 import Text.XHtml hiding ( name, title, quote )
+import Data.Maybe (fromMaybe)
 
 import FastString            ( unpackFS )
 import GHC
@@ -151,20 +151,22 @@ subTable pkg qual decls = Just $ table << aboves (concatMap subRow decls)
 
 -- | Sub table with source information (optional).
 subTableSrc :: Maybe Package -> Qualification -> LinksInfo -> Bool
-            -> [(SubDecl,Located DocName)] -> Maybe Html
+            -> [(SubDecl, Maybe Module, Located DocName)] -> Maybe Html
 subTableSrc _ _ _ _ [] = Nothing
 subTableSrc pkg qual lnks splice decls = Just $ table << aboves (concatMap subRow decls)
   where
-    subRow ((decl, mdoc, subs),L loc dn) =
+    subRow ((decl, mdoc, subs), mdl, L loc dn) =
       (td ! [theclass "src clearfix"] <<
         (thespan ! [theclass "inst-left"] << decl)
-        <+> linkHtml loc dn
+        <+> linkHtml loc mdl dn
       <->
       docElement td << fmap (docToHtml Nothing pkg qual) mdoc
       )
       : map (cell . (td <<)) subs
-    linkHtml loc@(RealSrcSpan _) dn = links lnks loc splice dn
-    linkHtml _ _ = noHtml
+
+    linkHtml :: SrcSpan -> Maybe Module -> DocName -> Html
+    linkHtml loc@(RealSrcSpan _) mdl dn = links lnks loc splice mdl dn
+    linkHtml _ _ _ = noHtml
 
 subBlock :: [Html] -> Maybe Html
 subBlock [] = Nothing
@@ -197,7 +199,7 @@ subEquations pkg qual = divSubDecls "equations" "Equations" . subTable pkg qual
 subInstances :: Maybe Package -> Qualification
              -> String -- ^ Class name, used for anchor generation
              -> LinksInfo -> Bool
-             -> [(SubDecl,Located DocName)] -> Html
+             -> [(SubDecl, Maybe Module, Located DocName)] -> Html
 subInstances pkg qual nm lnks splice = maybe noHtml wrap . instTable
   where
     wrap contents = subSection (collapseDetails id_ DetailsOpen (summary +++ contents))
@@ -209,7 +211,7 @@ subInstances pkg qual nm lnks splice = maybe noHtml wrap . instTable
 
 subOrphanInstances :: Maybe Package -> Qualification
                    -> LinksInfo -> Bool
-                   -> [(SubDecl,Located DocName)] -> Html
+                   -> [(SubDecl, Maybe Module, Located DocName)] -> Html
 subOrphanInstances pkg qual lnks splice  = maybe noHtml wrap . instTable
   where
     wrap = ((h1 << "Orphan instances") +++)
@@ -268,13 +270,13 @@ declElem = paragraph ! [theclass "src"]
 -- it adds a source and wiki link at the right hand side of the box
 topDeclElem :: LinksInfo -> SrcSpan -> Bool -> [DocName] -> Html -> Html
 topDeclElem lnks loc splice names html =
-    declElem << (html <+> (links lnks loc splice $ head names))
+    declElem << (html <+> (links lnks loc splice Nothing $ head names))
         -- FIXME: is it ok to simply take the first name?
 
 -- | Adds a source and wiki link at the right hand side of the box.
 -- Name must be documented, otherwise we wouldn't get here.
-links :: LinksInfo -> SrcSpan -> Bool -> DocName -> Html
-links ((_,_,sourceMap,lineMap), (_,_,maybe_wiki_url)) loc splice docName@(Documented n mdl) =
+links :: LinksInfo -> SrcSpan -> Bool -> Maybe Module -> DocName -> Html
+links ((_,_,sourceMap,lineMap), (_,_,maybe_wiki_url)) loc splice mdl' docName@(Documented n mdl) =
   srcLink <+> wikiLink <+> (selfLink ! [theclass "selflink"] << "#")
   where selfLink = linkedAnchor (nameAnchorId (nameOccName (getName docName)))
 
@@ -298,12 +300,13 @@ links ((_,_,sourceMap,lineMap), (_,_,maybe_wiki_url)) loc splice docName@(Docume
 
         -- For source links, we want to point to the original module,
         -- because only that will have the source.
-        -- TODO: do something about type instances. They will point to
-        -- the module defining the type family, which is wrong.
-        origMod = nameModule n
+        --
+        -- 'mdl'' is a way of "overriding" the module. Without it, instances
+        -- will point to the module defining the class/family, which is wrong.
+        origMod = fromMaybe (nameModule n) mdl'
         origPkg = moduleUnitId origMod
 
         fname = case loc of
           RealSrcSpan l -> unpackFS (srcSpanFile l)
           UnhelpfulSpan _ -> error "links: UnhelpfulSpan"
-links _ _ _ _ = noHtml
+links _ _ _ _ _ = noHtml
diff --git a/haddock-api/src/Haddock/Convert.hs b/haddock-api/src/Haddock/Convert.hs
index bf6fbab0..6eee353b 100644
--- a/haddock-api/src/Haddock/Convert.hs
+++ b/haddock-api/src/Haddock/Convert.hs
@@ -31,7 +31,7 @@ import NameSet ( emptyNameSet )
 import RdrName ( mkVarUnqual )
 import PatSyn
 import SrcLoc ( Located, noLoc, unLoc, GenLocated(..), srcLocSpan )
-import TcType ( tcSplitSigmaTy )
+import TcType
 import TyCon
 import Type
 import TyCoRep
@@ -527,7 +527,7 @@ synifyType _ (FunTy t1 t2) = let
   s2 = synifyType WithinType t2
   in noLoc $ HsFunTy noExt s1 s2
 synifyType s forallty@(ForAllTy _tv _ty) =
-  let (tvs, ctx, tau) = tcSplitSigmaTy forallty
+  let (tvs, ctx, tau) = tcSplitSigmaTyPreserveSynonyms forallty
       sPhi = HsQualTy { hst_ctxt = synifyCtx ctx
                       , hst_xqual   = noExt
                       , hst_body = synifyType WithinType tau }
@@ -626,3 +626,47 @@ synifyFamInst fi opaque = do
     ts' = synifyTypes ts
     annot_ts = zipWith3 annotHsType is_poly_tvs ts ts'
     is_poly_tvs = mkIsPolyTvs (tyConVisibleTyVars fam_tc)
+
+{-
+Note [Invariant: Never expand type synonyms]
+
+In haddock, we never want to expand a type synonym that may be presented to the
+user, as we want to keep the link to the abstraction captured in the synonym.
+
+All code in Haddock.Convert must make sure that this invariant holds.
+
+See https://github.com/haskell/haddock/issues/879 for a bug where this
+invariant didn't hold.
+-}
+
+-- | A version of 'TcType.tcSplitSigmaTy' that preserves type synonyms.
+--
+-- See Note [Invariant: Never expand type synonyms]
+tcSplitSigmaTyPreserveSynonyms :: Type -> ([TyVar], ThetaType, Type)
+tcSplitSigmaTyPreserveSynonyms ty =
+    case tcSplitForAllTysPreserveSynonyms ty of
+      (tvs, rho) -> case tcSplitPhiTyPreserveSynonyms rho of
+        (theta, tau) -> (tvs, theta, tau)
+
+-- | See Note [Invariant: Never expand type synonyms]
+tcSplitForAllTysPreserveSynonyms :: Type -> ([TyVar], Type)
+tcSplitForAllTysPreserveSynonyms ty = split ty ty []
+  where
+    split _       (ForAllTy (TvBndr tv _) ty') tvs = split ty' ty' (tv:tvs)
+    split orig_ty _                            tvs = (reverse tvs, orig_ty)
+
+-- | See Note [Invariant: Never expand type synonyms]
+tcSplitPhiTyPreserveSynonyms :: Type -> (ThetaType, Type)
+tcSplitPhiTyPreserveSynonyms ty0 = split ty0 []
+  where
+    split ty ts
+      = case tcSplitPredFunTyPreserveSynonyms_maybe ty of
+          Just (pred_, ty') -> split ty' (pred_:ts)
+          Nothing           -> (reverse ts, ty)
+
+-- | See Note [Invariant: Never expand type synonyms]
+tcSplitPredFunTyPreserveSynonyms_maybe :: Type -> Maybe (PredType, Type)
+tcSplitPredFunTyPreserveSynonyms_maybe (FunTy arg res)
+  | isPredTy arg = Just (arg, res)
+tcSplitPredFunTyPreserveSynonyms_maybe _
+  = Nothing
diff --git a/haddock-api/src/Haddock/GhcUtils.hs b/haddock-api/src/Haddock/GhcUtils.hs
index b2c34bb4..e7d80969 100644
--- a/haddock-api/src/Haddock/GhcUtils.hs
+++ b/haddock-api/src/Haddock/GhcUtils.hs
@@ -31,6 +31,8 @@ import GHC
 import Class
 import DynFlags
 
+import HsTypes (HsType(..))
+
 
 moduleString :: Module -> String
 moduleString = moduleNameString . moduleName
@@ -226,6 +228,100 @@ getGADTConTypeG (ConDeclH98 {}) = panic "getGADTConTypeG"
   -- Should only be called on ConDeclGADT
 getGADTConTypeG (XConDecl {}) = panic "getGADTConTypeG"
 
+
+-------------------------------------------------------------------------------
+-- * Parenthesization
+-------------------------------------------------------------------------------
+
+-- | Precedence level (inside the 'HsType' AST).
+data Precedence
+  = PREC_TOP  -- ^ precedence of 'type' production in GHC's parser
+
+  | PREC_CTX  -- ^ Used for single contexts, eg. ctx => type
+              -- (as opposed to (ctx1, ctx2) => type)
+
+  | PREC_FUN  -- ^ precedence of 'btype' production in GHC's parser
+              -- (used for LH arg of (->))
+
+  | PREC_OP   -- ^ arg of any infix operator
+              -- (we don't keep have fixity info)
+
+  | PREC_CON  -- ^ arg of type application: always parenthesize unless atomic
+  deriving (Eq, Ord)
+
+-- | Add in extra 'HsParTy' where needed to ensure that what would be printed
+-- out using 'ppr' has enough parentheses to be re-parsed properly.
+--
+-- We cannot add parens that may be required by fixities because we do not have
+-- any fixity information to work with in the first place :(.
+reparenTypePrec :: (XParTy a ~ NoExt) => Precedence -> HsType a -> HsType a
+reparenTypePrec = go
+  where
+
+  -- Shorter name for 'reparenType'
+  go :: (XParTy a ~ NoExt) => Precedence -> HsType a -> HsType a
+  go _ (HsBangTy x b ty)     = HsBangTy x b (reparenLType ty)
+  go _ (HsTupleTy x con tys) = HsTupleTy x con (map reparenLType tys)
+  go _ (HsSumTy x tys)       = HsSumTy x (map reparenLType tys)
+  go _ (HsKindSig x ty kind) = HsKindSig x (reparenLType ty) (reparenLType kind)
+  go _ (HsListTy x ty)       = HsListTy x (reparenLType ty)
+  go _ (HsRecTy x flds)      = HsRecTy x (map (fmap reparenConDeclField) flds)
+  go p (HsDocTy x ty d)      = HsDocTy x (goL p ty) d
+  go _ (HsExplicitListTy x p tys) = HsExplicitListTy x p (map reparenLType tys)
+  go _ (HsExplicitTupleTy x tys) = HsExplicitTupleTy x (map reparenLType tys)
+  go p (HsIParamTy x n ty)
+    = paren p PREC_CTX $ HsIParamTy x n (reparenLType ty)
+  go p (HsForAllTy x tvs ty)
+    = paren p PREC_CTX $ HsForAllTy x (map (fmap reparenTyVar) tvs) (reparenLType ty)
+  go p (HsQualTy x ctxt ty)
+    = paren p PREC_FUN $ HsQualTy x (fmap (map reparenLType) ctxt) (reparenLType ty)
+  go p (HsFunTy x ty1 ty2)
+    = paren p PREC_FUN $ HsFunTy x (goL PREC_FUN ty1) (goL PREC_TOP ty2)
+  go p (HsAppTy x fun_ty arg_ty)
+    = paren p PREC_CON $ HsAppTy x (goL PREC_FUN fun_ty) (goL PREC_CON arg_ty)
+  go p (HsOpTy x ty1 op ty2)
+    = paren p PREC_FUN $ HsOpTy x (goL PREC_OP ty1) op (goL PREC_OP ty2)
+  go p (HsParTy _ t) = unLoc $ goL p t -- pretend the paren doesn't exist - it will be added back if needed
+  go _ t@HsTyVar{} = t
+  go _ t@HsStarTy{} = t
+  go _ t@HsSpliceTy{} = t
+  go _ t@HsTyLit{} = t
+  go _ t@HsWildCardTy{} = t
+  go _ t@XHsType{} = t
+
+  -- Located variant of 'go'
+  goL :: (XParTy a ~ NoExt) => Precedence -> LHsType a -> LHsType a
+  goL ctxt_prec = fmap (go ctxt_prec)
+
+  -- Optionally wrap a type in parens
+  paren :: (XParTy a ~ NoExt)
+        => Precedence            -- Precedence of context
+        -> Precedence            -- Precedence of top-level operator
+        -> HsType a -> HsType a  -- Wrap in parens if (ctxt >= op)
+  paren ctxt_prec op_prec | ctxt_prec >= op_prec = HsParTy NoExt . noLoc
+                          | otherwise            = id
+
+
+-- | Add parenthesis around the types in a 'HsType' (see 'reparenTypePrec')
+reparenType :: (XParTy a ~ NoExt) => HsType a -> HsType a
+reparenType = reparenTypePrec PREC_TOP
+
+-- | Add parenthesis around the types in a 'LHsType' (see 'reparenTypePrec')
+reparenLType :: (XParTy a ~ NoExt) => LHsType a -> LHsType a
+reparenLType = fmap reparenType
+
+-- | Add parenthesis around the types in a 'HsTyVarBndr' (see 'reparenTypePrec')
+reparenTyVar :: (XParTy a ~ NoExt) => HsTyVarBndr a -> HsTyVarBndr a
+reparenTyVar (UserTyVar x n) = UserTyVar x n
+reparenTyVar (KindedTyVar x n kind) = KindedTyVar x n (reparenLType kind)
+reparenTyVar v@XTyVarBndr{} = v
+
+-- | Add parenthesis around the types in a 'ConDeclField' (see 'reparenTypePrec')
+reparenConDeclField :: (XParTy a ~ NoExt) => ConDeclField a -> ConDeclField a
+reparenConDeclField (ConDeclField x n t d) = ConDeclField x n (reparenLType t) d
+reparenConDeclField c@XConDeclField{} = c
+
+
 -------------------------------------------------------------------------------
 -- * Located
 -------------------------------------------------------------------------------
diff --git a/haddock-api/src/Haddock/Interface/Create.hs b/haddock-api/src/Haddock/Interface/Create.hs
index 78242990..c4df2090 100644
--- a/haddock-api/src/Haddock/Interface/Create.hs
+++ b/haddock-api/src/Haddock/Interface/Create.hs
@@ -419,9 +419,12 @@ mkMaps dflags pkgName gre instances decls = do
     instanceMap = M.fromList [ (getSrcSpan n, n) | n <- instances ]
 
     names :: SrcSpan -> HsDecl GhcRn -> [Name]
-    names l (InstD _ d) = maybeToList (M.lookup loc instanceMap) -- See note [2].
+    names _ (InstD _ d) = maybeToList (M.lookup loc instanceMap) -- See note [2].
       where loc = case d of
-              TyFamInstD _ _ -> l -- The CoAx's loc is the whole line, but only for TFs
+              -- The CoAx's loc is the whole line, but only for TFs. The
+              -- workaround is to dig into the family instance declaration and
+              -- get the identifier with the right location.
+              TyFamInstD _ (TyFamInstDecl d') -> getLoc (feqn_tycon (hsib_body d'))
               _ -> getInstLoc d
     names l (DerivD {}) = maybeToList (M.lookup l instanceMap) -- See note [2].
     names _ decl = getMainDeclBinder decl
diff --git a/haddock-api/src/Haddock/Types.hs b/haddock-api/src/Haddock/Types.hs
index da422562..ea74043d 100644
--- a/haddock-api/src/Haddock/Types.hs
+++ b/haddock-api/src/Haddock/Types.hs
@@ -28,6 +28,7 @@ module Haddock.Types (
 import Control.Exception
 import Control.Arrow hiding ((<+>))
 import Control.DeepSeq
+import Control.Monad.IO.Class (MonadIO(..))
 import Data.Typeable
 import Data.Map (Map)
 import Data.Data (Data)
@@ -661,6 +662,8 @@ instance Monad ErrMsgGhc where
   m >>= k = WriterGhc $ runWriterGhc m >>= \ (a, msgs1) ->
                fmap (second (msgs1 ++)) (runWriterGhc (k a))
 
+instance MonadIO ErrMsgGhc where
+  liftIO m = WriterGhc (fmap (\x -> (x, [])) (liftIO m))
 
 -----------------------------------------------------------------------------
 -- * Pass sensitive types
diff --git a/haddock-library/test/Documentation/Haddock/ParserSpec.hs b/haddock-library/test/Documentation/Haddock/ParserSpec.hs
index 86ed3b35..0449c917 100644
--- a/haddock-library/test/Documentation/Haddock/ParserSpec.hs
+++ b/haddock-library/test/Documentation/Haddock/ParserSpec.hs
@@ -86,6 +86,18 @@ spec = do
       it "parses identifiers enclosed within backticks" $ do
         "`foo`" `shouldParseTo` DocIdentifier "foo"
 
+      it "parses identifiers preceded by a backtick and followed by a single quote" $ do
+        "`foo'" `shouldParseTo` DocIdentifier "foo"
+
+      it "parses identifiers preceded by a single quote and followed by a backtick" $ do
+        "'foo`" `shouldParseTo` DocIdentifier "foo"
+
+      it "can parse a constructor identifier" $ do
+        "'Foo'" `shouldParseTo` DocIdentifier "Foo"
+
+      it "can parse a qualified identifier" $ do
+        "'Foo.bar'" `shouldParseTo` DocIdentifier "Foo.bar"
+
       it "parses a word with an one of the delimiters in it as DocString" $ do
           "don't" `shouldParseTo` "don't"
 
@@ -99,9 +111,43 @@ spec = do
       it "doesn't parse empty identifiers" $ do
         "``" `shouldParseTo` "``"
 
-      it "can parse infix identifiers" $ do
+      it "can parse an identifier in infix notation enclosed within backticks" $ do
         "``infix``" `shouldParseTo` "`" <> DocIdentifier "infix" <> "`"
 
+      it "can parse identifiers containing a single quote" $ do
+        "'don't'" `shouldParseTo` DocIdentifier "don't"
+
+      it "can parse identifiers ending with a single quote" $ do
+        "'foo''" `shouldParseTo` DocIdentifier "foo'"
+
+      it "can parse an identifier containing a digit" $ do
+        "'f0'" `shouldParseTo` DocIdentifier "f0"
+
+      it "can parse an identifier containing unicode characters" $ do
+        "'λ'" `shouldParseTo` DocIdentifier "λ"
+
+      it "can parse a single quote followed by an identifier" $ do
+        "''foo'" `shouldParseTo` "'" <> DocIdentifier "foo"
+
+      it "can parse an identifier that starts with an underscore" $ do
+        "'_x'" `shouldParseTo` DocIdentifier "_x"
+
+    context "when parsing operators" $ do
+      it "can parse an operator enclosed within single quotes" $ do
+        "'.='" `shouldParseTo` DocIdentifier ".="
+
+      it "can parse a qualified operator" $ do
+        "'F..'" `shouldParseTo` DocIdentifier "F.."
+
+      it "can parse a constructor operator" $ do
+        "':='" `shouldParseTo` DocIdentifier ":="
+
+      it "can parse a qualified constructor operator" $ do
+        "'F.:='" `shouldParseTo` DocIdentifier "F.:="
+
+      it "can parse a unicode operator" $ do
+        "'∧'" `shouldParseTo` DocIdentifier "∧"
+
     context "when parsing URLs" $ do
       it "parses a URL" $ do
         "<http://example.com/>" `shouldParseTo` hyperlink "http://example.com/" Nothing
diff --git a/haddock-test/src/Test/Haddock.hs b/haddock-test/src/Test/Haddock.hs
index f372f773..942c0587 100644
--- a/haddock-test/src/Test/Haddock.hs
+++ b/haddock-test/src/Test/Haddock.hs
@@ -158,7 +158,9 @@ maybeAcceptFile :: Config c -> FilePath -> CheckResult -> IO CheckResult
 maybeAcceptFile cfg file result
     | cfgAccept cfg && result `elem` [NoRef, Fail] = do
         Just out <- readOut cfg file
-        writeFile (refFile dcfg file) $ ccfgDump ccfg out
+        let ref = refFile dcfg file
+        createDirectoryIfMissing True (takeDirectory ref)
+        writeFile ref $ ccfgDump ccfg out
         pure Accepted
   where
     dcfg = cfgDirConfig cfg
diff --git a/haddock.cabal b/haddock.cabal
index 29d3d114..af606894 100644
--- a/haddock.cabal
+++ b/haddock.cabal
@@ -78,7 +78,7 @@ executable haddock
       xhtml >= 3000.2 && < 3000.3,
       Cabal >= 1.10,
       ghc-boot,
-      ghc == 8.6.*,
+      ghc == 8.5.*,
       bytestring,
       parsec,
       text,
diff --git a/hoogle-test/ref/Bug722/test.txt b/hoogle-test/ref/Bug722/test.txt
new file mode 100644
index 00000000..96f3747b
--- /dev/null
+++ b/hoogle-test/ref/Bug722/test.txt
@@ -0,0 +1,16 @@
+-- Hoogle documentation, generated by Haddock
+-- See Hoogle, http://www.haskell.org/hoogle/
+
+@package test
+@version 0.0.0
+
+module Bug722
+class Foo a
+(!@#) :: Foo a => a -> a -> a
+infixl 4 !@#
+type family &* :: * -> * -> *
+infixr 3 &*
+data a :-& b
+(:^&) :: a -> b -> (:-&) a b
+infixl 6 :-&
+infixl 6 :^&
diff --git a/hoogle-test/ref/Bug806/test.txt b/hoogle-test/ref/Bug806/test.txt
index d9a908b3..67e9fd61 100644
--- a/hoogle-test/ref/Bug806/test.txt
+++ b/hoogle-test/ref/Bug806/test.txt
@@ -21,4 +21,5 @@ class C a where {
     
     -- | <a>AT</a> docs
     type family AT a;
+    type AT a = Proxy (Proxy (Proxy (Proxy (Proxy (Proxy (Proxy (Proxy (Proxy (Proxy)))))))));
 }
diff --git a/hoogle-test/ref/Bug873/test.txt b/hoogle-test/ref/Bug873/test.txt
new file mode 100644
index 00000000..19100212
--- /dev/null
+++ b/hoogle-test/ref/Bug873/test.txt
@@ -0,0 +1,26 @@
+-- Hoogle documentation, generated by Haddock
+-- See Hoogle, http://www.haskell.org/hoogle/
+
+@package test
+@version 0.0.0
+
+module Bug873
+
+-- | Application operator. This operator is redundant, since ordinary
+--   application <tt>(f x)</tt> means the same as <tt>(f <a>$</a> x)</tt>.
+--   However, <a>$</a> has low, right-associative binding precedence, so it
+--   sometimes allows parentheses to be omitted; for example:
+--   
+--   <pre>
+--   f $ g $ h x  =  f (g (h x))
+--   </pre>
+--   
+--   It is also useful in higher-order situations, such as <tt><a>map</a>
+--   (<a>$</a> 0) xs</tt>, or <tt><a>zipWith</a> (<a>$</a>) fs xs</tt>.
+--   
+--   Note that <tt>($)</tt> is levity-polymorphic in its result type, so
+--   that foo $ True where foo :: Bool -&gt; Int# is well-typed
+($) :: () => (a -> b) -> a -> b
+infixr 0 $
+($$) :: (a -> b) -> a -> b
+infixr 0 $$
diff --git a/hoogle-test/ref/type-sigs/test.txt b/hoogle-test/ref/type-sigs/test.txt
index ec5f5043..1209279c 100644
--- a/hoogle-test/ref/type-sigs/test.txt
+++ b/hoogle-test/ref/type-sigs/test.txt
@@ -6,11 +6,11 @@
 
 module ReaderT
 newtype ReaderT r m a
-ReaderT :: r -> m a -> ReaderT r m a
+ReaderT :: (r -> m a) -> ReaderT r m a
 [runReaderT] :: ReaderT r m a -> r -> m a
 
 module ReaderTReexport
 newtype ReaderT r m a
-ReaderT :: r -> m a -> ReaderT r m a
+ReaderT :: (r -> m a) -> ReaderT r m a
 [runReaderT] :: ReaderT r m a -> r -> m a
 runReaderT :: ReaderT r m a -> r -> m a
diff --git a/hoogle-test/src/Bug722/Bug722.hs b/hoogle-test/src/Bug722/Bug722.hs
new file mode 100644
index 00000000..a33d5b24
--- /dev/null
+++ b/hoogle-test/src/Bug722/Bug722.hs
@@ -0,0 +1,13 @@
+{-# LANGUAGE TypeOperators, TypeFamilies #-}
+module Bug722 where
+
+class Foo a where
+  (!@#) :: a -> a -> a
+infixl 4 !@#
+
+type family (&*) :: * -> * -> *
+infixr 3 &*
+
+data a :-& b = a :^& b
+infixl 6 :-&, :^&
+
diff --git a/hoogle-test/src/Bug806/Bug806.hs b/hoogle-test/src/Bug806/Bug806.hs
index 6efcb5cf..45efda77 100644
--- a/hoogle-test/src/Bug806/Bug806.hs
+++ b/hoogle-test/src/Bug806/Bug806.hs
@@ -21,3 +21,4 @@ v = 42
 class C a where
   -- | 'AT' docs
   type AT a
+  type AT a = Proxy (Proxy (Proxy (Proxy (Proxy (Proxy (Proxy (Proxy (Proxy (Proxy)))))))))
diff --git a/hoogle-test/src/Bug873/Bug873.hs b/hoogle-test/src/Bug873/Bug873.hs
new file mode 100644
index 00000000..3a9a5383
--- /dev/null
+++ b/hoogle-test/src/Bug873/Bug873.hs
@@ -0,0 +1,5 @@
+module Bug873 (($), ($$)) where
+infixr 0 $$
+
+($$) :: (a -> b) -> a -> b
+f $$ x = f x
diff --git a/html-test/ref/A.html b/html-test/ref/A.html
index c6965abc..e4802966 100644
--- a/html-test/ref/A.html
+++ b/html-test/ref/A.html
@@ -54,11 +54,15 @@
 	    ><li class="src short"
 	    ><a href="#"
 	      >other</a
-	      > :: Int</li
+	      > :: <a href="#" title="Data.Int"
+	      >Int</a
+	      ></li
 	    ><li class="src short"
 	    ><a href="#"
 	      >test2</a
-	      > :: Bool</li
+	      > :: <a href="#" title="Data.Bool"
+	      >Bool</a
+	      ></li
 	    ><li class="src short"
 	    ><span class="keyword"
 	      >data</span
@@ -70,7 +74,9 @@
 	    ><li class="src short"
 	    ><a href="#"
 	      >reExport</a
-	      > :: Int</li
+	      > :: <a href="#" title="Data.Int"
+	      >Int</a
+	      ></li
 	    ></ul
 	  ></details
 	></div
@@ -105,7 +111,9 @@
 	><p class="src"
 	  ><a id="v:other" class="def"
 	    >other</a
-	    > :: Int <a href="#" class="selflink"
+	    > :: <a href="#" title="Data.Int"
+	    >Int</a
+	    > <a href="#" class="selflink"
 	    >#</a
 	    ></p
 	  ></div
@@ -113,7 +121,9 @@
 	><p class="src"
 	  ><a id="v:test2" class="def"
 	    >test2</a
-	    > :: Bool <a href="#" class="selflink"
+	    > :: <a href="#" title="Data.Bool"
+	    >Bool</a
+	    > <a href="#" class="selflink"
 	    >#</a
 	    ></p
 	  ><div class="doc"
@@ -155,7 +165,9 @@
 	><p class="src"
 	  ><a id="v:reExport" class="def"
 	    >reExport</a
-	    > :: Int <a href="#" class="selflink"
+	    > :: <a href="#" title="Data.Int"
+	    >Int</a
+	    > <a href="#" class="selflink"
 	    >#</a
 	    ></p
 	  ><div class="doc"
diff --git a/html-test/ref/Bug280.html b/html-test/ref/Bug280.html
index f2d25057..d37fc11f 100644
--- a/html-test/ref/Bug280.html
+++ b/html-test/ref/Bug280.html
@@ -61,7 +61,9 @@
 	><p class="src"
 	  ><a id="v:x" class="def"
 	    >x</a
-	    > :: [Char] <a href="#" class="selflink"
+	    > :: [<a href="#" title="Data.Char"
+	    >Char</a
+	    >] <a href="#" class="selflink"
 	    >#</a
 	    ></p
 	  ></div
diff --git a/html-test/ref/Bug3.html b/html-test/ref/Bug3.html
index 2c716278..3c4b905c 100644
--- a/html-test/ref/Bug3.html
+++ b/html-test/ref/Bug3.html
@@ -46,7 +46,9 @@
 	  ><li class="src short"
 	    ><a href="#"
 	      >foo</a
-	      > :: Int</li
+	      > :: <a href="#" title="Data.Int"
+	      >Int</a
+	      ></li
 	    ></ul
 	  ></details
 	></div
@@ -57,7 +59,9 @@
 	><p class="src"
 	  ><a id="v:foo" class="def"
 	    >foo</a
-	    > :: Int <a href="#" class="selflink"
+	    > :: <a href="#" title="Data.Int"
+	    >Int</a
+	    > <a href="#" class="selflink"
 	    >#</a
 	    ></p
 	  ><div class="doc"
diff --git a/html-test/ref/Bug310.html b/html-test/ref/Bug310.html
index e664eccd..8fef21a6 100644
--- a/html-test/ref/Bug310.html
+++ b/html-test/ref/Bug310.html
@@ -38,6 +38,28 @@
 	><p class="caption"
 	>Bug310</p
 	></div
+      ><div id="synopsis"
+      ><details id="syn"
+	><summary
+	  >Synopsis</summary
+	  ><ul class="details-toggle" data-details-id="syn"
+	  ><li class="src short"
+	    ><span class="keyword"
+	      >type family</span
+	      > (a :: <a href="#" title="GHC.TypeNats"
+	      >Nat</a
+	      >) <a href="#"
+	      >+</a
+	      > (b :: <a href="#" title="GHC.TypeNats"
+	      >Nat</a
+	      >) :: <a href="#" title="GHC.TypeNats"
+	      >Nat</a
+	      > <span class="keyword"
+	      >where ...</span
+	      ></li
+	    ></ul
+	  ></details
+	></div
       ><div id="interface"
       ><h1
 	>Documentation</h1
@@ -45,13 +67,31 @@
 	><p class="src"
 	  ><span class="keyword"
 	    >type family</span
-	    > (a :: Nat) <a id="t:-43-" class="def"
+	    > (a :: <a href="#" title="GHC.TypeNats"
+	    >Nat</a
+	    >) <a id="t:-43-" class="def"
 	    >+</a
-	    > (b :: Nat) :: Nat <span class="keyword"
+	    > (b :: <a href="#" title="GHC.TypeNats"
+	    >Nat</a
+	    >) :: <a href="#" title="GHC.TypeNats"
+	    >Nat</a
+	    > <span class="keyword"
 	    >where ...</span
+	    > <span class="fixity"
+	    >infixl 6</span
+	    ><span class="rightedge"
+	    ></span
 	    > <a href="#" class="selflink"
 	    >#</a
 	    ></p
+	  ><div class="doc"
+	  ><p
+	    >Addition of type-level naturals.</p
+	    ><p
+	    ><em
+	      >Since: base-4.7.0.0</em
+	      ></p
+	    ></div
 	  ></div
 	></div
       ></div
diff --git a/html-test/ref/Bug387.html b/html-test/ref/Bug387.html
index da1b1ee5..ba2f5c91 100644
--- a/html-test/ref/Bug387.html
+++ b/html-test/ref/Bug387.html
@@ -60,11 +60,15 @@
 	  ><li class="src short"
 	    ><a href="#"
 	      >test1</a
-	      > :: Int</li
+	      > :: <a href="#" title="Data.Int"
+	      >Int</a
+	      ></li
 	    ><li class="src short"
 	    ><a href="#"
 	      >test2</a
-	      > :: Int</li
+	      > :: <a href="#" title="Data.Int"
+	      >Int</a
+	      ></li
 	    ></ul
 	  ></details
 	></div
@@ -79,7 +83,9 @@
 	><p class="src"
 	  ><a id="v:test1" class="def"
 	    >test1</a
-	    > :: Int <a href="#" class="selflink"
+	    > :: <a href="#" title="Data.Int"
+	    >Int</a
+	    > <a href="#" class="selflink"
 	    >#</a
 	    ></p
 	  ></div
@@ -93,7 +99,9 @@
 	><p class="src"
 	  ><a id="v:test2" class="def"
 	    >test2</a
-	    > :: Int <a href="#" class="selflink"
+	    > :: <a href="#" title="Data.Int"
+	    >Int</a
+	    > <a href="#" class="selflink"
 	    >#</a
 	    ></p
 	  ></div
diff --git a/html-test/ref/Bug4.html b/html-test/ref/Bug4.html
index 6bf822f7..6afd37fe 100644
--- a/html-test/ref/Bug4.html
+++ b/html-test/ref/Bug4.html
@@ -46,7 +46,9 @@
 	  ><li class="src short"
 	    ><a href="#"
 	      >foo</a
-	      > :: Int</li
+	      > :: <a href="#" title="Data.Int"
+	      >Int</a
+	      ></li
 	    ></ul
 	  ></details
 	></div
@@ -57,7 +59,9 @@
 	><p class="src"
 	  ><a id="v:foo" class="def"
 	    >foo</a
-	    > :: Int <a href="#" class="selflink"
+	    > :: <a href="#" title="Data.Int"
+	    >Int</a
+	    > <a href="#" class="selflink"
 	    >#</a
 	    ></p
 	  ><div class="doc"
diff --git a/html-test/ref/Bug546.html b/html-test/ref/Bug546.html
index e2246475..221f7b6c 100644
--- a/html-test/ref/Bug546.html
+++ b/html-test/ref/Bug546.html
@@ -46,11 +46,17 @@
 	  ><li class="src short"
 	    ><a href="#"
 	      >x</a
-	      > :: Integer</li
+	      > :: <a href="#" title="Prelude"
+	      >Integer</a
+	      ></li
 	    ><li class="src short"
 	    ><a href="#"
 	      >compile</a
-	      > :: String -&gt; String</li
+	      > :: <a href="#" title="Data.String"
+	      >String</a
+	      > -&gt; <a href="#" title="Data.String"
+	      >String</a
+	      ></li
 	    ></ul
 	  ></details
 	></div
@@ -61,7 +67,9 @@
 	><p class="src"
 	  ><a id="v:x" class="def"
 	    >x</a
-	    > :: Integer <a href="#" class="selflink"
+	    > :: <a href="#" title="Prelude"
+	    >Integer</a
+	    > <a href="#" class="selflink"
 	    >#</a
 	    ></p
 	  ><div class="doc"
@@ -81,7 +89,11 @@
 	><p class="src"
 	  ><a id="v:compile" class="def"
 	    >compile</a
-	    > :: String -&gt; String <a href="#" class="selflink"
+	    > :: <a href="#" title="Data.String"
+	    >String</a
+	    > -&gt; <a href="#" title="Data.String"
+	    >String</a
+	    > <a href="#" class="selflink"
 	    >#</a
 	    ></p
 	  ><div class="doc"
diff --git a/html-test/ref/Bug548.html b/html-test/ref/Bug548.html
index a8061eb2..b690b8ad 100644
--- a/html-test/ref/Bug548.html
+++ b/html-test/ref/Bug548.html
@@ -47,7 +47,13 @@
 	    >newtype</span
 	    > <a id="t:WrappedArrow" class="def"
 	    >WrappedArrow</a
-	    > (a :: * -&gt; * -&gt; *) b c <a href="#" class="selflink"
+	    > (a :: <a href="#" title="Data.Kind"
+	    >Type</a
+	    > -&gt; <a href="#" title="Data.Kind"
+	    >Type</a
+	    > -&gt; <a href="#" title="Data.Kind"
+	    >Type</a
+	    >) b c <a href="#" class="selflink"
 	    >#</a
 	    ></p
 	  ><div class="subs constructors"
@@ -92,9 +98,15 @@
 		  ><span class="inst-left"
 		    ><span class="instance details-toggle-control details-toggle" data-details-id="i:id:WrappedArrow:Generic1:1"
 		      ></span
-		      > Generic1 (<a href="#" title="Bug548"
+		      > <a href="#" title="GHC.Generics"
+		      >Generic1</a
+		      > (<a href="#" title="Bug548"
 		      >WrappedArrow</a
-		      > a b :: * -&gt; *)</span
+		      > a b :: <a href="#" title="Data.Kind"
+		      >Type</a
+		      > -&gt; <a href="#" title="Data.Kind"
+		      >Type</a
+		      >)</span
 		    ></td
 		  ><td class="doc empty"
 		  ></td
@@ -114,9 +126,15 @@
 			><p class="src"
 			><span class="keyword"
 			  >type</span
-			  > Rep1 (<a href="#" title="Bug548"
-			  >WrappedArrow</a
-			  > a b) :: k -&gt; *</p
+			  > <a href="#" title="GHC.Generics"
+			  >Rep1</a
+			  > (<a href="#" title="Bug548"
+			  >WrappedArrow</a
+			  > a b) :: k -&gt; <a href="#" title="Data.Kind"
+			  >Type</a
+			  > <a href="#" class="selflink"
+			  >#</a
+			  ></p
 			></div
 		      > <div class="subs methods"
 		      ><p class="caption"
@@ -126,17 +144,25 @@
 			  >from1</a
 			  > :: <a href="#" title="Bug548"
 			  >WrappedArrow</a
-			  > a b a0 -&gt; Rep1 (<a href="#" title="Bug548"
+			  > a b a0 -&gt; <a href="#" title="GHC.Generics"
+			  >Rep1</a
+			  > (<a href="#" title="Bug548"
 			  >WrappedArrow</a
-			  > a b) a0</p
+			  > a b) a0 <a href="#" class="selflink"
+			  >#</a
+			  ></p
 			><p class="src"
 			><a href="#"
 			  >to1</a
-			  > :: Rep1 (<a href="#" title="Bug548"
+			  > :: <a href="#" title="GHC.Generics"
+			  >Rep1</a
+			  > (<a href="#" title="Bug548"
 			  >WrappedArrow</a
 			  > a b) a0 -&gt; <a href="#" title="Bug548"
 			  >WrappedArrow</a
-			  > a b a0</p
+			  > a b a0 <a href="#" class="selflink"
+			  >#</a
+			  ></p
 			></div
 		      ></details
 		    ></td
@@ -146,12 +172,20 @@
 		  ><span class="inst-left"
 		    ><span class="instance details-toggle-control details-toggle" data-details-id="i:id:WrappedArrow:Functor:2"
 		      ></span
-		      > Arrow a =&gt; Functor (<a href="#" title="Bug548"
+		      > <a href="#" title="Control.Arrow"
+		      >Arrow</a
+		      > a =&gt; <a href="#" title="Data.Functor"
+		      >Functor</a
+		      > (<a href="#" title="Bug548"
 		      >WrappedArrow</a
 		      > a b)</span
 		    ></td
-		  ><td class="doc empty"
-		  ></td
+		  ><td class="doc"
+		  ><p
+		    ><em
+		      >Since: base-2.1</em
+		      ></p
+		    ></td
 		  ></tr
 		><tr
 		><td colspan="2"
@@ -172,7 +206,9 @@
 			  >WrappedArrow</a
 			  > a b a0 -&gt; <a href="#" title="Bug548"
 			  >WrappedArrow</a
-			  > a b b0</p
+			  > a b b0 <a href="#" class="selflink"
+			  >#</a
+			  ></p
 			><p class="src"
 			><a href="#"
 			  >(&lt;$)</a
@@ -180,7 +216,9 @@
 			  >WrappedArrow</a
 			  > a b b0 -&gt; <a href="#" title="Bug548"
 			  >WrappedArrow</a
-			  > a b a0</p
+			  > a b a0 <a href="#" class="selflink"
+			  >#</a
+			  ></p
 			></div
 		      ></details
 		    ></td
@@ -190,12 +228,20 @@
 		  ><span class="inst-left"
 		    ><span class="instance details-toggle-control details-toggle" data-details-id="i:id:WrappedArrow:Applicative:3"
 		      ></span
-		      > Arrow a =&gt; Applicative (<a href="#" title="Bug548"
+		      > <a href="#" title="Control.Arrow"
+		      >Arrow</a
+		      > a =&gt; <a href="#" title="Control.Applicative"
+		      >Applicative</a
+		      > (<a href="#" title="Bug548"
 		      >WrappedArrow</a
 		      > a b)</span
 		    ></td
-		  ><td class="doc empty"
-		  ></td
+		  ><td class="doc"
+		  ><p
+		    ><em
+		      >Since: base-2.1</em
+		      ></p
+		    ></td
 		  ></tr
 		><tr
 		><td colspan="2"
@@ -214,7 +260,9 @@
 			  >pure</a
 			  > :: a0 -&gt; <a href="#" title="Bug548"
 			  >WrappedArrow</a
-			  > a b a0</p
+			  > a b a0 <a href="#" class="selflink"
+			  >#</a
+			  ></p
 			><p class="src"
 			><a href="#"
 			  >(&lt;*&gt;)</a
@@ -224,7 +272,9 @@
 			  >WrappedArrow</a
 			  > a b a0 -&gt; <a href="#" title="Bug548"
 			  >WrappedArrow</a
-			  > a b b0</p
+			  > a b b0 <a href="#" class="selflink"
+			  >#</a
+			  ></p
 			><p class="src"
 			><a href="#"
 			  >liftA2</a
@@ -234,7 +284,9 @@
 			  >WrappedArrow</a
 			  > a b b0 -&gt; <a href="#" title="Bug548"
 			  >WrappedArrow</a
-			  > a b c</p
+			  > a b c <a href="#" class="selflink"
+			  >#</a
+			  ></p
 			><p class="src"
 			><a href="#"
 			  >(*&gt;)</a
@@ -244,7 +296,9 @@
 			  >WrappedArrow</a
 			  > a b b0 -&gt; <a href="#" title="Bug548"
 			  >WrappedArrow</a
-			  > a b b0</p
+			  > a b b0 <a href="#" class="selflink"
+			  >#</a
+			  ></p
 			><p class="src"
 			><a href="#"
 			  >(&lt;*)</a
@@ -254,7 +308,9 @@
 			  >WrappedArrow</a
 			  > a b b0 -&gt; <a href="#" title="Bug548"
 			  >WrappedArrow</a
-			  > a b a0</p
+			  > a b a0 <a href="#" class="selflink"
+			  >#</a
+			  ></p
 			></div
 		      ></details
 		    ></td
@@ -264,12 +320,22 @@
 		  ><span class="inst-left"
 		    ><span class="instance details-toggle-control details-toggle" data-details-id="i:id:WrappedArrow:Alternative:4"
 		      ></span
-		      > (ArrowZero a, ArrowPlus a) =&gt; Alternative (<a href="#" title="Bug548"
+		      > (<a href="#" title="Control.Arrow"
+		      >ArrowZero</a
+		      > a, <a href="#" title="Control.Arrow"
+		      >ArrowPlus</a
+		      > a) =&gt; <a href="#" title="Control.Applicative"
+		      >Alternative</a
+		      > (<a href="#" title="Bug548"
 		      >WrappedArrow</a
 		      > a b)</span
 		    ></td
-		  ><td class="doc empty"
-		  ></td
+		  ><td class="doc"
+		  ><p
+		    ><em
+		      >Since: base-2.1</em
+		      ></p
+		    ></td
 		  ></tr
 		><tr
 		><td colspan="2"
@@ -288,7 +354,9 @@
 			  >empty</a
 			  > :: <a href="#" title="Bug548"
 			  >WrappedArrow</a
-			  > a b a0</p
+			  > a b a0 <a href="#" class="selflink"
+			  >#</a
+			  ></p
 			><p class="src"
 			><a href="#"
 			  >(&lt;|&gt;)</a
@@ -298,7 +366,9 @@
 			  >WrappedArrow</a
 			  > a b a0 -&gt; <a href="#" title="Bug548"
 			  >WrappedArrow</a
-			  > a b a0</p
+			  > a b a0 <a href="#" class="selflink"
+			  >#</a
+			  ></p
 			><p class="src"
 			><a href="#"
 			  >some</a
@@ -306,7 +376,9 @@
 			  >WrappedArrow</a
 			  > a b a0 -&gt; <a href="#" title="Bug548"
 			  >WrappedArrow</a
-			  > a b [a0]</p
+			  > a b [a0] <a href="#" class="selflink"
+			  >#</a
+			  ></p
 			><p class="src"
 			><a href="#"
 			  >many</a
@@ -314,7 +386,9 @@
 			  >WrappedArrow</a
 			  > a b a0 -&gt; <a href="#" title="Bug548"
 			  >WrappedArrow</a
-			  > a b [a0]</p
+			  > a b [a0] <a href="#" class="selflink"
+			  >#</a
+			  ></p
 			></div
 		      ></details
 		    ></td
@@ -324,7 +398,9 @@
 		  ><span class="inst-left"
 		    ><span class="instance details-toggle-control details-toggle" data-details-id="i:id:WrappedArrow:Generic:5"
 		      ></span
-		      > Generic (<a href="#" title="Bug548"
+		      > <a href="#" title="GHC.Generics"
+		      >Generic</a
+		      > (<a href="#" title="Bug548"
 		      >WrappedArrow</a
 		      > a b c)</span
 		    ></td
@@ -346,9 +422,17 @@
 			><p class="src"
 			><span class="keyword"
 			  >type</span
-			  > Rep (<a href="#" title="Bug548"
-			  >WrappedArrow</a
-			  > a b c) :: * -&gt; *</p
+			  > <a href="#" title="GHC.Generics"
+			  >Rep</a
+			  > (<a href="#" title="Bug548"
+			  >WrappedArrow</a
+			  > a b c) :: <a href="#" title="Data.Kind"
+			  >Type</a
+			  > -&gt; <a href="#" title="Data.Kind"
+			  >Type</a
+			  > <a href="#" class="selflink"
+			  >#</a
+			  ></p
 			></div
 		      > <div class="subs methods"
 		      ><p class="caption"
@@ -358,17 +442,25 @@
 			  >from</a
 			  > :: <a href="#" title="Bug548"
 			  >WrappedArrow</a
-			  > a b c -&gt; Rep (<a href="#" title="Bug548"
+			  > a b c -&gt; <a href="#" title="GHC.Generics"
+			  >Rep</a
+			  > (<a href="#" title="Bug548"
 			  >WrappedArrow</a
-			  > a b c) x</p
+			  > a b c) x <a href="#" class="selflink"
+			  >#</a
+			  ></p
 			><p class="src"
 			><a href="#"
 			  >to</a
-			  > :: Rep (<a href="#" title="Bug548"
+			  > :: <a href="#" title="GHC.Generics"
+			  >Rep</a
+			  > (<a href="#" title="Bug548"
 			  >WrappedArrow</a
 			  > a b c) x -&gt; <a href="#" title="Bug548"
 			  >WrappedArrow</a
-			  > a b c</p
+			  > a b c <a href="#" class="selflink"
+			  >#</a
+			  ></p
 			></div
 		      ></details
 		    ></td
@@ -380,12 +472,22 @@
 		      ></span
 		      > <span class="keyword"
 		      >type</span
-		      > Rep1 (<a href="#" title="Bug548"
+		      > <a href="#" title="GHC.Generics"
+		      >Rep1</a
+		      > (<a href="#" title="Bug548"
 		      >WrappedArrow</a
-		      > a b :: * -&gt; *)</span
+		      > a b :: <a href="#" title="Data.Kind"
+		      >Type</a
+		      > -&gt; <a href="#" title="Data.Kind"
+		      >Type</a
+		      >)</span
+		    ></td
+		  ><td class="doc"
+		  ><p
+		    ><em
+		      >Since: base-4.7.0.0</em
+		      ></p
 		    ></td
-		  ><td class="doc empty"
-		  ></td
 		  ></tr
 		><tr
 		><td colspan="2"
@@ -399,9 +501,43 @@
 		      > <div class="src"
 		      ><span class="keyword"
 			>type</span
-			> Rep1 (<a href="#" title="Bug548"
+			> <a href="#" title="GHC.Generics"
+			>Rep1</a
+			> (<a href="#" title="Bug548"
 			>WrappedArrow</a
-			> a b :: * -&gt; *) = D1 (MetaData &quot;WrappedArrow&quot; &quot;Control.Applicative&quot; &quot;base&quot; True) (C1 (MetaCons &quot;WrapArrow&quot; PrefixI True) (S1 (MetaSel (Just &quot;unwrapArrow&quot;) NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec1 (a b))))</div
+			> a b :: <a href="#" title="Data.Kind"
+			>Type</a
+			> -&gt; <a href="#" title="Data.Kind"
+			>Type</a
+			>) = <a href="#" title="GHC.Generics"
+			>D1</a
+			> (<a href="#" title="GHC.Generics"
+			>MetaData</a
+			> &quot;WrappedArrow&quot; &quot;Control.Applicative&quot; &quot;base&quot; <a href="#" title="Data.Bool"
+			>True</a
+			>) (<a href="#" title="GHC.Generics"
+			>C1</a
+			> (<a href="#" title="GHC.Generics"
+			>MetaCons</a
+			> &quot;WrapArrow&quot; <a href="#" title="GHC.Generics"
+			>PrefixI</a
+			> <a href="#" title="Data.Bool"
+			>True</a
+			>) (<a href="#" title="GHC.Generics"
+			>S1</a
+			> (<a href="#" title="GHC.Generics"
+			>MetaSel</a
+			> (<a href="#" title="GHC.Maybe"
+			>Just</a
+			> &quot;unwrapArrow&quot;) <a href="#" title="GHC.Generics"
+			>NoSourceUnpackedness</a
+			> <a href="#" title="GHC.Generics"
+			>NoSourceStrictness</a
+			> <a href="#" title="GHC.Generics"
+			>DecidedLazy</a
+			>) (<a href="#" title="GHC.Generics"
+			>Rec1</a
+			> (a b))))</div
 		      ></details
 		    ></td
 		  ></tr
@@ -412,12 +548,18 @@
 		      ></span
 		      > <span class="keyword"
 		      >type</span
-		      > Rep (<a href="#" title="Bug548"
+		      > <a href="#" title="GHC.Generics"
+		      >Rep</a
+		      > (<a href="#" title="Bug548"
 		      >WrappedArrow</a
 		      > a b c)</span
 		    ></td
-		  ><td class="doc empty"
-		  ></td
+		  ><td class="doc"
+		  ><p
+		    ><em
+		      >Since: base-4.7.0.0</em
+		      ></p
+		    ></td
 		  ></tr
 		><tr
 		><td colspan="2"
@@ -431,9 +573,39 @@
 		      > <div class="src"
 		      ><span class="keyword"
 			>type</span
-			> Rep (<a href="#" title="Bug548"
+			> <a href="#" title="GHC.Generics"
+			>Rep</a
+			> (<a href="#" title="Bug548"
 			>WrappedArrow</a
-			> a b c) = D1 (MetaData &quot;WrappedArrow&quot; &quot;Control.Applicative&quot; &quot;base&quot; True) (C1 (MetaCons &quot;WrapArrow&quot; PrefixI True) (S1 (MetaSel (Just &quot;unwrapArrow&quot;) NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 (a b c))))</div
+			> a b c) = <a href="#" title="GHC.Generics"
+			>D1</a
+			> (<a href="#" title="GHC.Generics"
+			>MetaData</a
+			> &quot;WrappedArrow&quot; &quot;Control.Applicative&quot; &quot;base&quot; <a href="#" title="Data.Bool"
+			>True</a
+			>) (<a href="#" title="GHC.Generics"
+			>C1</a
+			> (<a href="#" title="GHC.Generics"
+			>MetaCons</a
+			> &quot;WrapArrow&quot; <a href="#" title="GHC.Generics"
+			>PrefixI</a
+			> <a href="#" title="Data.Bool"
+			>True</a
+			>) (<a href="#" title="GHC.Generics"
+			>S1</a
+			> (<a href="#" title="GHC.Generics"
+			>MetaSel</a
+			> (<a href="#" title="GHC.Maybe"
+			>Just</a
+			> &quot;unwrapArrow&quot;) <a href="#" title="GHC.Generics"
+			>NoSourceUnpackedness</a
+			> <a href="#" title="GHC.Generics"
+			>NoSourceStrictness</a
+			> <a href="#" title="GHC.Generics"
+			>DecidedLazy</a
+			>) (<a href="#" title="GHC.Generics"
+			>Rec0</a
+			> (a b c))))</div
 		      ></details
 		    ></td
 		  ></tr
diff --git a/html-test/ref/Bug574.html b/html-test/ref/Bug574.html
new file mode 100644
index 00000000..ed0a5e15
--- /dev/null
+++ b/html-test/ref/Bug574.html
@@ -0,0 +1,86 @@
+<html xmlns="http://www.w3.org/1999/xhtml"
+><head
+  ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"
+     /><title
+    >Bug574</title
+    ><link href="#" rel="stylesheet" type="text/css" title="Ocean"
+     /><link rel="stylesheet" type="text/css" href="#"
+     /><script src="haddock-bundle.min.js" async="async" type="text/javascript"
+    ></script
+    ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"
+    ></script
+    ></head
+  ><body
+  ><div id="package-header"
+    ><ul class="links" id="page-menu"
+      ><li
+	><a href="#"
+	  >Contents</a
+	  ></li
+	><li
+	><a href="#"
+	  >Index</a
+	  ></li
+	></ul
+      ><p class="caption empty"
+      ></p
+      ></div
+    ><div id="content"
+    ><div id="module-header"
+      ><table class="info"
+	><tr
+	  ><th
+	    >Safe Haskell</th
+	    ><td
+	    >None</td
+	    ></tr
+	  ></table
+	><p class="caption"
+	>Bug574</p
+	></div
+      ><div id="synopsis"
+      ><details id="syn"
+	><summary
+	  >Synopsis</summary
+	  ><ul class="details-toggle" data-details-id="syn"
+	  ><li class="src short"
+	    ><a href="#"
+	      >foo</a
+	      > :: <a href="#" title="Data.Int"
+	      >Int</a
+	      > -&gt; <a href="#" title="Data.Int"
+	      >Int</a
+	      > -&gt; <a href="#" title="Data.Int"
+	      >Int</a
+	      ></li
+	    ></ul
+	  ></details
+	></div
+      ><div id="interface"
+      ><h1
+	>Documentation</h1
+	><div class="top"
+	><p class="src"
+	  ><a id="v:foo" class="def"
+	    >foo</a
+	    > :: <a href="#" title="Data.Int"
+	    >Int</a
+	    > -&gt; <a href="#" title="Data.Int"
+	    >Int</a
+	    > -&gt; <a href="#" title="Data.Int"
+	    >Int</a
+	    > <a href="#" class="selflink"
+	    >#</a
+	    ></p
+	  ><div class="doc"
+	  ><p
+	    >Somthing with a spliced type</p
+	    ></div
+	  ></div
+	></div
+      ></div
+    ><div id="footer"
+    ></div
+    ></body
+  ></html
+>
\ No newline at end of file
diff --git a/html-test/ref/Bug6.html b/html-test/ref/Bug6.html
index 27f73d64..15842547 100644
--- a/html-test/ref/Bug6.html
+++ b/html-test/ref/Bug6.html
@@ -58,7 +58,9 @@
 	      >A</a
 	      > = <a href="#"
 	      >A</a
-	      > Int</li
+	      > <a href="#" title="Data.Int"
+	      >Int</a
+	      ></li
 	    ><li class="src short"
 	    ><span class="keyword"
 	      >data</span
@@ -66,13 +68,17 @@
 	      >B</a
 	      > = <a href="#"
 	      >B</a
-	      > Int</li
+	      > <a href="#" title="Data.Int"
+	      >Int</a
+	      ></li
 	    ><li class="src short"
 	    ><a href="#"
 	      >b</a
 	      > :: <a href="#" title="Bug6"
 	      >B</a
-	      > -&gt; Int</li
+	      > -&gt; <a href="#" title="Data.Int"
+	      >Int</a
+	      ></li
 	    ><li class="src short"
 	    ><span class="keyword"
 	      >data</span
@@ -84,11 +90,15 @@
 	      ><li
 		><a href="#"
 		  >c1</a
-		  > :: Int</li
+		  > :: <a href="#" title="Data.Int"
+		  >Int</a
+		  ></li
 		><li
 		><a href="#"
 		  >c2</a
-		  > :: Int</li
+		  > :: <a href="#" title="Data.Int"
+		  >Int</a
+		  ></li
 		></ul
 	      >}</li
 	    ><li class="src short"
@@ -98,7 +108,11 @@
 	      >D</a
 	      > = <a href="#"
 	      >D</a
-	      > Int Int</li
+	      > <a href="#" title="Data.Int"
+	      >Int</a
+	      > <a href="#" title="Data.Int"
+	      >Int</a
+	      ></li
 	    ><li class="src short"
 	    ><span class="keyword"
 	      >newtype</span
@@ -106,7 +120,9 @@
 	      >E</a
 	      > = <a href="#"
 	      >E</a
-	      > Int</li
+	      > <a href="#" title="Data.Int"
+	      >Int</a
+	      ></li
 	    ></ul
 	  ></details
 	></div
@@ -134,7 +150,9 @@
 	      ><td class="src"
 		><a id="v:A" class="def"
 		  >A</a
-		  > Int</td
+		  > <a href="#" title="Data.Int"
+		  >Int</a
+		  ></td
 		><td class="doc empty"
 		></td
 		></tr
@@ -163,7 +181,9 @@
 	      ><td class="src"
 		><a id="v:B" class="def"
 		  >B</a
-		  > Int</td
+		  > <a href="#" title="Data.Int"
+		  >Int</a
+		  ></td
 		><td class="doc empty"
 		></td
 		></tr
@@ -176,7 +196,9 @@
 	    >b</a
 	    > :: <a href="#" title="Bug6"
 	    >B</a
-	    > -&gt; Int <a href="#" class="selflink"
+	    > -&gt; <a href="#" title="Data.Int"
+	    >Int</a
+	    > <a href="#" class="selflink"
 	    >#</a
 	    ></p
 	  ></div
@@ -215,7 +237,9 @@
 		      ><dfn class="src"
 			><a id="v:c1" class="def"
 			  >c1</a
-			  > :: Int</dfn
+			  > :: <a href="#" title="Data.Int"
+			  >Int</a
+			  ></dfn
 			><div class="doc empty"
 			></div
 			></li
@@ -223,7 +247,9 @@
 		      ><dfn class="src"
 			><a id="v:c2" class="def"
 			  >c2</a
-			  > :: Int</dfn
+			  > :: <a href="#" title="Data.Int"
+			  >Int</a
+			  ></dfn
 			><div class="doc empty"
 			></div
 			></li
@@ -256,7 +282,11 @@
 	      ><td class="src"
 		><a id="v:D" class="def"
 		  >D</a
-		  > Int Int</td
+		  > <a href="#" title="Data.Int"
+		  >Int</a
+		  > <a href="#" title="Data.Int"
+		  >Int</a
+		  ></td
 		><td class="doc empty"
 		></td
 		></tr
@@ -284,7 +314,9 @@
 	      ><td class="src"
 		><a id="v:E" class="def"
 		  >E</a
-		  > Int</td
+		  > <a href="#" title="Data.Int"
+		  >Int</a
+		  ></td
 		><td class="doc empty"
 		></td
 		></tr
diff --git a/html-test/ref/Bug613.html b/html-test/ref/Bug613.html
index e8089fc8..71e30832 100644
--- a/html-test/ref/Bug613.html
+++ b/html-test/ref/Bug613.html
@@ -104,7 +104,9 @@
 		      ></span
 		      > <a href="#" title="Bug613"
 		      >Functor</a
-		      > (Either a)</span
+		      > (<a href="#" title="Data.Either"
+		      >Either</a
+		      > a)</span
 		    > <a href="#" class="selflink"
 		    >#</a
 		    ></td
@@ -126,7 +128,11 @@
 			><p class="src"
 			><a href="#"
 			  >fmap</a
-			  > :: (a0 -&gt; b) -&gt; Either a a0 -&gt; Either a b <a href="#" class="selflink"
+			  > :: (a0 -&gt; b) -&gt; <a href="#" title="Data.Either"
+			  >Either</a
+			  > a a0 -&gt; <a href="#" title="Data.Either"
+			  >Either</a
+			  > a b <a href="#" class="selflink"
 			  >#</a
 			  ></p
 			></div
diff --git a/html-test/ref/Bug8.html b/html-test/ref/Bug8.html
index 7aa562f2..9de7cca6 100644
--- a/html-test/ref/Bug8.html
+++ b/html-test/ref/Bug8.html
@@ -99,7 +99,9 @@
 	><p class="src"
 	  ><a id="v:-45--45--45--62-" class="def"
 	    >(---&gt;)</a
-	    > :: Foldable t0 =&gt; t0 t -&gt; <a href="#" title="Bug8"
+	    > :: <a href="#" title="Data.Foldable"
+	    >Foldable</a
+	    > t0 =&gt; t0 t -&gt; <a href="#" title="Bug8"
 	    >Typ</a
 	    > -&gt; <a href="#" title="Bug8"
 	    >Typ</a
diff --git a/html-test/ref/BugDeprecated.html b/html-test/ref/BugDeprecated.html
index 393a78ab..4efe3da2 100644
--- a/html-test/ref/BugDeprecated.html
+++ b/html-test/ref/BugDeprecated.html
@@ -46,27 +46,39 @@
 	  ><li class="src short"
 	    ><a href="#"
 	      >foo</a
-	      > :: Int</li
+	      > :: <a href="#" title="Data.Int"
+	      >Int</a
+	      ></li
 	    ><li class="src short"
 	    ><a href="#"
 	      >bar</a
-	      > :: Int</li
+	      > :: <a href="#" title="Data.Int"
+	      >Int</a
+	      ></li
 	    ><li class="src short"
 	    ><a href="#"
 	      >baz</a
-	      > :: Int</li
+	      > :: <a href="#" title="Data.Int"
+	      >Int</a
+	      ></li
 	    ><li class="src short"
 	    ><a href="#"
 	      >one</a
-	      > :: Int</li
+	      > :: <a href="#" title="Data.Int"
+	      >Int</a
+	      ></li
 	    ><li class="src short"
 	    ><a href="#"
 	      >two</a
-	      > :: Int</li
+	      > :: <a href="#" title="Data.Int"
+	      >Int</a
+	      ></li
 	    ><li class="src short"
 	    ><a href="#"
 	      >three</a
-	      > :: Int</li
+	      > :: <a href="#" title="Data.Int"
+	      >Int</a
+	      ></li
 	    ></ul
 	  ></details
 	></div
@@ -77,7 +89,9 @@
 	><p class="src"
 	  ><a id="v:foo" class="def"
 	    >foo</a
-	    > :: Int <a href="#" class="selflink"
+	    > :: <a href="#" title="Data.Int"
+	    >Int</a
+	    > <a href="#" class="selflink"
 	    >#</a
 	    ></p
 	  ><div class="doc"
@@ -91,7 +105,9 @@
 	><p class="src"
 	  ><a id="v:bar" class="def"
 	    >bar</a
-	    > :: Int <a href="#" class="selflink"
+	    > :: <a href="#" title="Data.Int"
+	    >Int</a
+	    > <a href="#" class="selflink"
 	    >#</a
 	    ></p
 	  ><div class="doc"
@@ -105,7 +121,9 @@
 	><p class="src"
 	  ><a id="v:baz" class="def"
 	    >baz</a
-	    > :: Int <a href="#" class="selflink"
+	    > :: <a href="#" title="Data.Int"
+	    >Int</a
+	    > <a href="#" class="selflink"
 	    >#</a
 	    ></p
 	  ><div class="doc"
@@ -119,7 +137,9 @@
 	><p class="src"
 	  ><a id="v:one" class="def"
 	    >one</a
-	    > :: Int <a href="#" class="selflink"
+	    > :: <a href="#" title="Data.Int"
+	    >Int</a
+	    > <a href="#" class="selflink"
 	    >#</a
 	    ></p
 	  ><div class="doc"
@@ -135,7 +155,9 @@
 	><p class="src"
 	  ><a id="v:two" class="def"
 	    >two</a
-	    > :: Int <a href="#" class="selflink"
+	    > :: <a href="#" title="Data.Int"
+	    >Int</a
+	    > <a href="#" class="selflink"
 	    >#</a
 	    ></p
 	  ><div class="doc"
@@ -149,7 +171,9 @@
 	><p class="src"
 	  ><a id="v:three" class="def"
 	    >three</a
-	    > :: Int <a href="#" class="selflink"
+	    > :: <a href="#" title="Data.Int"
+	    >Int</a
+	    > <a href="#" class="selflink"
 	    >#</a
 	    ></p
 	  ><div class="doc"
diff --git a/html-test/ref/BugExportHeadings.html b/html-test/ref/BugExportHeadings.html
index 17378531..78af3351 100644
--- a/html-test/ref/BugExportHeadings.html
+++ b/html-test/ref/BugExportHeadings.html
@@ -76,27 +76,39 @@
 	  ><li class="src short"
 	    ><a href="#"
 	      >foo</a
-	      > :: Int</li
+	      > :: <a href="#" title="Data.Int"
+	      >Int</a
+	      ></li
 	    ><li class="src short"
 	    ><a href="#"
 	      >bar</a
-	      > :: Int</li
+	      > :: <a href="#" title="Data.Int"
+	      >Int</a
+	      ></li
 	    ><li class="src short"
 	    ><a href="#"
 	      >baz</a
-	      > :: Int</li
+	      > :: <a href="#" title="Data.Int"
+	      >Int</a
+	      ></li
 	    ><li class="src short"
 	    ><a href="#"
 	      >one</a
-	      > :: Int</li
+	      > :: <a href="#" title="Data.Int"
+	      >Int</a
+	      ></li
 	    ><li class="src short"
 	    ><a href="#"
 	      >two</a
-	      > :: Int</li
+	      > :: <a href="#" title="Data.Int"
+	      >Int</a
+	      ></li
 	    ><li class="src short"
 	    ><a href="#"
 	      >three</a
-	      > :: Int</li
+	      > :: <a href="#" title="Data.Int"
+	      >Int</a
+	      ></li
 	    ></ul
 	  ></details
 	></div
@@ -109,7 +121,9 @@
 	><p class="src"
 	  ><a id="v:foo" class="def"
 	    >foo</a
-	    > :: Int <a href="#" class="selflink"
+	    > :: <a href="#" title="Data.Int"
+	    >Int</a
+	    > <a href="#" class="selflink"
 	    >#</a
 	    ></p
 	  ></div
@@ -121,7 +135,9 @@
 	><p class="src"
 	  ><a id="v:bar" class="def"
 	    >bar</a
-	    > :: Int <a href="#" class="selflink"
+	    > :: <a href="#" title="Data.Int"
+	    >Int</a
+	    > <a href="#" class="selflink"
 	    >#</a
 	    ></p
 	  ></div
@@ -133,7 +149,9 @@
 	><p class="src"
 	  ><a id="v:baz" class="def"
 	    >baz</a
-	    > :: Int <a href="#" class="selflink"
+	    > :: <a href="#" title="Data.Int"
+	    >Int</a
+	    > <a href="#" class="selflink"
 	    >#</a
 	    ></p
 	  ></div
@@ -145,7 +163,9 @@
 	><p class="src"
 	  ><a id="v:one" class="def"
 	    >one</a
-	    > :: Int <a href="#" class="selflink"
+	    > :: <a href="#" title="Data.Int"
+	    >Int</a
+	    > <a href="#" class="selflink"
 	    >#</a
 	    ></p
 	  ><div class="doc"
@@ -163,7 +183,9 @@
 	><p class="src"
 	  ><a id="v:two" class="def"
 	    >two</a
-	    > :: Int <a href="#" class="selflink"
+	    > :: <a href="#" title="Data.Int"
+	    >Int</a
+	    > <a href="#" class="selflink"
 	    >#</a
 	    ></p
 	  ><div class="doc"
@@ -181,7 +203,9 @@
 	><p class="src"
 	  ><a id="v:three" class="def"
 	    >three</a
-	    > :: Int <a href="#" class="selflink"
+	    > :: <a href="#" title="Data.Int"
+	    >Int</a
+	    > <a href="#" class="selflink"
 	    >#</a
 	    ></p
 	  ><div class="doc"
diff --git a/html-test/ref/Bugs.html b/html-test/ref/Bugs.html
index 348ae6bc..abe20dc2 100644
--- a/html-test/ref/Bugs.html
+++ b/html-test/ref/Bugs.html
@@ -58,7 +58,9 @@
 	      ><td class="src"
 		><a id="v:A" class="def"
 		  >A</a
-		  > a (a -&gt; Int)</td
+		  > a (a -&gt; <a href="#" title="Data.Int"
+		  >Int</a
+		  >)</td
 		><td class="doc empty"
 		></td
 		></tr
diff --git a/html-test/ref/BundledPatterns.html b/html-test/ref/BundledPatterns.html
index 7a602ae1..e9c77612 100644
--- a/html-test/ref/BundledPatterns.html
+++ b/html-test/ref/BundledPatterns.html
@@ -48,7 +48,9 @@
 	      >data</span
 	      > <a href="#"
 	      >Vec</a
-	      > :: Nat -&gt; * -&gt; * <span class="keyword"
+	      > :: <a href="#" title="GHC.TypeNats"
+	      >Nat</a
+	      > -&gt; * -&gt; * <span class="keyword"
 	      >where</span
 	      ><ul class="subs"
 	      ><li
@@ -76,7 +78,9 @@
 	      >data</span
 	      > <a href="#"
 	      >RTree</a
-	      > :: Nat -&gt; * -&gt; * <span class="keyword"
+	      > :: <a href="#" title="GHC.TypeNats"
+	      >Nat</a
+	      > -&gt; * -&gt; * <span class="keyword"
 	      >where</span
 	      ><ul class="subs"
 	      ><li
@@ -115,7 +119,9 @@
 	    >data</span
 	    > <a id="t:Vec" class="def"
 	    >Vec</a
-	    > :: Nat -&gt; * -&gt; * <span class="keyword"
+	    > :: <a href="#" title="GHC.TypeNats"
+	    >Nat</a
+	    > -&gt; * -&gt; * <span class="keyword"
 	    >where</span
 	    > <a href="#" class="selflink"
 	    >#</a
@@ -136,7 +142,9 @@
 		> subscript starting from 0 and
    ending at <code
 		><code
-		  >length</code
+		  ><a href="#" title="Data.Foldable"
+		    >length</a
+		    ></code
 		  > - 1</code
 		>.</li
 	      ></ul
@@ -273,7 +281,9 @@
 	    >data</span
 	    > <a id="t:RTree" class="def"
 	    >RTree</a
-	    > :: Nat -&gt; * -&gt; * <span class="keyword"
+	    > :: <a href="#" title="GHC.TypeNats"
+	    >Nat</a
+	    > -&gt; * -&gt; * <span class="keyword"
 	    >where</span
 	    > <a href="#" class="selflink"
 	    >#</a
diff --git a/html-test/ref/BundledPatterns2.html b/html-test/ref/BundledPatterns2.html
index 6a60c748..2f456728 100644
--- a/html-test/ref/BundledPatterns2.html
+++ b/html-test/ref/BundledPatterns2.html
@@ -48,7 +48,9 @@
 	      >data</span
 	      > <a href="#"
 	      >Vec</a
-	      > :: Nat -&gt; * -&gt; * <span class="keyword"
+	      > :: <a href="#" title="GHC.TypeNats"
+	      >Nat</a
+	      > -&gt; * -&gt; * <span class="keyword"
 	      >where</span
 	      ><ul class="subs"
 	      ><li
@@ -78,7 +80,9 @@
 	      >data</span
 	      > <a href="#"
 	      >RTree</a
-	      > :: Nat -&gt; * -&gt; * <span class="keyword"
+	      > :: <a href="#" title="GHC.TypeNats"
+	      >Nat</a
+	      > -&gt; * -&gt; * <span class="keyword"
 	      >where</span
 	      ><ul class="subs"
 	      ><li
@@ -117,7 +121,9 @@
 	    >data</span
 	    > <a id="t:Vec" class="def"
 	    >Vec</a
-	    > :: Nat -&gt; * -&gt; * <span class="keyword"
+	    > :: <a href="#" title="GHC.TypeNats"
+	    >Nat</a
+	    > -&gt; * -&gt; * <span class="keyword"
 	    >where</span
 	    > <a href="#" class="selflink"
 	    >#</a
@@ -138,7 +144,9 @@
 		> subscript starting from 0 and
    ending at <code
 		><code
-		  >length</code
+		  ><a href="#" title="Data.Foldable"
+		    >length</a
+		    ></code
 		  > - 1</code
 		>.</li
 	      ></ul
@@ -271,7 +279,9 @@
 	    >data</span
 	    > <a id="t:RTree" class="def"
 	    >RTree</a
-	    > :: Nat -&gt; * -&gt; * <span class="keyword"
+	    > :: <a href="#" title="GHC.TypeNats"
+	    >Nat</a
+	    > -&gt; * -&gt; * <span class="keyword"
 	    >where</span
 	    > <a href="#" class="selflink"
 	    >#</a
diff --git a/html-test/ref/ConstructorArgs.html b/html-test/ref/ConstructorArgs.html
new file mode 100644
index 00000000..9aad9c86
--- /dev/null
+++ b/html-test/ref/ConstructorArgs.html
@@ -0,0 +1,720 @@
+<html xmlns="http://www.w3.org/1999/xhtml"
+><head
+  ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"
+     /><title
+    >ConstructorArgs</title
+    ><link href="#" rel="stylesheet" type="text/css" title="Ocean"
+     /><link rel="stylesheet" type="text/css" href="#"
+     /><script src="haddock-bundle.min.js" async="async" type="text/javascript"
+    ></script
+    ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"
+    ></script
+    ></head
+  ><body
+  ><div id="package-header"
+    ><ul class="links" id="page-menu"
+      ><li
+	><a href="#"
+	  >Contents</a
+	  ></li
+	><li
+	><a href="#"
+	  >Index</a
+	  ></li
+	></ul
+      ><p class="caption empty"
+      ></p
+      ></div
+    ><div id="content"
+    ><div id="module-header"
+      ><table class="info"
+	><tr
+	  ><th
+	    >Safe Haskell</th
+	    ><td
+	    >Safe</td
+	    ></tr
+	  ></table
+	><p class="caption"
+	>ConstructorArgs</p
+	></div
+      ><div id="synopsis"
+      ><details id="syn"
+	><summary
+	  >Synopsis</summary
+	  ><ul class="details-toggle" data-details-id="syn"
+	  ><li class="src short"
+	    ><span class="keyword"
+	      >data</span
+	      > <a href="#"
+	      >Foo</a
+	      ><ul class="subs"
+	      ><li
+		>= <a href="#"
+		  >Rec</a
+		  > { <ul class="subs"
+		  ><li
+		    ><a href="#"
+		      >x</a
+		      > :: <a href="#" title="Data.String"
+		      >String</a
+		      ></li
+		    ><li
+		    ><a href="#"
+		      >y</a
+		      > :: <a href="#" title="Data.String"
+		      >String</a
+		      ></li
+		    ></ul
+		  > }</li
+		><li
+		>| <a href="#"
+		  >Baz</a
+		  > <a href="#" title="Data.Int"
+		  >Int</a
+		  > <a href="#" title="Data.String"
+		  >String</a
+		  ></li
+		><li
+		>| <a href="#"
+		  >Boa</a
+		  > !<a href="#" title="Data.Int"
+		  >Int</a
+		  > !<a href="#" title="Data.String"
+		  >String</a
+		  ></li
+		><li
+		>| <a href="#" title="Data.Int"
+		  >Int</a
+		  > <a href="#"
+		  >:|</a
+		  > <a href="#" title="Data.String"
+		  >String</a
+		  ></li
+		><li
+		>| <a href="#" title="Data.Int"
+		  >Int</a
+		  > <a href="#"
+		  >:*</a
+		  > <a href="#" title="Data.String"
+		  >String</a
+		  ></li
+		></ul
+	      ></li
+	    ><li class="src short"
+	    ><span class="keyword"
+	      >data</span
+	      > <a href="#"
+	      >Boo</a
+	      > <span class="keyword"
+	      >where</span
+	      ><ul class="subs"
+	      ><li
+		><a href="#"
+		  >Foo</a
+		  > :: <a href="#" title="Data.Int"
+		  >Int</a
+		  > -&gt; <a href="#" title="Data.String"
+		  >String</a
+		  > -&gt; <a href="#" title="ConstructorArgs"
+		  >Boo</a
+		  ></li
+		><li
+		><a href="#"
+		  >Foa</a
+		  > :: <a href="#" title="Data.Int"
+		  >Int</a
+		  > -&gt; <a href="#" title="ConstructorArgs"
+		  >Boo</a
+		  ></li
+		><li
+		><span class="keyword"
+		  >pattern</span
+		  > <a href="#"
+		  >Fo</a
+		  > :: <a href="#" title="Data.Int"
+		  >Int</a
+		  > -&gt; <a href="#" title="Data.String"
+		  >String</a
+		  > -&gt; <a href="#" title="ConstructorArgs"
+		  >Boo</a
+		  ></li
+		><li
+		><span class="keyword"
+		  >pattern</span
+		  > <a href="#"
+		  >Fo'</a
+		  > :: <a href="#" title="ConstructorArgs"
+		  >Boo</a
+		  ></li
+		></ul
+	      ></li
+	    ><li class="src short"
+	    ><span class="keyword"
+	      >pattern</span
+	      > <a href="#"
+	      >Bo</a
+	      > :: <a href="#" title="Data.Int"
+	      >Int</a
+	      > -&gt; <a href="#" title="Data.String"
+	      >String</a
+	      > -&gt; <a href="#" title="ConstructorArgs"
+	      >Boo</a
+	      ></li
+	    ><li class="src short"
+	    ><span class="keyword"
+	      >pattern</span
+	      > <a href="#"
+	      >Bo'</a
+	      > :: <a href="#" title="Data.Int"
+	      >Int</a
+	      > -&gt; <a href="#" title="Data.String"
+	      >String</a
+	      > -&gt; <a href="#" title="ConstructorArgs"
+	      >Boo</a
+	      ></li
+	    ></ul
+	  ></details
+	></div
+      ><div id="interface"
+      ><h1
+	>Documentation</h1
+	><div class="top"
+	><p class="src"
+	  ><span class="keyword"
+	    >data</span
+	    > <a id="t:Foo" class="def"
+	    >Foo</a
+	    > <span class="fixity"
+	    >infixr 1</span
+	    ><span class="rightedge"
+	    ></span
+	    > <a href="#" class="selflink"
+	    >#</a
+	    ></p
+	  ><div class="subs constructors"
+	  ><p class="caption"
+	    >Constructors</p
+	    ><table
+	    ><tr
+	      ><td class="src"
+		><a id="v:Rec" class="def"
+		  >Rec</a
+		  ></td
+		><td class="doc"
+		><p
+		  >doc on a record</p
+		  ></td
+		></tr
+	      ><tr
+	      ><td colspan="2"
+		><div class="subs fields"
+		  ><p class="caption"
+		    >Fields</p
+		    ><ul
+		    ><li
+		      ><dfn class="src"
+			><a id="v:x" class="def"
+			  >x</a
+			  > :: <a href="#" title="Data.String"
+			  >String</a
+			  ></dfn
+			><div class="doc"
+			><p
+			  >doc on the <code
+			    ><a href="#" title="Data.String"
+			      >String</a
+			      ></code
+			    > field of <code
+			    ><a href="#" title="ConstructorArgs"
+			      >Rec</a
+			      ></code
+			    ></p
+			  ></div
+			></li
+		      ><li
+		      ><dfn class="src"
+			><a id="v:y" class="def"
+			  >y</a
+			  > :: <a href="#" title="Data.String"
+			  >String</a
+			  ></dfn
+			><div class="doc"
+			><p
+			  >doc on the <code
+			    ><a href="#" title="Data.String"
+			      >String</a
+			      ></code
+			    > field of <code
+			    ><a href="#" title="ConstructorArgs"
+			      >Rec</a
+			      ></code
+			    ></p
+			  ></div
+			></li
+		      ></ul
+		    ></div
+		  ></td
+		></tr
+	      ><tr
+	      ><td class="src"
+		><a id="v:Baz" class="def"
+		  >Baz</a
+		  > <a href="#" title="Data.Int"
+		  >Int</a
+		  > <a href="#" title="Data.String"
+		  >String</a
+		  ></td
+		><td class="doc"
+		><p
+		  >old prefix doc style</p
+		  ></td
+		></tr
+	      ><tr
+	      ><td class="src"
+		><a id="v:Boa" class="def"
+		  >Boa</a
+		  > <span class="fixity"
+		  >infixr 2</span
+		  ><span class="rightedge"
+		  ></span
+		  ></td
+		><td class="doc"
+		><p
+		  >doc on the <code
+		    ><a href="#" title="ConstructorArgs"
+		      >Boa</a
+		      ></code
+		    > constrictor</p
+		  ></td
+		></tr
+	      ><tr
+	      ><td colspan="2"
+		><div class="subs fields"
+		  ><p class="caption"
+		    >Fields</p
+		    ><ul
+		    ><li
+		      ><dfn class="src"
+			>!<a href="#" title="Data.Int"
+			  >Int</a
+			  ></dfn
+			><div class="doc"
+			><p
+			  >doc on the <code
+			    ><a href="#" title="Data.Int"
+			      >Int</a
+			      ></code
+			    > field of <code
+			    ><a href="#" title="ConstructorArgs"
+			      >Boa</a
+			      ></code
+			    ></p
+			  ></div
+			></li
+		      ><li
+		      ><dfn class="src"
+			>!<a href="#" title="Data.String"
+			  >String</a
+			  ></dfn
+			><div class="doc"
+			><p
+			  >doc on the <code
+			    ><a href="#" title="Data.String"
+			      >String</a
+			      ></code
+			    > field of <code
+			    ><a href="#" title="ConstructorArgs"
+			      >Boa</a
+			      ></code
+			    ></p
+			  ></div
+			></li
+		      ></ul
+		    ></div
+		  ></td
+		></tr
+	      ><tr
+	      ><td class="src"
+		><a href="#" title="Data.Int"
+		  >Int</a
+		  > <a id="v::-124-" class="def"
+		  >:|</a
+		  > <a href="#" title="Data.String"
+		  >String</a
+		  ></td
+		><td class="doc"
+		><p
+		  >old infix doc style</p
+		  ></td
+		></tr
+	      ><tr
+	      ><td class="src"
+		><a id="v::-42-" class="def"
+		  >(:*)</a
+		  > <span class="fixity"
+		  >infixr 3</span
+		  ><span class="rightedge"
+		  ></span
+		  ></td
+		><td class="doc"
+		><p
+		  >doc on the <code
+		    ><a href="#" title="ConstructorArgs"
+		      >:*</a
+		      ></code
+		    > constructor</p
+		  ></td
+		></tr
+	      ><tr
+	      ><td colspan="2"
+		><div class="subs fields"
+		  ><p class="caption"
+		    >Fields</p
+		    ><ul
+		    ><li
+		      ><dfn class="src"
+			><a href="#" title="Data.Int"
+			  >Int</a
+			  ></dfn
+			><div class="doc"
+			><p
+			  >doc on the <code
+			    ><a href="#" title="Data.Int"
+			      >Int</a
+			      ></code
+			    > field of the <code
+			    ><a href="#" title="ConstructorArgs"
+			      >:*</a
+			      ></code
+			    > constructor</p
+			  ></div
+			></li
+		      ><li
+		      ><dfn class="src"
+			><a href="#" title="Data.String"
+			  >String</a
+			  ></dfn
+			><div class="doc"
+			><p
+			  >doc on the <code
+			    ><a href="#" title="Data.String"
+			      >String</a
+			      ></code
+			    > field of the <code
+			    ><a href="#" title="ConstructorArgs"
+			      >:*</a
+			      ></code
+			    > constructor</p
+			  ></div
+			></li
+		      ></ul
+		    ></div
+		  ></td
+		></tr
+	      ></table
+	    ></div
+	  ></div
+	><div class="top"
+	><p class="src"
+	  ><span class="keyword"
+	    >data</span
+	    > <a id="t:Boo" class="def"
+	    >Boo</a
+	    > <span class="keyword"
+	    >where</span
+	    > <span class="fixity"
+	    >infixr 4</span
+	    ><span class="rightedge"
+	    ></span
+	    > <a href="#" class="selflink"
+	    >#</a
+	    ></p
+	  ><div class="subs constructors"
+	  ><p class="caption"
+	    >Constructors</p
+	    ><table
+	    ><tr
+	      ><td class="src"
+		><a id="v:Foo" class="def"
+		  >Foo</a
+		  > <span class="fixity"
+		  >infixr 1</span
+		  ><span class="rightedge"
+		  ></span
+		  ></td
+		><td class="doc"
+		><p
+		  >Info about a <code
+		    ><a href="#" title="ConstructorArgs"
+		      >Foo</a
+		      ></code
+		    ></p
+		  ></td
+		></tr
+	      ><tr
+	      ><td colspan="2"
+		><div class="subs fields"
+		  ><p class="caption"
+		    >Fields</p
+		    ><ul
+		    ><li
+		      ><dfn class="src"
+			>:: <a href="#" title="Data.Int"
+			  >Int</a
+			  ></dfn
+			><div class="doc"
+			><p
+			  ><code
+			    ><a href="#" title="Data.Int"
+			      >Int</a
+			      ></code
+			    > field of <code
+			    ><a href="#" title="ConstructorArgs"
+			      >Foo</a
+			      ></code
+			    ></p
+			  ></div
+			></li
+		      ><li
+		      ><dfn class="src"
+			>-&gt; <a href="#" title="Data.String"
+			  >String</a
+			  ></dfn
+			><div class="doc"
+			><p
+			  ><code
+			    ><a href="#" title="Data.String"
+			      >String</a
+			      ></code
+			    > field of <code
+			    ><a href="#" title="ConstructorArgs"
+			      >Foo</a
+			      ></code
+			    ></p
+			  ></div
+			></li
+		      ><li
+		      ><dfn class="src"
+			>-&gt; <a href="#" title="ConstructorArgs"
+			  >Boo</a
+			  ></dfn
+			><div class="doc"
+			><p
+			  >Make a <code
+			    ><a href="#" title="ConstructorArgs"
+			      >Boo</a
+			      ></code
+			    ></p
+			  ></div
+			></li
+		      ></ul
+		    ></div
+		  ></td
+		></tr
+	      ><tr
+	      ><td class="src"
+		><a id="v:Foa" class="def"
+		  >Foa</a
+		  > :: <a href="#" title="Data.Int"
+		  >Int</a
+		  > -&gt; <a href="#" title="ConstructorArgs"
+		  >Boo</a
+		  ></td
+		><td class="doc"
+		><p
+		  >no argument docs GADT</p
+		  ></td
+		></tr
+	      ></table
+	    ></div
+	  ><div class="subs bundled-patterns"
+	  ><p class="caption"
+	    >Bundled Patterns</p
+	    ><table
+	    ><tr
+	      ><td class="src"
+		><span class="keyword"
+		  >pattern</span
+		  > <a id="v:Fo" class="def"
+		  >Fo</a
+		  > <span class="fixity"
+		  >infixr 5</span
+		  ><span class="rightedge"
+		  ></span
+		  ></td
+		><td class="doc"
+		><p
+		  >Info about bundled <code
+		    ><a href="#" title="ConstructorArgs"
+		      >Fo</a
+		      ></code
+		    ></p
+		  ></td
+		></tr
+	      ><tr
+	      ><td colspan="2"
+		><div class="subs fields"
+		  ><p class="caption"
+		    >Fields</p
+		    ><ul
+		    ><li
+		      ><dfn class="src"
+			>:: <a href="#" title="Data.Int"
+			  >Int</a
+			  ></dfn
+			><div class="doc"
+			><p
+			  >an <code
+			    ><a href="#" title="Data.Int"
+			      >Int</a
+			      ></code
+			    ></p
+			  ></div
+			></li
+		      ><li
+		      ><dfn class="src"
+			>-&gt; <a href="#" title="Data.String"
+			  >String</a
+			  ></dfn
+			><div class="doc"
+			><p
+			  >a <code
+			    ><a href="#" title="Data.String"
+			      >String</a
+			      ></code
+			    ></p
+			  ></div
+			></li
+		      ><li
+		      ><dfn class="src"
+			>-&gt; <a href="#" title="ConstructorArgs"
+			  >Boo</a
+			  ></dfn
+			><div class="doc"
+			><p
+			  >a <code
+			    ><a href="#" title="ConstructorArgs"
+			      >Boo</a
+			      ></code
+			    ></p
+			  ></div
+			></li
+		      ></ul
+		    ></div
+		  ></td
+		></tr
+	      ><tr
+	      ><td class="src"
+		><span class="keyword"
+		  >pattern</span
+		  > <a id="v:Fo-39-" class="def"
+		  >Fo'</a
+		  > :: <a href="#" title="ConstructorArgs"
+		  >Boo</a
+		  ></td
+		><td class="doc"
+		><p
+		  >Bundled and no argument docs</p
+		  ></td
+		></tr
+	      ></table
+	    ></div
+	  ></div
+	><div class="top"
+	><p class="src"
+	  ><span class="keyword"
+	    >pattern</span
+	    > <a id="v:Bo" class="def"
+	    >Bo</a
+	    > <span class="fixity"
+	    >infixr 6</span
+	    ><span class="rightedge"
+	    ></span
+	    > <a href="#" class="selflink"
+	    >#</a
+	    ></p
+	  ><div class="subs arguments"
+	  ><p class="caption"
+	    >Arguments</p
+	    ><table
+	    ><tr
+	      ><td class="src"
+		>:: <a href="#" title="Data.Int"
+		  >Int</a
+		  ></td
+		><td class="doc"
+		><p
+		  >an <code
+		    ><a href="#" title="Data.Int"
+		      >Int</a
+		      ></code
+		    ></p
+		  ></td
+		></tr
+	      ><tr
+	      ><td class="src"
+		>-&gt; <a href="#" title="Data.String"
+		  >String</a
+		  ></td
+		><td class="doc"
+		><p
+		  >a <code
+		    ><a href="#" title="Data.String"
+		      >String</a
+		      ></code
+		    ></p
+		  ></td
+		></tr
+	      ><tr
+	      ><td class="src"
+		>-&gt; <a href="#" title="ConstructorArgs"
+		  >Boo</a
+		  ></td
+		><td class="doc"
+		><p
+		  >a <code
+		    ><a href="#" title="ConstructorArgs"
+		      >Boo</a
+		      ></code
+		    > pattern</p
+		  ></td
+		></tr
+	      ></table
+	    ></div
+	  ><div class="doc"
+	  ><p
+	    >Info about not-bundled <code
+	      ><a href="#" title="ConstructorArgs"
+		>Bo</a
+		></code
+	      ></p
+	    ></div
+	  ></div
+	><div class="top"
+	><p class="src"
+	  ><span class="keyword"
+	    >pattern</span
+	    > <a id="v:Bo-39-" class="def"
+	    >Bo'</a
+	    > :: <a href="#" title="Data.Int"
+	    >Int</a
+	    > -&gt; <a href="#" title="Data.String"
+	    >String</a
+	    > -&gt; <a href="#" title="ConstructorArgs"
+	    >Boo</a
+	    > <a href="#" class="selflink"
+	    >#</a
+	    ></p
+	  ><div class="doc"
+	  ><p
+	    >Not bunded and no argument docs</p
+	    ></div
+	  ></div
+	></div
+      ></div
+    ><div id="footer"
+    ></div
+    ></body
+  ></html
+>
\ No newline at end of file
diff --git a/html-test/ref/ConstructorPatternExport.html b/html-test/ref/ConstructorPatternExport.html
index 548cd729..6f091de7 100644
--- a/html-test/ref/ConstructorPatternExport.html
+++ b/html-test/ref/ConstructorPatternExport.html
@@ -47,7 +47,9 @@
 	    >pattern</span
 	    > <a id="v:FooCons" class="def"
 	    >FooCons</a
-	    > :: String -&gt; a -&gt; Foo a <a href="#" class="selflink"
+	    > :: <a href="#" title="Data.String"
+	    >String</a
+	    > -&gt; a -&gt; Foo a <a href="#" class="selflink"
 	    >#</a
 	    ></p
 	  ></div
@@ -57,7 +59,11 @@
 	    >pattern</span
 	    > <a id="v:MyRecCons" class="def"
 	    >MyRecCons</a
-	    > :: Bool -&gt; Int -&gt; MyRec <a href="#" class="selflink"
+	    > :: <a href="#" title="Data.Bool"
+	    >Bool</a
+	    > -&gt; <a href="#" title="Data.Int"
+	    >Int</a
+	    > -&gt; MyRec <a href="#" class="selflink"
 	    >#</a
 	    ></p
 	  ></div
@@ -67,7 +73,9 @@
 	    >pattern</span
 	    > <a id="v::-43-" class="def"
 	    >(:+)</a
-	    > :: String -&gt; a -&gt; MyInfix a <a href="#" class="selflink"
+	    > :: <a href="#" title="Data.String"
+	    >String</a
+	    > -&gt; a -&gt; MyInfix a <a href="#" class="selflink"
 	    >#</a
 	    ></p
 	  ></div
@@ -77,7 +85,9 @@
 	    >pattern</span
 	    > <a id="v:BlubCons" class="def"
 	    >BlubCons</a
-	    > :: () =&gt; Show b =&gt; b -&gt; Blub <a href="#" class="selflink"
+	    > :: () =&gt; <a href="#" title="Text.Show"
+	    >Show</a
+	    > b =&gt; b -&gt; Blub <a href="#" class="selflink"
 	    >#</a
 	    ></p
 	  ></div
@@ -87,7 +97,13 @@
 	    >pattern</span
 	    > <a id="v:MyGADTCons" class="def"
 	    >MyGADTCons</a
-	    > :: a -&gt; Int -&gt; MyGADT (Maybe String) <a href="#" class="selflink"
+	    > :: a -&gt; <a href="#" title="Data.Int"
+	    >Int</a
+	    > -&gt; MyGADT (<a href="#" title="GHC.Maybe"
+	    >Maybe</a
+	    > <a href="#" title="Data.String"
+	    >String</a
+	    >) <a href="#" class="selflink"
 	    >#</a
 	    ></p
 	  ></div
diff --git a/html-test/ref/DeprecatedFunction.html b/html-test/ref/DeprecatedFunction.html
index 5682128f..b43526ba 100644
--- a/html-test/ref/DeprecatedFunction.html
+++ b/html-test/ref/DeprecatedFunction.html
@@ -46,11 +46,15 @@
 	  ><li class="src short"
 	    ><a href="#"
 	      >foo</a
-	      > :: Int</li
+	      > :: <a href="#" title="Data.Int"
+	      >Int</a
+	      ></li
 	    ><li class="src short"
 	    ><a href="#"
 	      >bar</a
-	      > :: Int</li
+	      > :: <a href="#" title="Data.Int"
+	      >Int</a
+	      ></li
 	    ></ul
 	  ></details
 	></div
@@ -61,7 +65,9 @@
 	><p class="src"
 	  ><a id="v:foo" class="def"
 	    >foo</a
-	    > :: Int <a href="#" class="selflink"
+	    > :: <a href="#" title="Data.Int"
+	    >Int</a
+	    > <a href="#" class="selflink"
 	    >#</a
 	    ></p
 	  ><div class="doc"
@@ -81,7 +87,9 @@
 	><p class="src"
 	  ><a id="v:bar" class="def"
 	    >bar</a
-	    > :: Int <a href="#" class="selflink"
+	    > :: <a href="#" title="Data.Int"
+	    >Int</a
+	    > <a href="#" class="selflink"
 	    >#</a
 	    ></p
 	  ><div class="doc"
diff --git a/html-test/ref/DeprecatedFunction2.html b/html-test/ref/DeprecatedFunction2.html
index d4e19e7a..db0098b2 100644
--- a/html-test/ref/DeprecatedFunction2.html
+++ b/html-test/ref/DeprecatedFunction2.html
@@ -46,7 +46,9 @@
 	  ><li class="src short"
 	    ><a href="#"
 	      >foo</a
-	      > :: Int</li
+	      > :: <a href="#" title="Data.Int"
+	      >Int</a
+	      ></li
 	    ></ul
 	  ></details
 	></div
@@ -57,7 +59,9 @@
 	><p class="src"
 	  ><a id="v:foo" class="def"
 	    >foo</a
-	    > :: Int <a href="#" class="selflink"
+	    > :: <a href="#" title="Data.Int"
+	    >Int</a
+	    > <a href="#" class="selflink"
 	    >#</a
 	    ></p
 	  ><div class="doc"
diff --git a/html-test/ref/DeprecatedFunction3.html b/html-test/ref/DeprecatedFunction3.html
index 58cffae8..950c5203 100644
--- a/html-test/ref/DeprecatedFunction3.html
+++ b/html-test/ref/DeprecatedFunction3.html
@@ -46,7 +46,9 @@
 	  ><li class="src short"
 	    ><a href="#"
 	      >foo</a
-	      > :: Integer</li
+	      > :: <a href="#" title="Prelude"
+	      >Integer</a
+	      ></li
 	    ></ul
 	  ></details
 	></div
@@ -57,7 +59,9 @@
 	><p class="src"
 	  ><a id="v:foo" class="def"
 	    >foo</a
-	    > :: Integer <a href="#" class="selflink"
+	    > :: <a href="#" title="Prelude"
+	    >Integer</a
+	    > <a href="#" class="selflink"
 	    >#</a
 	    ></p
 	  ><div class="doc"
diff --git a/html-test/ref/DeprecatedModule.html b/html-test/ref/DeprecatedModule.html
index eb92dad9..91150577 100644
--- a/html-test/ref/DeprecatedModule.html
+++ b/html-test/ref/DeprecatedModule.html
@@ -61,7 +61,9 @@
 	><p class="src"
 	  ><a id="v:foo" class="def"
 	    >foo</a
-	    > :: Int <a href="#" class="selflink"
+	    > :: <a href="#" title="Data.Int"
+	    >Int</a
+	    > <a href="#" class="selflink"
 	    >#</a
 	    ></p
 	  ></div
diff --git a/html-test/ref/DeprecatedModule2.html b/html-test/ref/DeprecatedModule2.html
index 81f2e024..6688781f 100644
--- a/html-test/ref/DeprecatedModule2.html
+++ b/html-test/ref/DeprecatedModule2.html
@@ -55,7 +55,9 @@
 	><p class="src"
 	  ><a id="v:foo" class="def"
 	    >foo</a
-	    > :: Int <a href="#" class="selflink"
+	    > :: <a href="#" title="Data.Int"
+	    >Int</a
+	    > <a href="#" class="selflink"
 	    >#</a
 	    ></p
 	  ></div
diff --git a/html-test/ref/DeprecatedNewtype.html b/html-test/ref/DeprecatedNewtype.html
index 2640cbb5..8158f61d 100644
--- a/html-test/ref/DeprecatedNewtype.html
+++ b/html-test/ref/DeprecatedNewtype.html
@@ -50,7 +50,9 @@
 	      >SomeNewType</a
 	      > = <a href="#"
 	      >SomeNewTypeConst</a
-	      > String</li
+	      > <a href="#" title="Data.String"
+	      >String</a
+	      ></li
 	    ><li class="src short"
 	    ><span class="keyword"
 	      >newtype</span
@@ -58,7 +60,9 @@
 	      >SomeOtherNewType</a
 	      > = <a href="#"
 	      >SomeOtherNewTypeConst</a
-	      > String</li
+	      > <a href="#" title="Data.String"
+	      >String</a
+	      ></li
 	    ></ul
 	  ></details
 	></div
@@ -90,7 +94,9 @@
 	      ><td class="src"
 		><a id="v:SomeNewTypeConst" class="def"
 		  >SomeNewTypeConst</a
-		  > String</td
+		  > <a href="#" title="Data.String"
+		  >String</a
+		  ></td
 		><td class="doc"
 		><div class="warning"
 		  ><p
@@ -126,7 +132,9 @@
 	      ><td class="src"
 		><a id="v:SomeOtherNewTypeConst" class="def"
 		  >SomeOtherNewTypeConst</a
-		  > String</td
+		  > <a href="#" title="Data.String"
+		  >String</a
+		  ></td
 		><td class="doc"
 		><div class="warning"
 		  ><p
diff --git a/html-test/ref/DeprecatedReExport.html b/html-test/ref/DeprecatedReExport.html
index 214be4f4..f2bbb766 100644
--- a/html-test/ref/DeprecatedReExport.html
+++ b/html-test/ref/DeprecatedReExport.html
@@ -72,7 +72,9 @@
 	  ><li class="src short"
 	    ><a href="#"
 	      >foo</a
-	      > :: Int</li
+	      > :: <a href="#" title="Data.Int"
+	      >Int</a
+	      ></li
 	    ></ul
 	  ></details
 	></div
@@ -85,7 +87,9 @@
 	><p class="src"
 	  ><a id="v:foo" class="def"
 	    >foo</a
-	    > :: Int <a href="#" class="selflink"
+	    > :: <a href="#" title="Data.Int"
+	    >Int</a
+	    > <a href="#" class="selflink"
 	    >#</a
 	    ></p
 	  ><div class="doc"
diff --git a/html-test/ref/DeprecatedRecord.html b/html-test/ref/DeprecatedRecord.html
index 5ff532a4..c2de1538 100644
--- a/html-test/ref/DeprecatedRecord.html
+++ b/html-test/ref/DeprecatedRecord.html
@@ -54,11 +54,15 @@
 	      ><li
 		><a href="#"
 		  >fooName</a
-		  > :: String</li
+		  > :: <a href="#" title="Data.String"
+		  >String</a
+		  ></li
 		><li
 		><a href="#"
 		  >fooValue</a
-		  > :: Int</li
+		  > :: <a href="#" title="Data.Int"
+		  >Int</a
+		  ></li
 		></ul
 	      >}</li
 	    ></ul
@@ -102,7 +106,9 @@
 		      ><dfn class="src"
 			><a id="v:fooName" class="def"
 			  >fooName</a
-			  > :: String</dfn
+			  > :: <a href="#" title="Data.String"
+			  >String</a
+			  ></dfn
 			><div class="doc"
 			><p
 			  >some name</p
@@ -112,7 +118,9 @@
 		      ><dfn class="src"
 			><a id="v:fooValue" class="def"
 			  >fooValue</a
-			  > :: Int</dfn
+			  > :: <a href="#" title="Data.Int"
+			  >Int</a
+			  ></dfn
 			><div class="doc"
 			><div class="warning"
 			  ><p
diff --git a/html-test/ref/DeprecatedTypeSynonym.html b/html-test/ref/DeprecatedTypeSynonym.html
index 25526d72..fcb7f5ce 100644
--- a/html-test/ref/DeprecatedTypeSynonym.html
+++ b/html-test/ref/DeprecatedTypeSynonym.html
@@ -48,13 +48,17 @@
 	      >type</span
 	      > <a href="#"
 	      >TypeSyn</a
-	      > = String</li
+	      > = <a href="#" title="Data.String"
+	      >String</a
+	      ></li
 	    ><li class="src short"
 	    ><span class="keyword"
 	      >type</span
 	      > <a href="#"
 	      >OtherTypeSyn</a
-	      > = String</li
+	      > = <a href="#" title="Data.String"
+	      >String</a
+	      ></li
 	    ></ul
 	  ></details
 	></div
@@ -67,7 +71,9 @@
 	    >type</span
 	    > <a id="t:TypeSyn" class="def"
 	    >TypeSyn</a
-	    > = String <a href="#" class="selflink"
+	    > = <a href="#" title="Data.String"
+	    >String</a
+	    > <a href="#" class="selflink"
 	    >#</a
 	    ></p
 	  ><div class="doc"
@@ -85,7 +91,9 @@
 	    >type</span
 	    > <a id="t:OtherTypeSyn" class="def"
 	    >OtherTypeSyn</a
-	    > = String <a href="#" class="selflink"
+	    > = <a href="#" title="Data.String"
+	    >String</a
+	    > <a href="#" class="selflink"
 	    >#</a
 	    ></p
 	  ><div class="doc"
diff --git a/html-test/ref/Examples.html b/html-test/ref/Examples.html
index 7eeb5f7c..77a341f0 100644
--- a/html-test/ref/Examples.html
+++ b/html-test/ref/Examples.html
@@ -46,7 +46,11 @@
 	  ><li class="src short"
 	    ><a href="#"
 	      >fib</a
-	      > :: Integer -&gt; Integer</li
+	      > :: <a href="#" title="Prelude"
+	      >Integer</a
+	      > -&gt; <a href="#" title="Prelude"
+	      >Integer</a
+	      ></li
 	    ></ul
 	  ></details
 	></div
@@ -57,13 +61,19 @@
 	><p class="src"
 	  ><a id="v:fib" class="def"
 	    >fib</a
-	    > :: Integer -&gt; Integer <a href="#" class="selflink"
+	    > :: <a href="#" title="Prelude"
+	    >Integer</a
+	    > -&gt; <a href="#" title="Prelude"
+	    >Integer</a
+	    > <a href="#" class="selflink"
 	    >#</a
 	    ></p
 	  ><div class="doc"
 	  ><p
 	    >Fibonacci number of given <code
-	      >Integer</code
+	      ><a href="#" title="Prelude"
+		>Integer</a
+		></code
 	      >.</p
 	    ><p
 	    >Examples:</p
diff --git a/html-test/ref/FunArgs.html b/html-test/ref/FunArgs.html
index ae890105..97c9a3c5 100644
--- a/html-test/ref/FunArgs.html
+++ b/html-test/ref/FunArgs.html
@@ -54,13 +54,17 @@
 	    ><table
 	    ><tr
 	      ><td class="src"
-		>:: Ord a</td
+		>:: <a href="#" title="Data.Ord"
+		  >Ord</a
+		  > a</td
 		><td class="doc empty"
 		></td
 		></tr
 	      ><tr
 	      ><td class="src"
-		>=&gt; Int</td
+		>=&gt; <a href="#" title="Data.Int"
+		  >Int</a
+		  ></td
 		><td class="doc"
 		><p
 		  >First argument</p
@@ -76,7 +80,9 @@
 		></tr
 	      ><tr
 	      ><td class="src"
-		>-&gt; Bool</td
+		>-&gt; <a href="#" title="Data.Bool"
+		  >Bool</a
+		  ></td
 		><td class="doc"
 		><p
 		  >Third argument</p
@@ -208,7 +214,9 @@
 	      ><td class="src"
 		>:: <span class="keyword"
 		  >forall</span
-		  > (b :: ()). d ~ ()</td
+		  > (b :: ()). d ~ <a href="#" title="GHC.Tuple"
+		  >()</a
+		  ></td
 		><td class="doc empty"
 		></td
 		></tr
diff --git a/html-test/ref/GADTRecords.html b/html-test/ref/GADTRecords.html
index 1f0c87e8..5f6141db 100644
--- a/html-test/ref/GADTRecords.html
+++ b/html-test/ref/GADTRecords.html
@@ -60,7 +60,9 @@
 		><li
 		><a href="#"
 		  >C2</a
-		  > :: Ord a =&gt; [a] -&gt; <a href="#" title="GADTRecords"
+		  > :: <a href="#" title="Data.Ord"
+		  >Ord</a
+		  > a =&gt; [a] -&gt; <a href="#" title="GADTRecords"
 		  >H1</a
 		  > a a</li
 		><li
@@ -68,13 +70,19 @@
 		  >C3</a
 		  > :: {..} -&gt; <a href="#" title="GADTRecords"
 		  >H1</a
-		  > Int Int</li
+		  > <a href="#" title="Data.Int"
+		  >Int</a
+		  > <a href="#" title="Data.Int"
+		  >Int</a
+		  ></li
 		><li
 		><a href="#"
 		  >C4</a
 		  > :: {..} -&gt; <a href="#" title="GADTRecords"
 		  >H1</a
-		  > Int a</li
+		  > <a href="#" title="Data.Int"
+		  >Int</a
+		  > a</li
 		></ul
 	      ></li
 	    ></ul
@@ -116,7 +124,9 @@
 	      ><td class="src"
 		><a id="v:C2" class="def"
 		  >C2</a
-		  > :: Ord a =&gt; [a] -&gt; <a href="#" title="GADTRecords"
+		  > :: <a href="#" title="Data.Ord"
+		  >Ord</a
+		  > a =&gt; [a] -&gt; <a href="#" title="GADTRecords"
 		  >H1</a
 		  > a a</td
 		><td class="doc empty"
@@ -140,7 +150,9 @@
 		      ><dfn class="src"
 			>:: { <a id="v:field" class="def"
 			  >field</a
-			  > :: Int</dfn
+			  > :: <a href="#" title="Data.Int"
+			  >Int</a
+			  ></dfn
 			><div class="doc"
 			><p
 			  >hello docs</p
@@ -150,7 +162,11 @@
 		      ><dfn class="src"
 			>} -&gt; <a href="#" title="GADTRecords"
 			  >H1</a
-			  > Int Int</dfn
+			  > <a href="#" title="Data.Int"
+			  >Int</a
+			  > <a href="#" title="Data.Int"
+			  >Int</a
+			  ></dfn
 			><div class="doc empty"
 			></div
 			></li
@@ -186,7 +202,9 @@
 		      ><dfn class="src"
 			>} -&gt; <a href="#" title="GADTRecords"
 			  >H1</a
-			  > Int a</dfn
+			  > <a href="#" title="Data.Int"
+			  >Int</a
+			  > a</dfn
 			><div class="doc empty"
 			></div
 			></li
diff --git a/html-test/ref/GadtConstructorArgs.html b/html-test/ref/GadtConstructorArgs.html
new file mode 100644
index 00000000..7497de83
--- /dev/null
+++ b/html-test/ref/GadtConstructorArgs.html
@@ -0,0 +1,192 @@
+<html xmlns="http://www.w3.org/1999/xhtml"
+><head
+  ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"
+     /><title
+    >GadtConstructorArgs</title
+    ><link href="#" rel="stylesheet" type="text/css" title="Ocean"
+     /><link rel="stylesheet" type="text/css" href="#"
+     /><script src="haddock-bundle.min.js" async="async" type="text/javascript"
+    ></script
+    ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"
+    ></script
+    ></head
+  ><body
+  ><div id="package-header"
+    ><ul class="links" id="page-menu"
+      ><li
+	><a href="#"
+	  >Contents</a
+	  ></li
+	><li
+	><a href="#"
+	  >Index</a
+	  ></li
+	></ul
+      ><p class="caption empty"
+      ></p
+      ></div
+    ><div id="content"
+    ><div id="module-header"
+      ><table class="info"
+	><tr
+	  ><th
+	    >Safe Haskell</th
+	    ><td
+	    >Safe</td
+	    ></tr
+	  ></table
+	><p class="caption"
+	>GadtConstructorArgs</p
+	></div
+      ><div id="interface"
+      ><h1
+	>Documentation</h1
+	><div class="top"
+	><p class="src"
+	  ><span class="keyword"
+	    >data</span
+	    > <a id="t:Boo" class="def"
+	    >Boo</a
+	    > <span class="keyword"
+	    >where</span
+	    > <a href="#" class="selflink"
+	    >#</a
+	    ></p
+	  ><div class="subs constructors"
+	  ><p class="caption"
+	    >Constructors</p
+	    ><table
+	    ><tr
+	      ><td class="src"
+		><a id="v:Fot" class="def"
+		  >Fot</a
+		  ></td
+		><td class="doc empty"
+		></td
+		></tr
+	      ><tr
+	      ><td colspan="2"
+		><div class="subs fields"
+		  ><p class="caption"
+		    >Fields</p
+		    ><ul
+		    ><li
+		      ><dfn class="src"
+			>:: { <a id="v:x" class="def"
+			  >x</a
+			  > :: <a href="#" title="Data.Int"
+			  >Int</a
+			  ></dfn
+			><div class="doc"
+			><p
+			  >an <code
+			    ><a href="#" title="GadtConstructorArgs"
+			      >x</a
+			      ></code
+			    ></p
+			  ></div
+			></li
+		      ><li
+		      ><dfn class="src"
+			>, <a id="v:y" class="def"
+			  >y</a
+			  > :: <a href="#" title="Data.Int"
+			  >Int</a
+			  ></dfn
+			><div class="doc"
+			><p
+			  >a <code
+			    ><a href="#" title="GadtConstructorArgs"
+			      >y</a
+			      ></code
+			    ></p
+			  ></div
+			></li
+		      ><li
+		      ><dfn class="src"
+			>} -&gt; <a href="#" title="GadtConstructorArgs"
+			  >Boo</a
+			  ></dfn
+			><div class="doc empty"
+			></div
+			></li
+		      ></ul
+		    ></div
+		  ></td
+		></tr
+	      ><tr
+	      ><td class="src"
+		><a id="v:Fob" class="def"
+		  >Fob</a
+		  ></td
+		><td class="doc"
+		><p
+		  >Record GADT with docs</p
+		  ></td
+		></tr
+	      ><tr
+	      ><td colspan="2"
+		><div class="subs fields"
+		  ><p class="caption"
+		    >Fields</p
+		    ><ul
+		    ><li
+		      ><dfn class="src"
+			>:: { <a id="v:w" class="def"
+			  >w</a
+			  > :: <a href="#" title="Data.Int"
+			  >Int</a
+			  ></dfn
+			><div class="doc"
+			><p
+			  >a <code
+			    ><a href="#" title="GadtConstructorArgs"
+			      >w</a
+			      ></code
+			    ></p
+			  ></div
+			></li
+		      ><li
+		      ><dfn class="src"
+			>, <a id="v:z" class="def"
+			  >z</a
+			  > :: <a href="#" title="Data.Int"
+			  >Int</a
+			  ></dfn
+			><div class="doc"
+			><p
+			  >a <code
+			    ><a href="#" title="GadtConstructorArgs"
+			      >z</a
+			      ></code
+			    ></p
+			  ></div
+			></li
+		      ><li
+		      ><dfn class="src"
+			>} -&gt; <a href="#" title="GadtConstructorArgs"
+			  >Boo</a
+			  ></dfn
+			><div class="doc"
+			><p
+			  >a <code
+			    ><a href="#" title="GadtConstructorArgs"
+			      >Boo</a
+			      ></code
+			    ></p
+			  ></div
+			></li
+		      ></ul
+		    ></div
+		  ></td
+		></tr
+	      ></table
+	    ></div
+	  ></div
+	></div
+      ></div
+    ><div id="footer"
+    ></div
+    ></body
+  ></html
+>
\ No newline at end of file
diff --git a/html-test/ref/Hash.html b/html-test/ref/Hash.html
index c4f04f2c..8fd04bb4 100644
--- a/html-test/ref/Hash.html
+++ b/html-test/ref/Hash.html
@@ -87,23 +87,37 @@
 	    ><li class="src short"
 	    ><a href="#"
 	      >new</a
-	      > :: (Eq key, <a href="#" title="Hash"
+	      > :: (<a href="#" title="Data.Eq"
+	      >Eq</a
+	      > key, <a href="#" title="Hash"
 	      >Hash</a
-	      > key) =&gt; Int -&gt; IO (<a href="#" title="Hash"
+	      > key) =&gt; <a href="#" title="Data.Int"
+	      >Int</a
+	      > -&gt; <a href="#" title="System.IO"
+	      >IO</a
+	      > (<a href="#" title="Hash"
 	      >HashTable</a
 	      > key val)</li
 	    ><li class="src short"
 	    ><a href="#"
 	      >insert</a
-	      > :: (Eq key, <a href="#" title="Hash"
+	      > :: (<a href="#" title="Data.Eq"
+	      >Eq</a
+	      > key, <a href="#" title="Hash"
 	      >Hash</a
-	      > key) =&gt; key -&gt; val -&gt; IO ()</li
+	      > key) =&gt; key -&gt; val -&gt; <a href="#" title="System.IO"
+	      >IO</a
+	      > ()</li
 	    ><li class="src short"
 	    ><a href="#"
 	      >lookup</a
 	      > :: <a href="#" title="Hash"
 	      >Hash</a
-	      > key =&gt; key -&gt; IO (Maybe val)</li
+	      > key =&gt; key -&gt; <a href="#" title="System.IO"
+	      >IO</a
+	      > (<a href="#" title="GHC.Maybe"
+	      >Maybe</a
+	      > val)</li
 	    ><li class="src short"
 	    ><span class="keyword"
 	      >class</span
@@ -115,7 +129,9 @@
 	      ><li
 		><a href="#"
 		  >hash</a
-		  > :: a -&gt; Int</li
+		  > :: a -&gt; <a href="#" title="Data.Int"
+		  >Int</a
+		  ></li
 		></ul
 	      ></li
 	    ></ul
@@ -147,7 +163,9 @@
  The type <code
 	      >key</code
 	      > should be an instance of <code
-	      >Eq</code
+	      ><a href="#" title="Data.Eq"
+		>Eq</a
+		></code
 	      >.</p
 	    ></div
 	  ></div
@@ -161,9 +179,15 @@
 	><p class="src"
 	  ><a id="v:new" class="def"
 	    >new</a
-	    > :: (Eq key, <a href="#" title="Hash"
+	    > :: (<a href="#" title="Data.Eq"
+	    >Eq</a
+	    > key, <a href="#" title="Hash"
 	    >Hash</a
-	    > key) =&gt; Int -&gt; IO (<a href="#" title="Hash"
+	    > key) =&gt; <a href="#" title="Data.Int"
+	    >Int</a
+	    > -&gt; <a href="#" title="System.IO"
+	    >IO</a
+	    > (<a href="#" title="Hash"
 	    >HashTable</a
 	    > key val) <a href="#" class="selflink"
 	    >#</a
@@ -177,9 +201,13 @@
 	><p class="src"
 	  ><a id="v:insert" class="def"
 	    >insert</a
-	    > :: (Eq key, <a href="#" title="Hash"
+	    > :: (<a href="#" title="Data.Eq"
+	    >Eq</a
+	    > key, <a href="#" title="Hash"
 	    >Hash</a
-	    > key) =&gt; key -&gt; val -&gt; IO () <a href="#" class="selflink"
+	    > key) =&gt; key -&gt; val -&gt; <a href="#" title="System.IO"
+	    >IO</a
+	    > () <a href="#" class="selflink"
 	    >#</a
 	    ></p
 	  ><div class="doc"
@@ -193,18 +221,26 @@
 	    >lookup</a
 	    > :: <a href="#" title="Hash"
 	    >Hash</a
-	    > key =&gt; key -&gt; IO (Maybe val) <a href="#" class="selflink"
+	    > key =&gt; key -&gt; <a href="#" title="System.IO"
+	    >IO</a
+	    > (<a href="#" title="GHC.Maybe"
+	    >Maybe</a
+	    > val) <a href="#" class="selflink"
 	    >#</a
 	    ></p
 	  ><div class="doc"
 	  ><p
 	    >Looks up a key in the hash table, returns <code
 	      ><code
-		>Just</code
+		><a href="#" title="GHC.Maybe"
+		  >Just</a
+		  ></code
 		> val</code
 	      > if the key
  was found, or <code
-	      >Nothing</code
+	      ><a href="#" title="GHC.Maybe"
+		>Nothing</a
+		></code
 	      > otherwise.</p
 	    ></div
 	  ></div
@@ -235,7 +271,9 @@
 	    ><p class="src"
 	    ><a id="v:hash" class="def"
 	      >hash</a
-	      > :: a -&gt; Int <a href="#" class="selflink"
+	      > :: a -&gt; <a href="#" title="Data.Int"
+	      >Int</a
+	      > <a href="#" class="selflink"
 	      >#</a
 	      ></p
 	    ><div class="doc"
@@ -243,7 +281,9 @@
 	      >hashes the value of type <code
 		>a</code
 		> into an <code
-		>Int</code
+		><a href="#" title="Data.Int"
+		  >Int</a
+		  ></code
 		></p
 	      ></div
 	    ></div
@@ -259,7 +299,9 @@
 		      ></span
 		      > <a href="#" title="Hash"
 		      >Hash</a
-		      > Float</span
+		      > <a href="#" title="Prelude"
+		      >Float</a
+		      ></span
 		    > <a href="#" class="selflink"
 		    >#</a
 		    ></td
@@ -281,7 +323,11 @@
 			><p class="src"
 			><a href="#"
 			  >hash</a
-			  > :: Float -&gt; Int <a href="#" class="selflink"
+			  > :: <a href="#" title="Prelude"
+			  >Float</a
+			  > -&gt; <a href="#" title="Data.Int"
+			  >Int</a
+			  > <a href="#" class="selflink"
 			  >#</a
 			  ></p
 			></div
@@ -295,7 +341,9 @@
 		      ></span
 		      > <a href="#" title="Hash"
 		      >Hash</a
-		      > Int</span
+		      > <a href="#" title="Data.Int"
+		      >Int</a
+		      ></span
 		    > <a href="#" class="selflink"
 		    >#</a
 		    ></td
@@ -317,7 +365,11 @@
 			><p class="src"
 			><a href="#"
 			  >hash</a
-			  > :: Int -&gt; Int <a href="#" class="selflink"
+			  > :: <a href="#" title="Data.Int"
+			  >Int</a
+			  > -&gt; <a href="#" title="Data.Int"
+			  >Int</a
+			  > <a href="#" class="selflink"
 			  >#</a
 			  ></p
 			></div
@@ -357,7 +409,9 @@
 			><p class="src"
 			><a href="#"
 			  >hash</a
-			  > :: (a, b) -&gt; Int <a href="#" class="selflink"
+			  > :: (a, b) -&gt; <a href="#" title="Data.Int"
+			  >Int</a
+			  > <a href="#" class="selflink"
 			  >#</a
 			  ></p
 			></div
diff --git a/html-test/ref/HiddenInstances.html b/html-test/ref/HiddenInstances.html
index eb39dafc..9594d8e1 100644
--- a/html-test/ref/HiddenInstances.html
+++ b/html-test/ref/HiddenInstances.html
@@ -86,7 +86,9 @@
 		      ></span
 		      > <a href="#" title="HiddenInstances"
 		      >VisibleClass</a
-		      > Int</span
+		      > <a href="#" title="Data.Int"
+		      >Int</a
+		      ></span
 		    > <a href="#" class="selflink"
 		    >#</a
 		    ></td
@@ -164,7 +166,9 @@
 		  ><span class="inst-left"
 		    ><span class="instance details-toggle-control details-toggle" data-details-id="i:id:VisibleData:Num:1"
 		      ></span
-		      > Num <a href="#" title="HiddenInstances"
+		      > <a href="#" title="Prelude"
+		      >Num</a
+		      > <a href="#" title="HiddenInstances"
 		      >VisibleData</a
 		      ></span
 		    > <a href="#" class="selflink"
@@ -196,6 +200,8 @@
 			  >VisibleData</a
 			  > -&gt; <a href="#" title="HiddenInstances"
 			  >VisibleData</a
+			  > <a href="#" class="selflink"
+			  >#</a
 			  ></p
 			><p class="src"
 			><a href="#"
@@ -206,6 +212,8 @@
 			  >VisibleData</a
 			  > -&gt; <a href="#" title="HiddenInstances"
 			  >VisibleData</a
+			  > <a href="#" class="selflink"
+			  >#</a
 			  ></p
 			><p class="src"
 			><a href="#"
@@ -216,6 +224,8 @@
 			  >VisibleData</a
 			  > -&gt; <a href="#" title="HiddenInstances"
 			  >VisibleData</a
+			  > <a href="#" class="selflink"
+			  >#</a
 			  ></p
 			><p class="src"
 			><a href="#"
@@ -224,6 +234,8 @@
 			  >VisibleData</a
 			  > -&gt; <a href="#" title="HiddenInstances"
 			  >VisibleData</a
+			  > <a href="#" class="selflink"
+			  >#</a
 			  ></p
 			><p class="src"
 			><a href="#"
@@ -232,6 +244,8 @@
 			  >VisibleData</a
 			  > -&gt; <a href="#" title="HiddenInstances"
 			  >VisibleData</a
+			  > <a href="#" class="selflink"
+			  >#</a
 			  ></p
 			><p class="src"
 			><a href="#"
@@ -240,12 +254,18 @@
 			  >VisibleData</a
 			  > -&gt; <a href="#" title="HiddenInstances"
 			  >VisibleData</a
+			  > <a href="#" class="selflink"
+			  >#</a
 			  ></p
 			><p class="src"
 			><a href="#"
 			  >fromInteger</a
-			  > :: Integer -&gt; <a href="#" title="HiddenInstances"
+			  > :: <a href="#" title="Prelude"
+			  >Integer</a
+			  > -&gt; <a href="#" title="HiddenInstances"
 			  >VisibleData</a
+			  > <a href="#" class="selflink"
+			  >#</a
 			  ></p
 			></div
 		      ></details
diff --git a/html-test/ref/Hyperlinks.html b/html-test/ref/Hyperlinks.html
index 58d012a5..f331e741 100644
--- a/html-test/ref/Hyperlinks.html
+++ b/html-test/ref/Hyperlinks.html
@@ -46,7 +46,9 @@
 	  ><li class="src short"
 	    ><a href="#"
 	      >foo</a
-	      > :: Int</li
+	      > :: <a href="#" title="Data.Int"
+	      >Int</a
+	      ></li
 	    ></ul
 	  ></details
 	></div
@@ -57,7 +59,9 @@
 	><p class="src"
 	  ><a id="v:foo" class="def"
 	    >foo</a
-	    > :: Int <a href="#" class="selflink"
+	    > :: <a href="#" title="Data.Int"
+	    >Int</a
+	    > <a href="#" class="selflink"
 	    >#</a
 	    ></p
 	  ><div class="doc"
diff --git a/html-test/ref/Instances.html b/html-test/ref/Instances.html
index 40b1045c..a23f9eb9 100644
--- a/html-test/ref/Instances.html
+++ b/html-test/ref/Instances.html
@@ -102,7 +102,9 @@
 			  >foo</a
 			  > :: (a <a href="#" title="Instances"
 			  >&lt;~~</a
-			  > Int) -&gt; a0 -&gt; a <a href="#" title="Instances"
+			  > <a href="#" title="Data.Int"
+			  >Int</a
+			  >) -&gt; a0 -&gt; a <a href="#" title="Instances"
 			  >&lt;~~</a
 			  > a0 <a href="#" class="selflink"
 			  >#</a
@@ -114,11 +116,15 @@
 			  >&lt;~~</a
 			  > (a <a href="#" title="Instances"
 			  >&lt;~~</a
-			  > a0)) -&gt; Int -&gt; a <a href="#" title="Instances"
+			  > a0)) -&gt; <a href="#" title="Data.Int"
+			  >Int</a
+			  > -&gt; a <a href="#" title="Instances"
 			  >&lt;~~</a
 			  > (a <a href="#" title="Instances"
 			  >&lt;~~</a
-			  > Int) <a href="#" class="selflink"
+			  > <a href="#" title="Data.Int"
+			  >Int</a
+			  >) <a href="#" class="selflink"
 			  >#</a
 			  ></p
 			></div
@@ -152,13 +158,19 @@
 	    ><p class="src"
 	    ><a id="v:foo" class="def"
 	      >foo</a
-	      > :: f Int -&gt; a -&gt; f a <a href="#" class="selflink"
+	      > :: f <a href="#" title="Data.Int"
+	      >Int</a
+	      > -&gt; a -&gt; f a <a href="#" class="selflink"
 	      >#</a
 	      ></p
 	    ><p class="src"
 	    ><a id="v:foo-39-" class="def"
 	      >foo'</a
-	      > :: f (f a) -&gt; Int -&gt; f (f Int) <a href="#" class="selflink"
+	      > :: f (f a) -&gt; <a href="#" title="Data.Int"
+	      >Int</a
+	      > -&gt; f (f <a href="#" title="Data.Int"
+	      >Int</a
+	      >) <a href="#" class="selflink"
 	      >#</a
 	      ></p
 	    ></div
@@ -196,13 +208,19 @@
 			><p class="src"
 			><a href="#"
 			  >foo</a
-			  > :: [Int] -&gt; a -&gt; [a] <a href="#" class="selflink"
+			  > :: [<a href="#" title="Data.Int"
+			  >Int</a
+			  >] -&gt; a -&gt; [a] <a href="#" class="selflink"
 			  >#</a
 			  ></p
 			><p class="src"
 			><a href="#"
 			  >foo'</a
-			  > :: [[a]] -&gt; Int -&gt; [[Int]] <a href="#" class="selflink"
+			  > :: [[a]] -&gt; <a href="#" title="Data.Int"
+			  >Int</a
+			  > -&gt; [[<a href="#" title="Data.Int"
+			  >Int</a
+			  >]] <a href="#" class="selflink"
 			  >#</a
 			  ></p
 			></div
@@ -216,7 +234,9 @@
 		      ></span
 		      > <a href="#" title="Instances"
 		      >Foo</a
-		      > Maybe</span
+		      > <a href="#" title="GHC.Maybe"
+		      >Maybe</a
+		      ></span
 		    > <a href="#" class="selflink"
 		    >#</a
 		    ></td
@@ -238,13 +258,31 @@
 			><p class="src"
 			><a href="#"
 			  >foo</a
-			  > :: Maybe Int -&gt; a -&gt; Maybe a <a href="#" class="selflink"
+			  > :: <a href="#" title="GHC.Maybe"
+			  >Maybe</a
+			  > <a href="#" title="Data.Int"
+			  >Int</a
+			  > -&gt; a -&gt; <a href="#" title="GHC.Maybe"
+			  >Maybe</a
+			  > a <a href="#" class="selflink"
 			  >#</a
 			  ></p
 			><p class="src"
 			><a href="#"
 			  >foo'</a
-			  > :: Maybe (Maybe a) -&gt; Int -&gt; Maybe (Maybe Int) <a href="#" class="selflink"
+			  > :: <a href="#" title="GHC.Maybe"
+			  >Maybe</a
+			  > (<a href="#" title="GHC.Maybe"
+			  >Maybe</a
+			  > a) -&gt; <a href="#" title="Data.Int"
+			  >Int</a
+			  > -&gt; <a href="#" title="GHC.Maybe"
+			  >Maybe</a
+			  > (<a href="#" title="GHC.Maybe"
+			  >Maybe</a
+			  > <a href="#" title="Data.Int"
+			  >Int</a
+			  >) <a href="#" class="selflink"
 			  >#</a
 			  ></p
 			></div
@@ -258,7 +296,9 @@
 		      ></span
 		      > <a href="#" title="Instances"
 		      >Foo</a
-		      > (Either a)</span
+		      > (<a href="#" title="Data.Either"
+		      >Either</a
+		      > a)</span
 		    > <a href="#" class="selflink"
 		    >#</a
 		    ></td
@@ -280,13 +320,31 @@
 			><p class="src"
 			><a href="#"
 			  >foo</a
-			  > :: Either a Int -&gt; a0 -&gt; Either a a0 <a href="#" class="selflink"
+			  > :: <a href="#" title="Data.Either"
+			  >Either</a
+			  > a <a href="#" title="Data.Int"
+			  >Int</a
+			  > -&gt; a0 -&gt; <a href="#" title="Data.Either"
+			  >Either</a
+			  > a a0 <a href="#" class="selflink"
 			  >#</a
 			  ></p
 			><p class="src"
 			><a href="#"
 			  >foo'</a
-			  > :: Either a (Either a a0) -&gt; Int -&gt; Either a (Either a Int) <a href="#" class="selflink"
+			  > :: <a href="#" title="Data.Either"
+			  >Either</a
+			  > a (<a href="#" title="Data.Either"
+			  >Either</a
+			  > a a0) -&gt; <a href="#" title="Data.Int"
+			  >Int</a
+			  > -&gt; <a href="#" title="Data.Either"
+			  >Either</a
+			  > a (<a href="#" title="Data.Either"
+			  >Either</a
+			  > a <a href="#" title="Data.Int"
+			  >Int</a
+			  >) <a href="#" class="selflink"
 			  >#</a
 			  ></p
 			></div
@@ -298,11 +356,15 @@
 		  ><span class="inst-left"
 		    ><span class="instance details-toggle-control details-toggle" data-details-id="i:ic:Foo:Foo:4"
 		      ></span
-		      > (Eq a, <a href="#" title="Instances"
+		      > (<a href="#" title="Data.Eq"
+		      >Eq</a
+		      > a, <a href="#" title="Instances"
 		      >Foo</a
 		      > f) =&gt; <a href="#" title="Instances"
 		      >Foo</a
-		      > ((,) (f a))</span
+		      > (<a href="#" title="GHC.Tuple"
+		      >(,)</a
+		      > (f a))</span
 		    > <a href="#" class="selflink"
 		    >#</a
 		    ></td
@@ -324,13 +386,19 @@
 			><p class="src"
 			><a href="#"
 			  >foo</a
-			  > :: (f a, Int) -&gt; a0 -&gt; (f a, a0) <a href="#" class="selflink"
+			  > :: (f a, <a href="#" title="Data.Int"
+			  >Int</a
+			  >) -&gt; a0 -&gt; (f a, a0) <a href="#" class="selflink"
 			  >#</a
 			  ></p
 			><p class="src"
 			><a href="#"
 			  >foo'</a
-			  > :: (f a, (f a, a0)) -&gt; Int -&gt; (f a, (f a, Int)) <a href="#" class="selflink"
+			  > :: (f a, (f a, a0)) -&gt; <a href="#" title="Data.Int"
+			  >Int</a
+			  > -&gt; (f a, (f a, <a href="#" title="Data.Int"
+			  >Int</a
+			  >)) <a href="#" class="selflink"
 			  >#</a
 			  ></p
 			></div
@@ -370,7 +438,9 @@
 			  >foo</a
 			  > :: (a <a href="#" title="Instances"
 			  >&lt;~~</a
-			  > Int) -&gt; a0 -&gt; a <a href="#" title="Instances"
+			  > <a href="#" title="Data.Int"
+			  >Int</a
+			  >) -&gt; a0 -&gt; a <a href="#" title="Instances"
 			  >&lt;~~</a
 			  > a0 <a href="#" class="selflink"
 			  >#</a
@@ -382,11 +452,15 @@
 			  >&lt;~~</a
 			  > (a <a href="#" title="Instances"
 			  >&lt;~~</a
-			  > a0)) -&gt; Int -&gt; a <a href="#" title="Instances"
+			  > a0)) -&gt; <a href="#" title="Data.Int"
+			  >Int</a
+			  > -&gt; a <a href="#" title="Instances"
 			  >&lt;~~</a
 			  > (a <a href="#" title="Instances"
 			  >&lt;~~</a
-			  > Int) <a href="#" class="selflink"
+			  > <a href="#" title="Data.Int"
+			  >Int</a
+			  >) <a href="#" class="selflink"
 			  >#</a
 			  ></p
 			></div
@@ -400,7 +474,9 @@
 		      ></span
 		      > <a href="#" title="Instances"
 		      >Foo</a
-		      > ((,,) a a)</span
+		      > (<a href="#" title="GHC.Tuple"
+		      >(,,)</a
+		      > a a)</span
 		    > <a href="#" class="selflink"
 		    >#</a
 		    ></td
@@ -422,13 +498,19 @@
 			><p class="src"
 			><a href="#"
 			  >foo</a
-			  > :: (a, a, Int) -&gt; a0 -&gt; (a, a, a0) <a href="#" class="selflink"
+			  > :: (a, a, <a href="#" title="Data.Int"
+			  >Int</a
+			  >) -&gt; a0 -&gt; (a, a, a0) <a href="#" class="selflink"
 			  >#</a
 			  ></p
 			><p class="src"
 			><a href="#"
 			  >foo'</a
-			  > :: (a, a, (a, a, a0)) -&gt; Int -&gt; (a, a, (a, a, Int)) <a href="#" class="selflink"
+			  > :: (a, a, (a, a, a0)) -&gt; <a href="#" title="Data.Int"
+			  >Int</a
+			  > -&gt; (a, a, (a, a, <a href="#" title="Data.Int"
+			  >Int</a
+			  >)) <a href="#" class="selflink"
 			  >#</a
 			  ></p
 			></div
@@ -468,7 +550,9 @@
 			  >foo</a
 			  > :: <a href="#" title="Instances"
 			  >Quux</a
-			  > a b Int -&gt; a0 -&gt; <a href="#" title="Instances"
+			  > a b <a href="#" title="Data.Int"
+			  >Int</a
+			  > -&gt; a0 -&gt; <a href="#" title="Instances"
 			  >Quux</a
 			  > a b a0 <a href="#" class="selflink"
 			  >#</a
@@ -480,11 +564,15 @@
 			  >Quux</a
 			  > a b (<a href="#" title="Instances"
 			  >Quux</a
-			  > a b a0) -&gt; Int -&gt; <a href="#" title="Instances"
+			  > a b a0) -&gt; <a href="#" title="Data.Int"
+			  >Int</a
+			  > -&gt; <a href="#" title="Instances"
 			  >Quux</a
 			  > a b (<a href="#" title="Instances"
 			  >Quux</a
-			  > a b Int) <a href="#" class="selflink"
+			  > a b <a href="#" title="Data.Int"
+			  >Int</a
+			  >) <a href="#" class="selflink"
 			  >#</a
 			  ></p
 			></div
@@ -498,7 +586,11 @@
 		      ></span
 		      > <a href="#" title="Instances"
 		      >Foo</a
-		      > ((-&gt;) a :: * -&gt; *)</span
+		      > ((-&gt;) a :: <a href="#" title="Data.Kind"
+		      >Type</a
+		      > -&gt; <a href="#" title="Data.Kind"
+		      >Type</a
+		      >)</span
 		    > <a href="#" class="selflink"
 		    >#</a
 		    ></td
@@ -520,13 +612,19 @@
 			><p class="src"
 			><a href="#"
 			  >foo</a
-			  > :: (a -&gt; Int) -&gt; a0 -&gt; a -&gt; a0 <a href="#" class="selflink"
+			  > :: (a -&gt; <a href="#" title="Data.Int"
+			  >Int</a
+			  >) -&gt; a0 -&gt; a -&gt; a0 <a href="#" class="selflink"
 			  >#</a
 			  ></p
 			><p class="src"
 			><a href="#"
 			  >foo'</a
-			  > :: (a -&gt; (a -&gt; a0)) -&gt; Int -&gt; a -&gt; (a -&gt; Int) <a href="#" class="selflink"
+			  > :: (a -&gt; (a -&gt; a0)) -&gt; <a href="#" title="Data.Int"
+			  >Int</a
+			  > -&gt; a -&gt; (a -&gt; <a href="#" title="Data.Int"
+			  >Int</a
+			  >) <a href="#" class="selflink"
 			  >#</a
 			  ></p
 			></div
@@ -562,7 +660,9 @@
 	    ><p class="src"
 	    ><a id="v:bar" class="def"
 	      >bar</a
-	      > :: f a -&gt; f Bool -&gt; a <a href="#" class="selflink"
+	      > :: f a -&gt; f <a href="#" title="Data.Bool"
+	      >Bool</a
+	      > -&gt; a <a href="#" class="selflink"
 	      >#</a
 	      ></p
 	    ><p class="src"
@@ -596,7 +696,11 @@
 		      ></span
 		      > <a href="#" title="Instances"
 		      >Bar</a
-		      > Maybe Bool</span
+		      > <a href="#" title="GHC.Maybe"
+		      >Maybe</a
+		      > <a href="#" title="Data.Bool"
+		      >Bool</a
+		      ></span
 		    > <a href="#" class="selflink"
 		    >#</a
 		    ></td
@@ -618,25 +722,71 @@
 			><p class="src"
 			><a href="#"
 			  >bar</a
-			  > :: Maybe Bool -&gt; Maybe Bool -&gt; Bool <a href="#" class="selflink"
+			  > :: <a href="#" title="GHC.Maybe"
+			  >Maybe</a
+			  > <a href="#" title="Data.Bool"
+			  >Bool</a
+			  > -&gt; <a href="#" title="GHC.Maybe"
+			  >Maybe</a
+			  > <a href="#" title="Data.Bool"
+			  >Bool</a
+			  > -&gt; <a href="#" title="Data.Bool"
+			  >Bool</a
+			  > <a href="#" class="selflink"
 			  >#</a
 			  ></p
 			><p class="src"
 			><a href="#"
 			  >bar'</a
-			  > :: Maybe (Maybe Bool) -&gt; Maybe (Maybe (Maybe b)) <a href="#" class="selflink"
+			  > :: <a href="#" title="GHC.Maybe"
+			  >Maybe</a
+			  > (<a href="#" title="GHC.Maybe"
+			  >Maybe</a
+			  > <a href="#" title="Data.Bool"
+			  >Bool</a
+			  >) -&gt; <a href="#" title="GHC.Maybe"
+			  >Maybe</a
+			  > (<a href="#" title="GHC.Maybe"
+			  >Maybe</a
+			  > (<a href="#" title="GHC.Maybe"
+			  >Maybe</a
+			  > b)) <a href="#" class="selflink"
 			  >#</a
 			  ></p
 			><p class="src"
 			><a href="#"
 			  >bar0</a
-			  > :: (Maybe Bool, Maybe Bool) -&gt; (Maybe b, Maybe c) <a href="#" class="selflink"
+			  > :: (<a href="#" title="GHC.Maybe"
+			  >Maybe</a
+			  > <a href="#" title="Data.Bool"
+			  >Bool</a
+			  >, <a href="#" title="GHC.Maybe"
+			  >Maybe</a
+			  > <a href="#" title="Data.Bool"
+			  >Bool</a
+			  >) -&gt; (<a href="#" title="GHC.Maybe"
+			  >Maybe</a
+			  > b, <a href="#" title="GHC.Maybe"
+			  >Maybe</a
+			  > c) <a href="#" class="selflink"
 			  >#</a
 			  ></p
 			><p class="src"
 			><a href="#"
 			  >bar1</a
-			  > :: (Maybe Bool, Maybe Bool) -&gt; (Maybe b, Maybe c) <a href="#" class="selflink"
+			  > :: (<a href="#" title="GHC.Maybe"
+			  >Maybe</a
+			  > <a href="#" title="Data.Bool"
+			  >Bool</a
+			  >, <a href="#" title="GHC.Maybe"
+			  >Maybe</a
+			  > <a href="#" title="Data.Bool"
+			  >Bool</a
+			  >) -&gt; (<a href="#" title="GHC.Maybe"
+			  >Maybe</a
+			  > b, <a href="#" title="GHC.Maybe"
+			  >Maybe</a
+			  > c) <a href="#" class="selflink"
 			  >#</a
 			  ></p
 			></div
@@ -650,7 +800,9 @@
 		      ></span
 		      > <a href="#" title="Instances"
 		      >Bar</a
-		      > Maybe [a]</span
+		      > <a href="#" title="GHC.Maybe"
+		      >Maybe</a
+		      > [a]</span
 		    > <a href="#" class="selflink"
 		    >#</a
 		    ></td
@@ -672,25 +824,57 @@
 			><p class="src"
 			><a href="#"
 			  >bar</a
-			  > :: Maybe [a] -&gt; Maybe Bool -&gt; [a] <a href="#" class="selflink"
+			  > :: <a href="#" title="GHC.Maybe"
+			  >Maybe</a
+			  > [a] -&gt; <a href="#" title="GHC.Maybe"
+			  >Maybe</a
+			  > <a href="#" title="Data.Bool"
+			  >Bool</a
+			  > -&gt; [a] <a href="#" class="selflink"
 			  >#</a
 			  ></p
 			><p class="src"
 			><a href="#"
 			  >bar'</a
-			  > :: Maybe (Maybe [a]) -&gt; Maybe (Maybe (Maybe b)) <a href="#" class="selflink"
+			  > :: <a href="#" title="GHC.Maybe"
+			  >Maybe</a
+			  > (<a href="#" title="GHC.Maybe"
+			  >Maybe</a
+			  > [a]) -&gt; <a href="#" title="GHC.Maybe"
+			  >Maybe</a
+			  > (<a href="#" title="GHC.Maybe"
+			  >Maybe</a
+			  > (<a href="#" title="GHC.Maybe"
+			  >Maybe</a
+			  > b)) <a href="#" class="selflink"
 			  >#</a
 			  ></p
 			><p class="src"
 			><a href="#"
 			  >bar0</a
-			  > :: (Maybe [a], Maybe [a]) -&gt; (Maybe b, Maybe c) <a href="#" class="selflink"
+			  > :: (<a href="#" title="GHC.Maybe"
+			  >Maybe</a
+			  > [a], <a href="#" title="GHC.Maybe"
+			  >Maybe</a
+			  > [a]) -&gt; (<a href="#" title="GHC.Maybe"
+			  >Maybe</a
+			  > b, <a href="#" title="GHC.Maybe"
+			  >Maybe</a
+			  > c) <a href="#" class="selflink"
 			  >#</a
 			  ></p
 			><p class="src"
 			><a href="#"
 			  >bar1</a
-			  > :: (Maybe [a], Maybe [a]) -&gt; (Maybe b, Maybe c) <a href="#" class="selflink"
+			  > :: (<a href="#" title="GHC.Maybe"
+			  >Maybe</a
+			  > [a], <a href="#" title="GHC.Maybe"
+			  >Maybe</a
+			  > [a]) -&gt; (<a href="#" title="GHC.Maybe"
+			  >Maybe</a
+			  > b, <a href="#" title="GHC.Maybe"
+			  >Maybe</a
+			  > c) <a href="#" class="selflink"
 			  >#</a
 			  ></p
 			></div
@@ -726,7 +910,9 @@
 			><p class="src"
 			><a href="#"
 			  >bar</a
-			  > :: [(a, a)] -&gt; [Bool] -&gt; (a, a) <a href="#" class="selflink"
+			  > :: [(a, a)] -&gt; [<a href="#" title="Data.Bool"
+			  >Bool</a
+			  >] -&gt; (a, a) <a href="#" class="selflink"
 			  >#</a
 			  ></p
 			><p class="src"
@@ -760,7 +946,9 @@
 		      >Foo</a
 		      > f =&gt; <a href="#" title="Instances"
 		      >Bar</a
-		      > (Either a) (f a)</span
+		      > (<a href="#" title="Data.Either"
+		      >Either</a
+		      > a) (f a)</span
 		    > <a href="#" class="selflink"
 		    >#</a
 		    ></td
@@ -782,25 +970,57 @@
 			><p class="src"
 			><a href="#"
 			  >bar</a
-			  > :: Either a (f a) -&gt; Either a Bool -&gt; f a <a href="#" class="selflink"
+			  > :: <a href="#" title="Data.Either"
+			  >Either</a
+			  > a (f a) -&gt; <a href="#" title="Data.Either"
+			  >Either</a
+			  > a <a href="#" title="Data.Bool"
+			  >Bool</a
+			  > -&gt; f a <a href="#" class="selflink"
 			  >#</a
 			  ></p
 			><p class="src"
 			><a href="#"
 			  >bar'</a
-			  > :: Either a (Either a (f a)) -&gt; Either a (Either a (Either a b)) <a href="#" class="selflink"
+			  > :: <a href="#" title="Data.Either"
+			  >Either</a
+			  > a (<a href="#" title="Data.Either"
+			  >Either</a
+			  > a (f a)) -&gt; <a href="#" title="Data.Either"
+			  >Either</a
+			  > a (<a href="#" title="Data.Either"
+			  >Either</a
+			  > a (<a href="#" title="Data.Either"
+			  >Either</a
+			  > a b)) <a href="#" class="selflink"
 			  >#</a
 			  ></p
 			><p class="src"
 			><a href="#"
 			  >bar0</a
-			  > :: (Either a (f a), Either a (f a)) -&gt; (Either a b, Either a c) <a href="#" class="selflink"
+			  > :: (<a href="#" title="Data.Either"
+			  >Either</a
+			  > a (f a), <a href="#" title="Data.Either"
+			  >Either</a
+			  > a (f a)) -&gt; (<a href="#" title="Data.Either"
+			  >Either</a
+			  > a b, <a href="#" title="Data.Either"
+			  >Either</a
+			  > a c) <a href="#" class="selflink"
 			  >#</a
 			  ></p
 			><p class="src"
 			><a href="#"
 			  >bar1</a
-			  > :: (Either a (f a), Either a (f a)) -&gt; (Either a b, Either a c) <a href="#" class="selflink"
+			  > :: (<a href="#" title="Data.Either"
+			  >Either</a
+			  > a (f a), <a href="#" title="Data.Either"
+			  >Either</a
+			  > a (f a)) -&gt; (<a href="#" title="Data.Either"
+			  >Either</a
+			  > a b, <a href="#" title="Data.Either"
+			  >Either</a
+			  > a c) <a href="#" class="selflink"
 			  >#</a
 			  ></p
 			></div
@@ -814,9 +1034,13 @@
 		      ></span
 		      > <a href="#" title="Instances"
 		      >Foo</a
-		      > ((,,) a b) =&gt; <a href="#" title="Instances"
+		      > (<a href="#" title="GHC.Tuple"
+		      >(,,)</a
+		      > a b) =&gt; <a href="#" title="Instances"
 		      >Bar</a
-		      > ((,,) a b) (a, b, a)</span
+		      > (<a href="#" title="GHC.Tuple"
+		      >(,,)</a
+		      > a b) (a, b, a)</span
 		    > <a href="#" class="selflink"
 		    >#</a
 		    ></td
@@ -838,7 +1062,9 @@
 			><p class="src"
 			><a href="#"
 			  >bar</a
-			  > :: (a, b, (a, b, a)) -&gt; (a, b, Bool) -&gt; (a, b, a) <a href="#" class="selflink"
+			  > :: (a, b, (a, b, a)) -&gt; (a, b, <a href="#" title="Data.Bool"
+			  >Bool</a
+			  >) -&gt; (a, b, a) <a href="#" class="selflink"
 			  >#</a
 			  ></p
 			><p class="src"
@@ -902,7 +1128,9 @@
 			  >Quux</a
 			  > a b c) -&gt; <a href="#" title="Instances"
 			  >Quux</a
-			  > a c Bool -&gt; <a href="#" title="Instances"
+			  > a c <a href="#" title="Data.Bool"
+			  >Bool</a
+			  > -&gt; <a href="#" title="Instances"
 			  >Quux</a
 			  > a b c <a href="#" class="selflink"
 			  >#</a
@@ -1432,7 +1660,9 @@
 			  >foo</a
 			  > :: <a href="#" title="Instances"
 			  >Quux</a
-			  > a b Int -&gt; a0 -&gt; <a href="#" title="Instances"
+			  > a b <a href="#" title="Data.Int"
+			  >Int</a
+			  > -&gt; a0 -&gt; <a href="#" title="Instances"
 			  >Quux</a
 			  > a b a0 <a href="#" class="selflink"
 			  >#</a
@@ -1444,11 +1674,15 @@
 			  >Quux</a
 			  > a b (<a href="#" title="Instances"
 			  >Quux</a
-			  > a b a0) -&gt; Int -&gt; <a href="#" title="Instances"
+			  > a b a0) -&gt; <a href="#" title="Data.Int"
+			  >Int</a
+			  > -&gt; <a href="#" title="Instances"
 			  >Quux</a
 			  > a b (<a href="#" title="Instances"
 			  >Quux</a
-			  > a b Int) <a href="#" class="selflink"
+			  > a b <a href="#" title="Data.Int"
+			  >Int</a
+			  >) <a href="#" class="selflink"
 			  >#</a
 			  ></p
 			></div
@@ -1494,7 +1728,9 @@
 			  >Quux</a
 			  > a b c) -&gt; <a href="#" title="Instances"
 			  >Quux</a
-			  > a c Bool -&gt; <a href="#" title="Instances"
+			  > a c <a href="#" title="Data.Bool"
+			  >Bool</a
+			  > -&gt; <a href="#" title="Instances"
 			  >Quux</a
 			  > a b c <a href="#" class="selflink"
 			  >#</a
@@ -1642,7 +1878,9 @@
 		      >data</span
 		      > <a href="#" title="Instances"
 		      >Thud</a
-		      > Int (<a href="#" title="Instances"
+		      > <a href="#" title="Data.Int"
+		      >Int</a
+		      > (<a href="#" title="Instances"
 		      >Quux</a
 		      > a [a] c)</span
 		    > <a href="#" class="selflink"
@@ -1665,7 +1903,9 @@
 			>data</span
 			> <a href="#" title="Instances"
 			>Thud</a
-			> Int (<a href="#" title="Instances"
+			> <a href="#" title="Data.Int"
+			>Int</a
+			> (<a href="#" title="Instances"
 			>Quux</a
 			> a [a] c) <ul class="inst"
 			><li class="inst"
@@ -1675,7 +1915,11 @@
 			  ><li class="inst"
 			  >| <a id="v:Thuuud" class="def"
 			    >Thuuud</a
-			    > Int Int</li
+			    > <a href="#" title="Data.Int"
+			    >Int</a
+			    > <a href="#" title="Data.Int"
+			    >Int</a
+			    ></li
 			  ></ul
 			></div
 		      ></details
@@ -1746,7 +1990,11 @@
 		      ></span
 		      > <a href="#" title="Instances"
 		      >Norf</a
-		      > Int Bool</span
+		      > <a href="#" title="Data.Int"
+		      >Int</a
+		      > <a href="#" title="Data.Bool"
+		      >Bool</a
+		      ></span
 		    > <a href="#" class="selflink"
 		    >#</a
 		    ></td
@@ -1770,7 +2018,13 @@
 			  >type</span
 			  > <a href="#" title="Instances"
 			  >Plugh</a
-			  > Int c Bool :: * <a href="#" class="selflink"
+			  > <a href="#" title="Data.Int"
+			  >Int</a
+			  > c <a href="#" title="Data.Bool"
+			  >Bool</a
+			  > :: <a href="#" title="Data.Kind"
+			  >Type</a
+			  > <a href="#" class="selflink"
 			  >#</a
 			  ></p
 			><p class="src"
@@ -1778,7 +2032,11 @@
 			  >data</span
 			  > <a href="#" title="Instances"
 			  >Thud</a
-			  > Int c :: * <a href="#" class="selflink"
+			  > <a href="#" title="Data.Int"
+			  >Int</a
+			  > c :: <a href="#" title="Data.Kind"
+			  >Type</a
+			  > <a href="#" class="selflink"
 			  >#</a
 			  ></p
 			></div
@@ -1790,7 +2048,17 @@
 			  >norf</a
 			  > :: <a href="#" title="Instances"
 			  >Plugh</a
-			  > Int c Bool -&gt; Int -&gt; (Int -&gt; c) -&gt; Bool <a href="#" class="selflink"
+			  > <a href="#" title="Data.Int"
+			  >Int</a
+			  > c <a href="#" title="Data.Bool"
+			  >Bool</a
+			  > -&gt; <a href="#" title="Data.Int"
+			  >Int</a
+			  > -&gt; (<a href="#" title="Data.Int"
+			  >Int</a
+			  > -&gt; c) -&gt; <a href="#" title="Data.Bool"
+			  >Bool</a
+			  > <a href="#" class="selflink"
 			  >#</a
 			  ></p
 			></div
@@ -1828,7 +2096,9 @@
 			  >type</span
 			  > <a href="#" title="Instances"
 			  >Plugh</a
-			  > [a] c [b] :: * <a href="#" class="selflink"
+			  > [a] c [b] :: <a href="#" title="Data.Kind"
+			  >Type</a
+			  > <a href="#" class="selflink"
 			  >#</a
 			  ></p
 			><p class="src"
@@ -1836,7 +2106,9 @@
 			  >data</span
 			  > <a href="#" title="Instances"
 			  >Thud</a
-			  > [a] c :: * <a href="#" class="selflink"
+			  > [a] c :: <a href="#" title="Data.Kind"
+			  >Type</a
+			  > <a href="#" class="selflink"
 			  >#</a
 			  ></p
 			></div
diff --git a/html-test/ref/Math.html b/html-test/ref/Math.html
index ebdf6385..71079bdd 100644
--- a/html-test/ref/Math.html
+++ b/html-test/ref/Math.html
@@ -62,7 +62,9 @@
 	  ><li class="src short"
 	    ><a href="#"
 	      >f</a
-	      > :: Integer</li
+	      > :: <a href="#" title="Prelude"
+	      >Integer</a
+	      ></li
 	    ></ul
 	  ></details
 	></div
@@ -73,7 +75,9 @@
 	><p class="src"
 	  ><a id="v:f" class="def"
 	    >f</a
-	    > :: Integer <a href="#" class="selflink"
+	    > :: <a href="#" title="Prelude"
+	    >Integer</a
+	    > <a href="#" class="selflink"
 	    >#</a
 	    ></p
 	  ><div class="doc"
diff --git a/html-test/ref/ModuleWithWarning.html b/html-test/ref/ModuleWithWarning.html
index c29b20d9..7a045575 100644
--- a/html-test/ref/ModuleWithWarning.html
+++ b/html-test/ref/ModuleWithWarning.html
@@ -61,7 +61,9 @@
 	><p class="src"
 	  ><a id="v:foo" class="def"
 	    >foo</a
-	    > :: Int <a href="#" class="selflink"
+	    > :: <a href="#" title="Data.Int"
+	    >Int</a
+	    > <a href="#" class="selflink"
 	    >#</a
 	    ></p
 	  ></div
diff --git a/html-test/ref/NoLayout.html b/html-test/ref/NoLayout.html
index 1f908ba3..a92d1a34 100644
--- a/html-test/ref/NoLayout.html
+++ b/html-test/ref/NoLayout.html
@@ -46,7 +46,9 @@
 	  ><li class="src short"
 	    ><a href="#"
 	      >g</a
-	      > :: Int</li
+	      > :: <a href="#" title="Data.Int"
+	      >Int</a
+	      ></li
 	    ></ul
 	  ></details
 	></div
@@ -57,7 +59,9 @@
 	><p class="src"
 	  ><a id="v:g" class="def"
 	    >g</a
-	    > :: Int <a href="#" class="selflink"
+	    > :: <a href="#" title="Data.Int"
+	    >Int</a
+	    > <a href="#" class="selflink"
 	    >#</a
 	    ></p
 	  ><div class="doc"
diff --git a/html-test/ref/OrphanInstances.html b/html-test/ref/OrphanInstances.html
index a70c9640..16ac16d6 100644
--- a/html-test/ref/OrphanInstances.html
+++ b/html-test/ref/OrphanInstances.html
@@ -86,7 +86,9 @@
 		      >aClass</a
 		      > :: <a href="#" title="OrphanInstancesType"
 		      >AType</a
-		      > -&gt; Int <a href="#" class="selflink"
+		      > -&gt; <a href="#" title="Data.Int"
+		      >Int</a
+		      > <a href="#" class="selflink"
 		      >#</a
 		      ></p
 		    ></div
diff --git a/html-test/ref/OrphanInstancesClass.html b/html-test/ref/OrphanInstancesClass.html
index c59c43dd..81651e18 100644
--- a/html-test/ref/OrphanInstancesClass.html
+++ b/html-test/ref/OrphanInstancesClass.html
@@ -58,7 +58,9 @@
 	    ><p class="src"
 	    ><a id="v:aClass" class="def"
 	      >aClass</a
-	      > :: a -&gt; Int <a href="#" class="selflink"
+	      > :: a -&gt; <a href="#" title="Data.Int"
+	      >Int</a
+	      > <a href="#" class="selflink"
 	      >#</a
 	      ></p
 	    ></div
@@ -102,7 +104,9 @@
 			  >aClass</a
 			  > :: <a href="#" title="OrphanInstancesType"
 			  >AType</a
-			  > -&gt; Int <a href="#" class="selflink"
+			  > -&gt; <a href="#" title="Data.Int"
+			  >Int</a
+			  > <a href="#" class="selflink"
 			  >#</a
 			  ></p
 			></div
diff --git a/html-test/ref/OrphanInstancesType.html b/html-test/ref/OrphanInstancesType.html
index 2714bb1f..ddb85534 100644
--- a/html-test/ref/OrphanInstancesType.html
+++ b/html-test/ref/OrphanInstancesType.html
@@ -58,7 +58,9 @@
 	      ><td class="src"
 		><a id="v:AType" class="def"
 		  >AType</a
-		  > Int</td
+		  > <a href="#" title="Data.Int"
+		  >Int</a
+		  ></td
 		><td class="doc empty"
 		></td
 		></tr
@@ -104,7 +106,9 @@
 			  >aClass</a
 			  > :: <a href="#" title="OrphanInstancesType"
 			  >AType</a
-			  > -&gt; Int <a href="#" class="selflink"
+			  > -&gt; <a href="#" title="Data.Int"
+			  >Int</a
+			  > <a href="#" class="selflink"
 			  >#</a
 			  ></p
 			></div
diff --git a/html-test/ref/PatternSyns.html b/html-test/ref/PatternSyns.html
index fce20f96..19c1fecf 100644
--- a/html-test/ref/PatternSyns.html
+++ b/html-test/ref/PatternSyns.html
@@ -100,7 +100,9 @@
 	      >data</span
 	      > <a href="#"
 	      >BlubType</a
-	      > = Show x =&gt; <a href="#"
+	      > = <a href="#" title="Text.Show"
+	      >Show</a
+	      > x =&gt; <a href="#"
 	      >BlubCtor</a
 	      > x</li
 	    ><li class="src short"
@@ -110,7 +112,9 @@
 	      >Blub</a
 	      > :: () =&gt; <span class="keyword"
 	      >forall</span
-	      > x. Show x =&gt; x -&gt; <a href="#" title="PatternSyns"
+	      > x. <a href="#" title="Text.Show"
+	      >Show</a
+	      > x =&gt; x -&gt; <a href="#" title="PatternSyns"
 	      >BlubType</a
 	      ></li
 	    ><li class="src short"
@@ -136,7 +140,9 @@
 	      >pattern</span
 	      > <a href="#"
 	      >PatWithExplicitSig</a
-	      > :: Eq somex =&gt; somex -&gt; <a href="#" title="PatternSyns"
+	      > :: <a href="#" title="Data.Eq"
+	      >Eq</a
+	      > somex =&gt; somex -&gt; <a href="#" title="PatternSyns"
 	      >FooType</a
 	      > somex</li
 	    ></ul
@@ -264,7 +270,9 @@
 	    ><table
 	    ><tr
 	      ><td class="src"
-		>Show x =&gt; <a id="v:BlubCtor" class="def"
+		><a href="#" title="Text.Show"
+		  >Show</a
+		  > x =&gt; <a id="v:BlubCtor" class="def"
 		  >BlubCtor</a
 		  > x</td
 		><td class="doc empty"
@@ -281,7 +289,9 @@
 	    >Blub</a
 	    > :: () =&gt; <span class="keyword"
 	    >forall</span
-	    > x. Show x =&gt; x -&gt; <a href="#" title="PatternSyns"
+	    > x. <a href="#" title="Text.Show"
+	    >Show</a
+	    > x =&gt; x -&gt; <a href="#" title="PatternSyns"
 	    >BlubType</a
 	    > <a href="#" class="selflink"
 	    >#</a
@@ -355,7 +365,9 @@
 	    >pattern</span
 	    > <a id="v:PatWithExplicitSig" class="def"
 	    >PatWithExplicitSig</a
-	    > :: Eq somex =&gt; somex -&gt; <a href="#" title="PatternSyns"
+	    > :: <a href="#" title="Data.Eq"
+	    >Eq</a
+	    > somex =&gt; somex -&gt; <a href="#" title="PatternSyns"
 	    >FooType</a
 	    > somex <a href="#" class="selflink"
 	    >#</a
diff --git a/html-test/ref/PromotedTypes.html b/html-test/ref/PromotedTypes.html
index 46a70845..712dde5c 100644
--- a/html-test/ref/PromotedTypes.html
+++ b/html-test/ref/PromotedTypes.html
@@ -104,7 +104,9 @@
 	      ><td class="src"
 		><a id="v:Cons" class="def"
 		  >Cons</a
-		  > :: Maybe h -&gt; <a href="#" title="PromotedTypes"
+		  > :: <a href="#" title="GHC.Maybe"
+		  >Maybe</a
+		  > h -&gt; <a href="#" title="PromotedTypes"
 		  >Pattern</a
 		  > t -&gt; <a href="#" title="PromotedTypes"
 		  >Pattern</a
@@ -148,7 +150,9 @@
 	      ><td class="src"
 		><a id="v:RevCons" class="def"
 		  >RevCons</a
-		  > :: Maybe h -&gt; <a href="#" title="PromotedTypes"
+		  > :: <a href="#" title="GHC.Maybe"
+		  >Maybe</a
+		  > h -&gt; <a href="#" title="PromotedTypes"
 		  >RevPattern</a
 		  > t -&gt; <a href="#" title="PromotedTypes"
 		  >RevPattern</a
diff --git a/html-test/ref/Properties.html b/html-test/ref/Properties.html
index 9299486c..daabe6c4 100644
--- a/html-test/ref/Properties.html
+++ b/html-test/ref/Properties.html
@@ -46,7 +46,11 @@
 	  ><li class="src short"
 	    ><a href="#"
 	      >fib</a
-	      > :: Integer -&gt; Integer</li
+	      > :: <a href="#" title="Prelude"
+	      >Integer</a
+	      > -&gt; <a href="#" title="Prelude"
+	      >Integer</a
+	      ></li
 	    ></ul
 	  ></details
 	></div
@@ -57,13 +61,19 @@
 	><p class="src"
 	  ><a id="v:fib" class="def"
 	    >fib</a
-	    > :: Integer -&gt; Integer <a href="#" class="selflink"
+	    > :: <a href="#" title="Prelude"
+	    >Integer</a
+	    > -&gt; <a href="#" title="Prelude"
+	    >Integer</a
+	    > <a href="#" class="selflink"
 	    >#</a
 	    ></p
 	  ><div class="doc"
 	  ><p
 	    >Fibonacci number of given <code
-	      >Integer</code
+	      ><a href="#" title="Prelude"
+		>Integer</a
+		></code
 	      >.</p
 	    ><pre
 	    >fib n &lt;= fib (n + 1)</pre
diff --git a/html-test/ref/QuantifiedConstraints.html b/html-test/ref/QuantifiedConstraints.html
new file mode 100644
index 00000000..fa2c18ec
--- /dev/null
+++ b/html-test/ref/QuantifiedConstraints.html
@@ -0,0 +1,100 @@
+<html xmlns="http://www.w3.org/1999/xhtml"
+><head
+  ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"
+     /><title
+    >QuantifiedConstraints</title
+    ><link href="#" rel="stylesheet" type="text/css" title="Ocean"
+     /><link rel="stylesheet" type="text/css" href="#"
+     /><script src="haddock-bundle.min.js" async="async" type="text/javascript"
+    ></script
+    ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"
+    ></script
+    ></head
+  ><body
+  ><div id="package-header"
+    ><ul class="links" id="page-menu"
+      ><li
+	><a href="#"
+	  >Contents</a
+	  ></li
+	><li
+	><a href="#"
+	  >Index</a
+	  ></li
+	></ul
+      ><p class="caption empty"
+      ></p
+      ></div
+    ><div id="content"
+    ><div id="module-header"
+      ><table class="info"
+	><tr
+	  ><th
+	    >Safe Haskell</th
+	    ><td
+	    >Safe</td
+	    ></tr
+	  ></table
+	><p class="caption"
+	>QuantifiedConstraints</p
+	></div
+      ><div id="interface"
+      ><h1
+	>Documentation</h1
+	><div class="top"
+	><p class="src"
+	  ><span class="keyword"
+	    >class</span
+	    > <a id="t:Foo" class="def"
+	    >Foo</a
+	    > a <span class="keyword"
+	    >where</span
+	    > <a href="#" class="selflink"
+	    >#</a
+	    ></p
+	  ><div class="subs methods"
+	  ><p class="caption"
+	    >Methods</p
+	    ><p class="src"
+	    ><a id="v:fooed" class="def"
+	      >fooed</a
+	      > :: a <a href="#" class="selflink"
+	      >#</a
+	      ></p
+	    ></div
+	  ></div
+	><div class="top"
+	><p class="src"
+	  ><a id="v:needsParensAroundContext" class="def"
+	    >needsParensAroundContext</a
+	    > :: (<span class="keyword"
+	    >forall</span
+	    > x. <a href="#" title="QuantifiedConstraints"
+	    >Foo</a
+	    > (f x)) =&gt; f <a href="#" title="Data.Int"
+	    >Int</a
+	    > <a href="#" class="selflink"
+	    >#</a
+	    ></p
+	  ></div
+	><div class="top"
+	><p class="src"
+	  ><a id="v:needsNoParensAroundContext" class="def"
+	    >needsNoParensAroundContext</a
+	    > :: <a href="#" title="QuantifiedConstraints"
+	    >Foo</a
+	    > (f <a href="#" title="Data.Int"
+	    >Int</a
+	    >) =&gt; f <a href="#" title="Data.Int"
+	    >Int</a
+	    > <a href="#" class="selflink"
+	    >#</a
+	    ></p
+	  ></div
+	></div
+      ></div
+    ><div id="footer"
+    ></div
+    ></body
+  ></html
+>
\ No newline at end of file
diff --git a/html-test/ref/QuasiExpr.html b/html-test/ref/QuasiExpr.html
index 42b21f70..dfded323 100644
--- a/html-test/ref/QuasiExpr.html
+++ b/html-test/ref/QuasiExpr.html
@@ -58,7 +58,9 @@
 	      ><td class="src"
 		><a id="v:IntExpr" class="def"
 		  >IntExpr</a
-		  > Integer</td
+		  > <a href="#" title="Prelude"
+		  >Integer</a
+		  ></td
 		><td class="doc empty"
 		></td
 		></tr
@@ -66,7 +68,9 @@
 	      ><td class="src"
 		><a id="v:AntiIntExpr" class="def"
 		  >AntiIntExpr</a
-		  > String</td
+		  > <a href="#" title="Data.String"
+		  >String</a
+		  ></td
 		><td class="doc empty"
 		></td
 		></tr
@@ -88,7 +92,9 @@
 	      ><td class="src"
 		><a id="v:AntiExpr" class="def"
 		  >AntiExpr</a
-		  > String</td
+		  > <a href="#" title="Data.String"
+		  >String</a
+		  ></td
 		><td class="doc empty"
 		></td
 		></tr
@@ -104,7 +110,9 @@
 		  ><span class="inst-left"
 		    ><span class="instance details-toggle-control details-toggle" data-details-id="i:id:Expr:Show:1"
 		      ></span
-		      > Show <a href="#" title="QuasiExpr"
+		      > <a href="#" title="Text.Show"
+		      >Show</a
+		      > <a href="#" title="QuasiExpr"
 		      >Expr</a
 		      ></span
 		    > <a href="#" class="selflink"
@@ -128,21 +136,35 @@
 			><p class="src"
 			><a href="#"
 			  >showsPrec</a
-			  > :: Int -&gt; <a href="#" title="QuasiExpr"
+			  > :: <a href="#" title="Data.Int"
+			  >Int</a
+			  > -&gt; <a href="#" title="QuasiExpr"
 			  >Expr</a
-			  > -&gt; ShowS</p
+			  > -&gt; <a href="#" title="Text.Show"
+			  >ShowS</a
+			  > <a href="#" class="selflink"
+			  >#</a
+			  ></p
 			><p class="src"
 			><a href="#"
 			  >show</a
 			  > :: <a href="#" title="QuasiExpr"
 			  >Expr</a
-			  > -&gt; String</p
+			  > -&gt; <a href="#" title="Data.String"
+			  >String</a
+			  > <a href="#" class="selflink"
+			  >#</a
+			  ></p
 			><p class="src"
 			><a href="#"
 			  >showList</a
 			  > :: [<a href="#" title="QuasiExpr"
 			  >Expr</a
-			  >] -&gt; ShowS</p
+			  >] -&gt; <a href="#" title="Text.Show"
+			  >ShowS</a
+			  > <a href="#" class="selflink"
+			  >#</a
+			  ></p
 			></div
 		      ></details
 		    ></td
@@ -208,7 +230,9 @@
 		  ><span class="inst-left"
 		    ><span class="instance details-toggle-control details-toggle" data-details-id="i:id:BinOp:Show:1"
 		      ></span
-		      > Show <a href="#" title="QuasiExpr"
+		      > <a href="#" title="Text.Show"
+		      >Show</a
+		      > <a href="#" title="QuasiExpr"
 		      >BinOp</a
 		      ></span
 		    > <a href="#" class="selflink"
@@ -232,21 +256,35 @@
 			><p class="src"
 			><a href="#"
 			  >showsPrec</a
-			  > :: Int -&gt; <a href="#" title="QuasiExpr"
+			  > :: <a href="#" title="Data.Int"
+			  >Int</a
+			  > -&gt; <a href="#" title="QuasiExpr"
 			  >BinOp</a
-			  > -&gt; ShowS</p
+			  > -&gt; <a href="#" title="Text.Show"
+			  >ShowS</a
+			  > <a href="#" class="selflink"
+			  >#</a
+			  ></p
 			><p class="src"
 			><a href="#"
 			  >show</a
 			  > :: <a href="#" title="QuasiExpr"
 			  >BinOp</a
-			  > -&gt; String</p
+			  > -&gt; <a href="#" title="Data.String"
+			  >String</a
+			  > <a href="#" class="selflink"
+			  >#</a
+			  ></p
 			><p class="src"
 			><a href="#"
 			  >showList</a
 			  > :: [<a href="#" title="QuasiExpr"
 			  >BinOp</a
-			  >] -&gt; ShowS</p
+			  >] -&gt; <a href="#" title="Text.Show"
+			  >ShowS</a
+			  > <a href="#" class="selflink"
+			  >#</a
+			  ></p
 			></div
 		      ></details
 		    ></td
@@ -261,7 +299,9 @@
 	    >eval</a
 	    > :: <a href="#" title="QuasiExpr"
 	    >Expr</a
-	    > -&gt; Integer <a href="#" class="selflink"
+	    > -&gt; <a href="#" title="Prelude"
+	    >Integer</a
+	    > <a href="#" class="selflink"
 	    >#</a
 	    ></p
 	  ></div
@@ -269,7 +309,9 @@
 	><p class="src"
 	  ><a id="v:expr" class="def"
 	    >expr</a
-	    > :: QuasiQuoter <a href="#" class="selflink"
+	    > :: <a href="#" title="Language.Haskell.TH.Quote"
+	    >QuasiQuoter</a
+	    > <a href="#" class="selflink"
 	    >#</a
 	    ></p
 	  ></div
@@ -277,7 +319,13 @@
 	><p class="src"
 	  ><a id="v:parseExprExp" class="def"
 	    >parseExprExp</a
-	    > :: String -&gt; Q Exp <a href="#" class="selflink"
+	    > :: <a href="#" title="Data.String"
+	    >String</a
+	    > -&gt; <a href="#" title="Language.Haskell.TH.Syntax"
+	    >Q</a
+	    > <a href="#" title="Language.Haskell.TH.Syntax"
+	    >Exp</a
+	    > <a href="#" class="selflink"
 	    >#</a
 	    ></p
 	  ></div
diff --git a/html-test/ref/QuasiQuote.html b/html-test/ref/QuasiQuote.html
index e9451d8a..c73250b8 100644
--- a/html-test/ref/QuasiQuote.html
+++ b/html-test/ref/QuasiQuote.html
@@ -45,7 +45,9 @@
 	><p class="src"
 	  ><a id="v:val" class="def"
 	    >val</a
-	    > :: Integer <a href="#" class="selflink"
+	    > :: <a href="#" title="Prelude"
+	    >Integer</a
+	    > <a href="#" class="selflink"
 	    >#</a
 	    ></p
 	  ></div
diff --git a/html-test/ref/SpuriousSuperclassConstraints.html b/html-test/ref/SpuriousSuperclassConstraints.html
index 00cea04a..47dfd6cd 100644
--- a/html-test/ref/SpuriousSuperclassConstraints.html
+++ b/html-test/ref/SpuriousSuperclassConstraints.html
@@ -86,7 +86,9 @@ Fix spurious superclass constraints bug.</pre
 		  ><span class="inst-left"
 		    ><span class="instance details-toggle-control details-toggle" data-details-id="i:id:SomeType:Functor:1"
 		      ></span
-		      > Functor (<a href="#" title="SpuriousSuperclassConstraints"
+		      > <a href="#" title="Data.Functor"
+		      >Functor</a
+		      > (<a href="#" title="SpuriousSuperclassConstraints"
 		      >SomeType</a
 		      > f)</span
 		    > <a href="#" class="selflink"
@@ -114,7 +116,9 @@ Fix spurious superclass constraints bug.</pre
 			  >SomeType</a
 			  > f a -&gt; <a href="#" title="SpuriousSuperclassConstraints"
 			  >SomeType</a
-			  > f b</p
+			  > f b <a href="#" class="selflink"
+			  >#</a
+			  ></p
 			><p class="src"
 			><a href="#"
 			  >(&lt;$)</a
@@ -122,7 +126,9 @@ Fix spurious superclass constraints bug.</pre
 			  >SomeType</a
 			  > f b -&gt; <a href="#" title="SpuriousSuperclassConstraints"
 			  >SomeType</a
-			  > f a</p
+			  > f a <a href="#" class="selflink"
+			  >#</a
+			  ></p
 			></div
 		      ></details
 		    ></td
@@ -132,7 +138,11 @@ Fix spurious superclass constraints bug.</pre
 		  ><span class="inst-left"
 		    ><span class="instance details-toggle-control details-toggle" data-details-id="i:id:SomeType:Applicative:2"
 		      ></span
-		      > Applicative f =&gt; Applicative (<a href="#" title="SpuriousSuperclassConstraints"
+		      > <a href="#" title="Control.Applicative"
+		      >Applicative</a
+		      > f =&gt; <a href="#" title="Control.Applicative"
+		      >Applicative</a
+		      > (<a href="#" title="SpuriousSuperclassConstraints"
 		      >SomeType</a
 		      > f)</span
 		    > <a href="#" class="selflink"
@@ -158,7 +168,9 @@ Fix spurious superclass constraints bug.</pre
 			  >pure</a
 			  > :: a -&gt; <a href="#" title="SpuriousSuperclassConstraints"
 			  >SomeType</a
-			  > f a</p
+			  > f a <a href="#" class="selflink"
+			  >#</a
+			  ></p
 			><p class="src"
 			><a href="#"
 			  >(&lt;*&gt;)</a
@@ -168,7 +180,9 @@ Fix spurious superclass constraints bug.</pre
 			  >SomeType</a
 			  > f a -&gt; <a href="#" title="SpuriousSuperclassConstraints"
 			  >SomeType</a
-			  > f b</p
+			  > f b <a href="#" class="selflink"
+			  >#</a
+			  ></p
 			><p class="src"
 			><a href="#"
 			  >liftA2</a
@@ -178,7 +192,9 @@ Fix spurious superclass constraints bug.</pre
 			  >SomeType</a
 			  > f b -&gt; <a href="#" title="SpuriousSuperclassConstraints"
 			  >SomeType</a
-			  > f c</p
+			  > f c <a href="#" class="selflink"
+			  >#</a
+			  ></p
 			><p class="src"
 			><a href="#"
 			  >(*&gt;)</a
@@ -188,7 +204,9 @@ Fix spurious superclass constraints bug.</pre
 			  >SomeType</a
 			  > f b -&gt; <a href="#" title="SpuriousSuperclassConstraints"
 			  >SomeType</a
-			  > f b</p
+			  > f b <a href="#" class="selflink"
+			  >#</a
+			  ></p
 			><p class="src"
 			><a href="#"
 			  >(&lt;*)</a
@@ -198,7 +216,9 @@ Fix spurious superclass constraints bug.</pre
 			  >SomeType</a
 			  > f b -&gt; <a href="#" title="SpuriousSuperclassConstraints"
 			  >SomeType</a
-			  > f a</p
+			  > f a <a href="#" class="selflink"
+			  >#</a
+			  ></p
 			></div
 		      ></details
 		    ></td
diff --git a/html-test/ref/TH.html b/html-test/ref/TH.html
index 403abe62..a35204ff 100644
--- a/html-test/ref/TH.html
+++ b/html-test/ref/TH.html
@@ -45,7 +45,11 @@
 	><p class="src"
 	  ><a id="v:decl" class="def"
 	    >decl</a
-	    > :: Q [Dec] <a href="#" class="selflink"
+	    > :: <a href="#" title="Language.Haskell.TH.Syntax"
+	    >Q</a
+	    > [<a href="#" title="Language.Haskell.TH.Syntax"
+	    >Dec</a
+	    >] <a href="#" class="selflink"
 	    >#</a
 	    ></p
 	  ></div
diff --git a/html-test/ref/Test.html b/html-test/ref/Test.html
index d4c2417c..ce180a19 100644
--- a/html-test/ref/Test.html
+++ b/html-test/ref/Test.html
@@ -165,7 +165,13 @@
 	      ><li
 		>= <a href="#"
 		  >A</a
-		  > Int (Maybe Float)</li
+		  > <a href="#" title="Data.Int"
+		  >Int</a
+		  > (<a href="#" title="GHC.Maybe"
+		  >Maybe</a
+		  > <a href="#" title="Prelude"
+		  >Float</a
+		  >)</li
 		><li
 		>| <a href="#"
 		  >B</a
@@ -173,7 +179,11 @@
 		  >T</a
 		  > a b, <a href="#" title="Test"
 		  >T</a
-		  > Int Float)</li
+		  > <a href="#" title="Data.Int"
+		  >Int</a
+		  > <a href="#" title="Prelude"
+		  >Float</a
+		  >)</li
 		></ul
 	      ></li
 	    ><li class="src short"
@@ -347,7 +357,9 @@
 		  ><li
 		    ><a href="#"
 		      >p</a
-		      > :: Int</li
+		      > :: <a href="#" title="Data.Int"
+		      >Int</a
+		      ></li
 		    ><li
 		    ><a href="#"
 		      >q</a
@@ -359,7 +371,9 @@
 		      >r</a
 		      >, <a href="#"
 		      >s</a
-		      > :: Int</li
+		      > :: <a href="#" title="Data.Int"
+		      >Int</a
+		      ></li
 		    ></ul
 		  > }</li
 		><li
@@ -371,11 +385,23 @@
 		      >t</a
 		      > :: T1 -&gt; <a href="#" title="Test"
 		      >T2</a
-		      > Int Int -&gt; <a href="#" title="Test"
+		      > <a href="#" title="Data.Int"
+		      >Int</a
+		      > <a href="#" title="Data.Int"
+		      >Int</a
+		      > -&gt; <a href="#" title="Test"
 		      >T3</a
-		      > Bool Bool -&gt; <a href="#" title="Test"
+		      > <a href="#" title="Data.Bool"
+		      >Bool</a
+		      > <a href="#" title="Data.Bool"
+		      >Bool</a
+		      > -&gt; <a href="#" title="Test"
 		      >T4</a
-		      > Float Float -&gt; <a href="#" title="Test"
+		      > <a href="#" title="Prelude"
+		      >Float</a
+		      > <a href="#" title="Prelude"
+		      >Float</a
+		      > -&gt; <a href="#" title="Test"
 		      >T5</a
 		      > () ()</li
 		    ><li
@@ -383,7 +409,9 @@
 		      >u</a
 		      >, <a href="#"
 		      >v</a
-		      > :: Int</li
+		      > :: <a href="#" title="Data.Int"
+		      >Int</a
+		      ></li
 		    ></ul
 		  > }</li
 		></ul
@@ -399,15 +427,21 @@
 	      ><li
 		><a href="#"
 		  >s1</a
-		  > :: Int</li
+		  > :: <a href="#" title="Data.Int"
+		  >Int</a
+		  ></li
 		><li
 		><a href="#"
 		  >s2</a
-		  > :: Int</li
+		  > :: <a href="#" title="Data.Int"
+		  >Int</a
+		  ></li
 		><li
 		><a href="#"
 		  >s3</a
-		  > :: Int</li
+		  > :: <a href="#" title="Data.Int"
+		  >Int</a
+		  ></li
 		></ul
 	      >}</li
 	    ><li class="src short"
@@ -415,7 +449,9 @@
 	      >p</a
 	      > :: <a href="#" title="Test"
 	      >R</a
-	      > -&gt; Int</li
+	      > -&gt; <a href="#" title="Data.Int"
+	      >Int</a
+	      ></li
 	    ><li class="src short"
 	    ><a href="#"
 	      >q</a
@@ -429,7 +465,9 @@
 	      >u</a
 	      > :: <a href="#" title="Test"
 	      >R</a
-	      > -&gt; Int</li
+	      > -&gt; <a href="#" title="Data.Int"
+	      >Int</a
+	      ></li
 	    ><li class="src short"
 	    ><span class="keyword"
 	      >class</span
@@ -443,7 +481,9 @@
 	      ><li
 		><a href="#"
 		  >a</a
-		  > :: IO a</li
+		  > :: <a href="#" title="System.IO"
+		  >IO</a
+		  > a</li
 		><li
 		><a href="#"
 		  >b</a
@@ -495,21 +535,33 @@
 	      >a</a
 	      > :: <a href="#" title="Test"
 	      >C</a
-	      > a =&gt; IO a</li
+	      > a =&gt; <a href="#" title="System.IO"
+	      >IO</a
+	      > a</li
 	    ><li class="src short"
 	    ><a href="#"
 	      >f</a
 	      > :: <a href="#" title="Test"
 	      >C</a
-	      > a =&gt; a -&gt; Int</li
+	      > a =&gt; a -&gt; <a href="#" title="Data.Int"
+	      >Int</a
+	      ></li
 	    ><li class="src short"
 	    ><a href="#"
 	      >g</a
-	      > :: Int -&gt; IO CInt</li
+	      > :: <a href="#" title="Data.Int"
+	      >Int</a
+	      > -&gt; <a href="#" title="System.IO"
+	      >IO</a
+	      > CInt</li
 	    ><li class="src short"
 	    ><a href="#"
 	      >hidden</a
-	      > :: Int -&gt; Int</li
+	      > :: <a href="#" title="Data.Int"
+	      >Int</a
+	      > -&gt; <a href="#" title="Data.Int"
+	      >Int</a
+	      ></li
 	    ><li class="src short"
 	    >module <a href="#"
 	      >Visible</a
@@ -551,17 +603,39 @@
 	      >T</a
 	      > () () -&gt; <a href="#" title="Test"
 	      >T2</a
-	      > Int Int -&gt; (<a href="#" title="Test"
+	      > <a href="#" title="Data.Int"
+	      >Int</a
+	      > <a href="#" title="Data.Int"
+	      >Int</a
+	      > -&gt; (<a href="#" title="Test"
 	      >T3</a
-	      > Bool Bool -&gt; <a href="#" title="Test"
+	      > <a href="#" title="Data.Bool"
+	      >Bool</a
+	      > <a href="#" title="Data.Bool"
+	      >Bool</a
+	      > -&gt; <a href="#" title="Test"
 	      >T4</a
-	      > Float Float) -&gt; <a href="#" title="Test"
+	      > <a href="#" title="Prelude"
+	      >Float</a
+	      > <a href="#" title="Prelude"
+	      >Float</a
+	      >) -&gt; <a href="#" title="Test"
 	      >T5</a
-	      > () () -&gt; IO ()</li
+	      > () () -&gt; <a href="#" title="System.IO"
+	      >IO</a
+	      > ()</li
 	    ><li class="src short"
 	    ><a href="#"
 	      >l</a
-	      > :: (Int, Int, Float) -&gt; Int</li
+	      > :: (<a href="#" title="Data.Int"
+	      >Int</a
+	      >, <a href="#" title="Data.Int"
+	      >Int</a
+	      >, <a href="#" title="Prelude"
+	      >Float</a
+	      >) -&gt; <a href="#" title="Data.Int"
+	      >Int</a
+	      ></li
 	    ><li class="src short"
 	    ><a href="#"
 	      >m</a
@@ -569,19 +643,33 @@
 	      >R</a
 	      > -&gt; <a href="#" title="Test"
 	      >N1</a
-	      > () -&gt; IO Int</li
+	      > () -&gt; <a href="#" title="System.IO"
+	      >IO</a
+	      > <a href="#" title="Data.Int"
+	      >Int</a
+	      ></li
 	    ><li class="src short"
 	    ><a href="#"
 	      >o</a
-	      > :: Float -&gt; IO Float</li
+	      > :: <a href="#" title="Prelude"
+	      >Float</a
+	      > -&gt; <a href="#" title="System.IO"
+	      >IO</a
+	      > <a href="#" title="Prelude"
+	      >Float</a
+	      ></li
 	    ><li class="src short"
 	    ><a href="#"
 	      >f'</a
-	      > :: Int</li
+	      > :: <a href="#" title="Data.Int"
+	      >Int</a
+	      ></li
 	    ><li class="src short"
 	    ><a href="#"
 	      >withType</a
-	      > :: Int</li
+	      > :: <a href="#" title="Data.Int"
+	      >Int</a
+	      ></li
 	    ><li class="src short"
 	    ><a href="#"
 	      >withoutType</a
@@ -622,7 +710,13 @@
 	      ><td class="src"
 		><a id="v:A" class="def"
 		  >A</a
-		  > Int (Maybe Float)</td
+		  > <a href="#" title="Data.Int"
+		  >Int</a
+		  > (<a href="#" title="GHC.Maybe"
+		  >Maybe</a
+		  > <a href="#" title="Prelude"
+		  >Float</a
+		  >)</td
 		><td class="doc"
 		><p
 		  >This comment describes the <code
@@ -640,7 +734,11 @@
 		  >T</a
 		  > a b, <a href="#" title="Test"
 		  >T</a
-		  > Int Float)</td
+		  > <a href="#" title="Data.Int"
+		  >Int</a
+		  > <a href="#" title="Prelude"
+		  >Float</a
+		  >)</td
 		><td class="doc"
 		><p
 		  >This comment describes the <code
@@ -1188,7 +1286,9 @@
 		      ><dfn class="src"
 			><a id="v:p" class="def"
 			  >p</a
-			  > :: Int</dfn
+			  > :: <a href="#" title="Data.Int"
+			  >Int</a
+			  ></dfn
 			><div class="doc"
 			><p
 			  >This comment applies to the <code
@@ -1220,7 +1320,9 @@
 			  >r</a
 			  >, <a id="v:s" class="def"
 			  >s</a
-			  > :: Int</dfn
+			  > :: <a href="#" title="Data.Int"
+			  >Int</a
+			  ></dfn
 			><div class="doc"
 			><p
 			  >This comment applies to both <code
@@ -1264,11 +1366,23 @@
 			  >t</a
 			  > :: T1 -&gt; <a href="#" title="Test"
 			  >T2</a
-			  > Int Int -&gt; <a href="#" title="Test"
+			  > <a href="#" title="Data.Int"
+			  >Int</a
+			  > <a href="#" title="Data.Int"
+			  >Int</a
+			  > -&gt; <a href="#" title="Test"
 			  >T3</a
-			  > Bool Bool -&gt; <a href="#" title="Test"
+			  > <a href="#" title="Data.Bool"
+			  >Bool</a
+			  > <a href="#" title="Data.Bool"
+			  >Bool</a
+			  > -&gt; <a href="#" title="Test"
 			  >T4</a
-			  > Float Float -&gt; <a href="#" title="Test"
+			  > <a href="#" title="Prelude"
+			  >Float</a
+			  > <a href="#" title="Prelude"
+			  >Float</a
+			  > -&gt; <a href="#" title="Test"
 			  >T5</a
 			  > () ()</dfn
 			><div class="doc empty"
@@ -1280,7 +1394,9 @@
 			  >u</a
 			  >, <a id="v:v" class="def"
 			  >v</a
-			  > :: Int</dfn
+			  > :: <a href="#" title="Data.Int"
+			  >Int</a
+			  ></dfn
 			><div class="doc empty"
 			></div
 			></li
@@ -1332,7 +1448,9 @@
 		      ><dfn class="src"
 			><a id="v:s1" class="def"
 			  >s1</a
-			  > :: Int</dfn
+			  > :: <a href="#" title="Data.Int"
+			  >Int</a
+			  ></dfn
 			><div class="doc"
 			><p
 			  >The <code
@@ -1346,7 +1464,9 @@
 		      ><dfn class="src"
 			><a id="v:s2" class="def"
 			  >s2</a
-			  > :: Int</dfn
+			  > :: <a href="#" title="Data.Int"
+			  >Int</a
+			  ></dfn
 			><div class="doc"
 			><p
 			  >The <code
@@ -1360,7 +1480,9 @@
 		      ><dfn class="src"
 			><a id="v:s3" class="def"
 			  >s3</a
-			  > :: Int</dfn
+			  > :: <a href="#" title="Data.Int"
+			  >Int</a
+			  ></dfn
 			><div class="doc"
 			><p
 			  >The <code
@@ -1387,7 +1509,9 @@
 	    >p</a
 	    > :: <a href="#" title="Test"
 	    >R</a
-	    > -&gt; Int <a href="#" class="selflink"
+	    > -&gt; <a href="#" title="Data.Int"
+	    >Int</a
+	    > <a href="#" class="selflink"
 	    >#</a
 	    ></p
 	  ><div class="doc"
@@ -1425,7 +1549,9 @@
 	    >u</a
 	    > :: <a href="#" title="Test"
 	    >R</a
-	    > -&gt; Int <a href="#" class="selflink"
+	    > -&gt; <a href="#" title="Data.Int"
+	    >Int</a
+	    > <a href="#" class="selflink"
 	    >#</a
 	    ></p
 	  ></div
@@ -1462,7 +1588,9 @@
 	    ><p class="src"
 	    ><a id="v:a" class="def"
 	      >a</a
-	      > :: IO a <a href="#" class="selflink"
+	      > :: <a href="#" title="System.IO"
+	      >IO</a
+	      > a <a href="#" class="selflink"
 	      >#</a
 	      ></p
 	    ><div class="doc"
@@ -1534,7 +1662,9 @@
 		      ></span
 		      > <a href="#" title="Test"
 		      >D</a
-		      > Float</span
+		      > <a href="#" title="Prelude"
+		      >Float</a
+		      ></span
 		    > <a href="#" class="selflink"
 		    >#</a
 		    ></td
@@ -1558,13 +1688,19 @@
 			  >d</a
 			  > :: <a href="#" title="Test"
 			  >T</a
-			  > Float b <a href="#" class="selflink"
+			  > <a href="#" title="Prelude"
+			  >Float</a
+			  > b <a href="#" class="selflink"
 			  >#</a
 			  ></p
 			><p class="src"
 			><a href="#"
 			  >e</a
-			  > :: (Float, Float) <a href="#" class="selflink"
+			  > :: (<a href="#" title="Prelude"
+			  >Float</a
+			  >, <a href="#" title="Prelude"
+			  >Float</a
+			  >) <a href="#" class="selflink"
 			  >#</a
 			  ></p
 			></div
@@ -1578,7 +1714,9 @@
 		      ></span
 		      > <a href="#" title="Test"
 		      >D</a
-		      > Int</span
+		      > <a href="#" title="Data.Int"
+		      >Int</a
+		      ></span
 		    > <a href="#" class="selflink"
 		    >#</a
 		    ></td
@@ -1602,13 +1740,19 @@
 			  >d</a
 			  > :: <a href="#" title="Test"
 			  >T</a
-			  > Int b <a href="#" class="selflink"
+			  > <a href="#" title="Data.Int"
+			  >Int</a
+			  > b <a href="#" class="selflink"
 			  >#</a
 			  ></p
 			><p class="src"
 			><a href="#"
 			  >e</a
-			  > :: (Int, Int) <a href="#" class="selflink"
+			  > :: (<a href="#" title="Data.Int"
+			  >Int</a
+			  >, <a href="#" title="Data.Int"
+			  >Int</a
+			  >) <a href="#" class="selflink"
 			  >#</a
 			  ></p
 			></div
@@ -1671,7 +1815,9 @@
 	    >a</a
 	    > :: <a href="#" title="Test"
 	    >C</a
-	    > a =&gt; IO a <a href="#" class="selflink"
+	    > a =&gt; <a href="#" title="System.IO"
+	    >IO</a
+	    > a <a href="#" class="selflink"
 	    >#</a
 	    ></p
 	  ><div class="doc"
@@ -1693,7 +1839,9 @@
 	    >f</a
 	    > :: <a href="#" title="Test"
 	    >C</a
-	    > a =&gt; a -&gt; Int <a href="#" class="selflink"
+	    > a =&gt; a -&gt; <a href="#" title="Data.Int"
+	    >Int</a
+	    > <a href="#" class="selflink"
 	    >#</a
 	    ></p
 	  ><div class="doc"
@@ -1753,7 +1901,11 @@ using double quotes: <a href="#"
 	><p class="src"
 	  ><a id="v:g" class="def"
 	    >g</a
-	    > :: Int -&gt; IO CInt <a href="#" class="selflink"
+	    > :: <a href="#" title="Data.Int"
+	    >Int</a
+	    > -&gt; <a href="#" title="System.IO"
+	    >IO</a
+	    > CInt <a href="#" class="selflink"
 	    >#</a
 	    ></p
 	  ><div class="doc"
@@ -1864,7 +2016,11 @@ is at the beginning of the line).</pre
 	><p class="src"
 	  ><a id="v:hidden" class="def"
 	    >hidden</a
-	    > :: Int -&gt; Int <a href="#" class="selflink"
+	    > :: <a href="#" title="Data.Int"
+	    >Int</a
+	    > -&gt; <a href="#" title="Data.Int"
+	    >Int</a
+	    > <a href="#" class="selflink"
 	    >#</a
 	    ></p
 	  ></div
@@ -1977,7 +2133,11 @@ is at the beginning of the line).</pre
 	      ><td class="src"
 		>-&gt; <a href="#" title="Test"
 		  >T2</a
-		  > Int Int</td
+		  > <a href="#" title="Data.Int"
+		  >Int</a
+		  > <a href="#" title="Data.Int"
+		  >Int</a
+		  ></td
 		><td class="doc"
 		><p
 		  >This argument has type 'T2 Int Int'</p
@@ -1987,9 +2147,17 @@ is at the beginning of the line).</pre
 	      ><td class="src"
 		>-&gt; (<a href="#" title="Test"
 		  >T3</a
-		  > Bool Bool -&gt; <a href="#" title="Test"
+		  > <a href="#" title="Data.Bool"
+		  >Bool</a
+		  > <a href="#" title="Data.Bool"
+		  >Bool</a
+		  > -&gt; <a href="#" title="Test"
 		  >T4</a
-		  > Float Float)</td
+		  > <a href="#" title="Prelude"
+		  >Float</a
+		  > <a href="#" title="Prelude"
+		  >Float</a
+		  >)</td
 		><td class="doc"
 		><p
 		  >This argument has type <code
@@ -2011,7 +2179,9 @@ is at the beginning of the line).</pre
 		></tr
 	      ><tr
 	      ><td class="src"
-		>-&gt; IO ()</td
+		>-&gt; <a href="#" title="System.IO"
+		  >IO</a
+		  > ()</td
 		><td class="doc"
 		><p
 		  >This is the result type</p
@@ -2037,7 +2207,13 @@ is at the beginning of the line).</pre
 	    ><table
 	    ><tr
 	      ><td class="src"
-		>:: (Int, Int, Float)</td
+		>:: (<a href="#" title="Data.Int"
+		  >Int</a
+		  >, <a href="#" title="Data.Int"
+		  >Int</a
+		  >, <a href="#" title="Prelude"
+		  >Float</a
+		  >)</td
 		><td class="doc"
 		><p
 		  >takes a triple</p
@@ -2045,11 +2221,15 @@ is at the beginning of the line).</pre
 		></tr
 	      ><tr
 	      ><td class="src"
-		>-&gt; Int</td
+		>-&gt; <a href="#" title="Data.Int"
+		  >Int</a
+		  ></td
 		><td class="doc"
 		><p
 		  >returns an <code
-		    >Int</code
+		    ><a href="#" title="Data.Int"
+		      >Int</a
+		      ></code
 		    ></p
 		  ></td
 		></tr
@@ -2087,7 +2267,11 @@ is at the beginning of the line).</pre
 		></tr
 	      ><tr
 	      ><td class="src"
-		>-&gt; IO Int</td
+		>-&gt; <a href="#" title="System.IO"
+		  >IO</a
+		  > <a href="#" title="Data.Int"
+		  >Int</a
+		  ></td
 		><td class="doc"
 		><p
 		  >and the return value</p
@@ -2113,7 +2297,9 @@ is at the beginning of the line).</pre
 	    ><table
 	    ><tr
 	      ><td class="src"
-		>:: Float</td
+		>:: <a href="#" title="Prelude"
+		  >Float</a
+		  ></td
 		><td class="doc"
 		><p
 		  >The input float</p
@@ -2121,7 +2307,11 @@ is at the beginning of the line).</pre
 		></tr
 	      ><tr
 	      ><td class="src"
-		>-&gt; IO Float</td
+		>-&gt; <a href="#" title="System.IO"
+		  >IO</a
+		  > <a href="#" title="Prelude"
+		  >Float</a
+		  ></td
 		><td class="doc"
 		><p
 		  >The output float</p
@@ -2154,7 +2344,9 @@ is at the beginning of the line).</pre
 	><p class="src"
 	  ><a id="v:f-39-" class="def"
 	    >f'</a
-	    > :: Int <a href="#" class="selflink"
+	    > :: <a href="#" title="Data.Int"
+	    >Int</a
+	    > <a href="#" class="selflink"
 	    >#</a
 	    ></p
 	  ><div class="doc"
@@ -2171,7 +2363,9 @@ is at the beginning of the line).</pre
 	><p class="src"
 	  ><a id="v:withType" class="def"
 	    >withType</a
-	    > :: Int <a href="#" class="selflink"
+	    > :: <a href="#" title="Data.Int"
+	    >Int</a
+	    > <a href="#" class="selflink"
 	    >#</a
 	    ></p
 	  ><div class="doc"
diff --git a/html-test/ref/Threaded.html b/html-test/ref/Threaded.html
index 8728d4cd..e52ca96b 100644
--- a/html-test/ref/Threaded.html
+++ b/html-test/ref/Threaded.html
@@ -56,7 +56,9 @@
 	  ><li class="src short"
 	    ><a href="#"
 	      >f</a
-	      > :: Integer</li
+	      > :: <a href="#" title="Prelude"
+	      >Integer</a
+	      ></li
 	    ></ul
 	  ></details
 	></div
@@ -67,7 +69,9 @@
 	><p class="src"
 	  ><a id="v:f" class="def"
 	    >f</a
-	    > :: Integer <a href="#" class="selflink"
+	    > :: <a href="#" title="Prelude"
+	    >Integer</a
+	    > <a href="#" class="selflink"
 	    >#</a
 	    ></p
 	  ><div class="doc"
diff --git a/html-test/ref/Threaded_TH.html b/html-test/ref/Threaded_TH.html
index 7f80b127..14ebe8a9 100644
--- a/html-test/ref/Threaded_TH.html
+++ b/html-test/ref/Threaded_TH.html
@@ -57,7 +57,11 @@
 	  ><li class="src short"
 	    ><a href="#"
 	      >forkTH</a
-	      > :: Q Exp</li
+	      > :: <a href="#" title="Language.Haskell.TH.Syntax"
+	      >Q</a
+	      > <a href="#" title="Language.Haskell.TH.Syntax"
+	      >Exp</a
+	      ></li
 	    ></ul
 	  ></details
 	></div
@@ -68,7 +72,11 @@
 	><p class="src"
 	  ><a id="v:forkTH" class="def"
 	    >forkTH</a
-	    > :: Q Exp <a href="#" class="selflink"
+	    > :: <a href="#" title="Language.Haskell.TH.Syntax"
+	    >Q</a
+	    > <a href="#" title="Language.Haskell.TH.Syntax"
+	    >Exp</a
+	    > <a href="#" class="selflink"
 	    >#</a
 	    ></p
 	  ><div class="doc"
diff --git a/html-test/ref/Ticket112.html b/html-test/ref/Ticket112.html
index a2c4ca1b..00258deb 100644
--- a/html-test/ref/Ticket112.html
+++ b/html-test/ref/Ticket112.html
@@ -63,7 +63,9 @@
 	  ><div class="doc"
 	  ><p
 	    >...given a raw <code
-	      >Addr#</code
+	      ><a href="#" title="GHC.Exts"
+		>Addr#</a
+		></code
 	      > to the string, and the length of the string.</p
 	    ></div
 	  ></div
diff --git a/html-test/ref/Ticket75.html b/html-test/ref/Ticket75.html
index 683a7184..70919c1b 100644
--- a/html-test/ref/Ticket75.html
+++ b/html-test/ref/Ticket75.html
@@ -54,7 +54,9 @@
 	    ><li class="src short"
 	    ><a href="#"
 	      >f</a
-	      > :: Int</li
+	      > :: <a href="#" title="Data.Int"
+	      >Int</a
+	      ></li
 	    ></ul
 	  ></details
 	></div
@@ -89,7 +91,9 @@
 	><p class="src"
 	  ><a id="v:f" class="def"
 	    >f</a
-	    > :: Int <a href="#" class="selflink"
+	    > :: <a href="#" title="Data.Int"
+	    >Int</a
+	    > <a href="#" class="selflink"
 	    >#</a
 	    ></p
 	  ><div class="doc"
diff --git a/html-test/ref/TitledPicture.html b/html-test/ref/TitledPicture.html
index 1e6f50e0..eb6c12f4 100644
--- a/html-test/ref/TitledPicture.html
+++ b/html-test/ref/TitledPicture.html
@@ -46,11 +46,15 @@
 	  ><li class="src short"
 	    ><a href="#"
 	      >foo</a
-	      > :: Integer</li
+	      > :: <a href="#" title="Prelude"
+	      >Integer</a
+	      ></li
 	    ><li class="src short"
 	    ><a href="#"
 	      >bar</a
-	      > :: Integer</li
+	      > :: <a href="#" title="Prelude"
+	      >Integer</a
+	      ></li
 	    ></ul
 	  ></details
 	></div
@@ -61,7 +65,9 @@
 	><p class="src"
 	  ><a id="v:foo" class="def"
 	    >foo</a
-	    > :: Integer <a href="#" class="selflink"
+	    > :: <a href="#" title="Prelude"
+	    >Integer</a
+	    > <a href="#" class="selflink"
 	    >#</a
 	    ></p
 	  ><div class="doc"
@@ -78,7 +84,9 @@
 	><p class="src"
 	  ><a id="v:bar" class="def"
 	    >bar</a
-	    > :: Integer <a href="#" class="selflink"
+	    > :: <a href="#" title="Prelude"
+	    >Integer</a
+	    > <a href="#" class="selflink"
 	    >#</a
 	    ></p
 	  ><div class="doc"
diff --git a/html-test/ref/TypeFamilies.html b/html-test/ref/TypeFamilies.html
index 2195a05a..9a4945dd 100644
--- a/html-test/ref/TypeFamilies.html
+++ b/html-test/ref/TypeFamilies.html
@@ -280,7 +280,9 @@
 			  >AssocD</a
 			  > <a href="#" title="TypeFamilies"
 			  >X</a
-			  > :: * <a href="#" class="selflink"
+			  > :: <a href="#" title="Data.Kind"
+			  >Type</a
+			  > <a href="#" class="selflink"
 			  >#</a
 			  ></p
 			><p class="src"
@@ -290,7 +292,9 @@
 			  >AssocT</a
 			  > <a href="#" title="TypeFamilies"
 			  >X</a
-			  > :: * <a href="#" class="selflink"
+			  > :: <a href="#" title="Data.Kind"
+			  >Type</a
+			  > <a href="#" class="selflink"
 			  >#</a
 			  ></p
 			></div
@@ -342,8 +346,10 @@
 		    > <a href="#" class="selflink"
 		    >#</a
 		    ></td
-		  ><td class="doc empty"
-		  ></td
+		  ><td class="doc"
+		  ><p
+		    >External instance</p
+		    ></td
 		  ></tr
 		><tr
 		><td colspan="2"
@@ -489,7 +495,9 @@
 			>Foo</a
 			> <a href="#" title="TypeFamilies"
 			>X</a
-			> :: *)</div
+			> :: <a href="#" title="Data.Kind"
+			>Type</a
+			>)</div
 		      ></details
 		    ></td
 		  ></tr
@@ -574,8 +582,10 @@
 		    > <a href="#" class="selflink"
 		    >#</a
 		    ></td
-		  ><td class="doc empty"
-		  ></td
+		  ><td class="doc"
+		  ><p
+		    >Doc for: type instance Foo X = Y</p
+		    ></td
 		  ></tr
 		><tr
 		><td colspan="2"
@@ -610,7 +620,9 @@
 		      >X</a
 		      > <a href="#" title="TypeFamilies"
 		      >&lt;&gt;</a
-		      > (a :: *)</span
+		      > (a :: <a href="#" title="Data.Kind"
+		      >Type</a
+		      >)</span
 		    > <a href="#" class="selflink"
 		    >#</a
 		    ></td
@@ -633,7 +645,9 @@
 			>X</a
 			> <a href="#" title="TypeFamilies"
 			>&lt;&gt;</a
-			> (a :: *) = <a href="#" title="TypeFamilies"
+			> (a :: <a href="#" title="Data.Kind"
+			>Type</a
+			>) = <a href="#" title="TypeFamilies"
 			>X</a
 			></div
 		      ></details
@@ -698,7 +712,9 @@
 			  >AssocD</a
 			  > <a href="#" title="TypeFamilies"
 			  >Y</a
-			  > :: * <a href="#" class="selflink"
+			  > :: <a href="#" title="Data.Kind"
+			  >Type</a
+			  > <a href="#" class="selflink"
 			  >#</a
 			  ></p
 			><p class="src"
@@ -708,7 +724,9 @@
 			  >AssocT</a
 			  > <a href="#" title="TypeFamilies"
 			  >Y</a
-			  > :: * <a href="#" class="selflink"
+			  > :: <a href="#" title="Data.Kind"
+			  >Type</a
+			  > <a href="#" class="selflink"
 			  >#</a
 			  ></p
 			></div
@@ -924,8 +942,10 @@
 		    > <a href="#" class="selflink"
 		    >#</a
 		    ></td
-		  ><td class="doc empty"
-		  ></td
+		  ><td class="doc"
+		  ><p
+		    >Doc for: type instance Foo Y = X</p
+		    ></td
 		  ></tr
 		><tr
 		><td colspan="2"
@@ -960,7 +980,9 @@
 		      >Y</a
 		      > <a href="#" title="TypeFamilies"
 		      >&lt;&gt;</a
-		      > (a :: *)</span
+		      > (a :: <a href="#" title="Data.Kind"
+		      >Type</a
+		      >)</span
 		    > <a href="#" class="selflink"
 		    >#</a
 		    ></td
@@ -983,7 +1005,9 @@
 			>Y</a
 			> <a href="#" title="TypeFamilies"
 			>&lt;&gt;</a
-			> (a :: *) = a</div
+			> (a :: <a href="#" title="Data.Kind"
+			>Type</a
+			>) = a</div
 		      ></details
 		    ></td
 		  ></tr
@@ -1220,8 +1244,10 @@
 		    > <a href="#" class="selflink"
 		    >#</a
 		    ></td
-		  ><td class="doc empty"
-		  ></td
+		  ><td class="doc"
+		  ><p
+		    >Doc for: type instance Foo Y = X</p
+		    ></td
 		  ></tr
 		><tr
 		><td colspan="2"
@@ -1260,8 +1286,10 @@
 		    > <a href="#" class="selflink"
 		    >#</a
 		    ></td
-		  ><td class="doc empty"
-		  ></td
+		  ><td class="doc"
+		  ><p
+		    >Doc for: type instance Foo X = Y</p
+		    ></td
 		  ></tr
 		><tr
 		><td colspan="2"
@@ -1574,7 +1602,9 @@
 			  >AssocD</a
 			  > <a href="#" title="TypeFamilies"
 			  >Y</a
-			  > :: * <a href="#" class="selflink"
+			  > :: <a href="#" title="Data.Kind"
+			  >Type</a
+			  > <a href="#" class="selflink"
 			  >#</a
 			  ></p
 			><p class="src"
@@ -1584,7 +1614,9 @@
 			  >AssocT</a
 			  > <a href="#" title="TypeFamilies"
 			  >Y</a
-			  > :: * <a href="#" class="selflink"
+			  > :: <a href="#" title="Data.Kind"
+			  >Type</a
+			  > <a href="#" class="selflink"
 			  >#</a
 			  ></p
 			></div
@@ -1628,7 +1660,9 @@
 			  >AssocD</a
 			  > <a href="#" title="TypeFamilies"
 			  >X</a
-			  > :: * <a href="#" class="selflink"
+			  > :: <a href="#" title="Data.Kind"
+			  >Type</a
+			  > <a href="#" class="selflink"
 			  >#</a
 			  ></p
 			><p class="src"
@@ -1638,7 +1672,9 @@
 			  >AssocT</a
 			  > <a href="#" title="TypeFamilies"
 			  >X</a
-			  > :: * <a href="#" class="selflink"
+			  > :: <a href="#" title="Data.Kind"
+			  >Type</a
+			  > <a href="#" class="selflink"
 			  >#</a
 			  ></p
 			></div
@@ -1762,7 +1798,9 @@
 		      >Y</a
 		      > <a href="#" title="TypeFamilies"
 		      >&lt;&gt;</a
-		      > (a :: *)</span
+		      > (a :: <a href="#" title="Data.Kind"
+		      >Type</a
+		      >)</span
 		    > <a href="#" class="selflink"
 		    >#</a
 		    ></td
@@ -1785,7 +1823,9 @@
 			>Y</a
 			> <a href="#" title="TypeFamilies"
 			>&lt;&gt;</a
-			> (a :: *) = a</div
+			> (a :: <a href="#" title="Data.Kind"
+			>Type</a
+			>) = a</div
 		      ></details
 		    ></td
 		  ></tr
@@ -1800,7 +1840,9 @@
 		      >X</a
 		      > <a href="#" title="TypeFamilies"
 		      >&lt;&gt;</a
-		      > (a :: *)</span
+		      > (a :: <a href="#" title="Data.Kind"
+		      >Type</a
+		      >)</span
 		    > <a href="#" class="selflink"
 		    >#</a
 		    ></td
@@ -1823,7 +1865,9 @@
 			>X</a
 			> <a href="#" title="TypeFamilies"
 			>&lt;&gt;</a
-			> (a :: *) = <a href="#" title="TypeFamilies"
+			> (a :: <a href="#" title="Data.Kind"
+			>Type</a
+			>) = <a href="#" title="TypeFamilies"
 			>X</a
 			></div
 		      ></details
diff --git a/html-test/ref/TypeFamilies2.html b/html-test/ref/TypeFamilies2.html
index a5d0d9a9..1b4eed8c 100644
--- a/html-test/ref/TypeFamilies2.html
+++ b/html-test/ref/TypeFamilies2.html
@@ -142,8 +142,10 @@
 		    > <a href="#" class="selflink"
 		    >#</a
 		    ></td
-		  ><td class="doc empty"
-		  ></td
+		  ><td class="doc"
+		  ><p
+		    >Should be visible, but with a hidden right hand side</p
+		    ></td
 		  ></tr
 		><tr
 		><td colspan="2"
@@ -202,8 +204,10 @@
 		    > <a href="#" class="selflink"
 		    >#</a
 		    ></td
-		  ><td class="doc empty"
-		  ></td
+		  ><td class="doc"
+		  ><p
+		    >Should be visible, but with a hidden right hand side</p
+		    ></td
 		  ></tr
 		><tr
 		><td colspan="2"
@@ -240,8 +244,10 @@
 		    > <a href="#" class="selflink"
 		    >#</a
 		    ></td
-		  ><td class="doc empty"
-		  ></td
+		  ><td class="doc"
+		  ><p
+		    >External instance</p
+		    ></td
 		  ></tr
 		><tr
 		><td colspan="2"
diff --git a/html-test/ref/Unicode.html b/html-test/ref/Unicode.html
index 3cae7357..26d0d60e 100644
--- a/html-test/ref/Unicode.html
+++ b/html-test/ref/Unicode.html
@@ -46,7 +46,9 @@
 	  ><li class="src short"
 	    ><a href="#"
 	      >x</a
-	      > :: Int</li
+	      > :: <a href="#" title="Data.Int"
+	      >Int</a
+	      ></li
 	    ></ul
 	  ></details
 	></div
@@ -57,7 +59,9 @@
 	><p class="src"
 	  ><a id="v:x" class="def"
 	    >x</a
-	    > :: Int <a href="#" class="selflink"
+	    > :: <a href="#" title="Data.Int"
+	    >Int</a
+	    > <a href="#" class="selflink"
 	    >#</a
 	    ></p
 	  ><div class="doc"
diff --git a/html-test/ref/Unicode2.html b/html-test/ref/Unicode2.html
new file mode 100644
index 00000000..bf667bae
--- /dev/null
+++ b/html-test/ref/Unicode2.html
@@ -0,0 +1,100 @@
+<html xmlns="http://www.w3.org/1999/xhtml"
+><head
+  ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"
+     /><title
+    >Unicode2</title
+    ><link href="#" rel="stylesheet" type="text/css" title="Ocean"
+     /><link rel="stylesheet" type="text/css" href="#"
+     /><script src="haddock-bundle.min.js" async="async" type="text/javascript"
+    ></script
+    ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"
+    ></script
+    ></head
+  ><body
+  ><div id="package-header"
+    ><ul class="links" id="page-menu"
+      ><li
+	><a href="#"
+	  >Contents</a
+	  ></li
+	><li
+	><a href="#"
+	  >Index</a
+	  ></li
+	></ul
+      ><p class="caption empty"
+      ></p
+      ></div
+    ><div id="content"
+    ><div id="module-header"
+      ><table class="info"
+	><tr
+	  ><th
+	    >Safe Haskell</th
+	    ><td
+	    >Safe</td
+	    ></tr
+	  ></table
+	><p class="caption"
+	>Unicode2</p
+	></div
+      ><div id="synopsis"
+      ><details id="syn"
+	><summary
+	  >Synopsis</summary
+	  ><ul class="details-toggle" data-details-id="syn"
+	  ><li class="src short"
+	    ><a href="#"
+	      >&#252;</a
+	      > :: ()</li
+	    ></ul
+	  ></details
+	></div
+      ><div id="interface"
+      ><h1
+	>Documentation</h1
+	><div class="top"
+	><p class="src"
+	  ><a id="v:-252-" class="def"
+	    >&#252;</a
+	    > :: () <a href="#" class="selflink"
+	    >#</a
+	    ></p
+	  ><div class="doc"
+	  ><p
+	    >All of the following work with a unicode character &#252;:</p
+	    ><ul
+	    ><li
+	      >an italicized <em
+		>&#252;</em
+		></li
+	      ><li
+	      >inline code <code
+		>&#252;</code
+		></li
+	      ><li
+	      >a code block:</li
+	      ></ul
+	    ><pre
+	    >&#252;</pre
+	    ><ul
+	    ><li
+	      >a url <a href="#"
+		>https://www.google.com/search?q=&#252;</a
+		></li
+	      ><li
+	      >a link to <code
+		><a href="#" title="Unicode2"
+		  >&#252;</a
+		  ></code
+		></li
+	      ></ul
+	    ></div
+	  ></div
+	></div
+      ></div
+    ><div id="footer"
+    ></div
+    ></body
+  ></html
+>
\ No newline at end of file
diff --git a/html-test/ref/Visible.html b/html-test/ref/Visible.html
index 22c6be6c..308689e4 100644
--- a/html-test/ref/Visible.html
+++ b/html-test/ref/Visible.html
@@ -45,7 +45,11 @@
 	><p class="src"
 	  ><a id="v:visible" class="def"
 	    >visible</a
-	    > :: Int -&gt; Int <a href="#" class="selflink"
+	    > :: <a href="#" title="Data.Int"
+	    >Int</a
+	    > -&gt; <a href="#" title="Data.Int"
+	    >Int</a
+	    > <a href="#" class="selflink"
 	    >#</a
 	    ></p
 	  ></div
diff --git a/html-test/src/Bug745.hs b/html-test/src/Bug745.hs
new file mode 100644
index 00000000..f26562c1
--- /dev/null
+++ b/html-test/src/Bug745.hs
@@ -0,0 +1,8 @@
+{-# LANGUAGE TemplateHaskell, QuasiQuotes #-}
+
+module Bug574 where
+-- See https://github.com/haskell/haddock/issues/574
+
+-- | Somthing with a spliced type
+foo :: Int -> $(let i = [t| Int |] in [t| $i -> $i |])
+foo x y = x + y
diff --git a/html-test/src/ConstructorArgs.hs b/html-test/src/ConstructorArgs.hs
new file mode 100644
index 00000000..6b0da711
--- /dev/null
+++ b/html-test/src/ConstructorArgs.hs
@@ -0,0 +1,56 @@
+{-# LANGUAGE GADTs, PatternSynonyms #-}
+
+module ConstructorArgs (Foo(..), Boo(Foo, Foa, Fo, Fo'), pattern Bo, pattern Bo') where
+
+data Foo
+  = Rec             -- ^ doc on a record
+     { x :: String  -- ^ doc on the `String` field of `Rec`
+     , y :: String  -- ^ doc on the `String` field of `Rec`
+     }
+   | Baz Int String  -- ^ old prefix doc style
+   | Boa             -- ^ doc on the `Boa` constrictor
+       !Int          -- ^ doc on the `Int` field of `Boa`
+       !String       -- ^ doc on the `String` field of `Boa`
+   | Int :| String   -- ^ old infix doc style
+   | Int             -- ^ doc on the `Int` field of the `:*` constructor
+       :*            -- ^ doc on the `:*` constructor
+     String          -- ^ doc on the `String` field of the `:*` constructor
+
+infixr 1 `Foo`
+infixr 2 `Boa`
+infixr 3 :*
+
+data Boo where
+  -- | Info about a 'Foo'
+  Foo :: Int    -- ^ `Int` field of `Foo`
+      -> String -- ^ `String` field of `Foo`
+      -> Boo    -- ^ Make a `Boo`
+
+  -- | no argument docs GADT
+  Foa :: Int -> Boo
+
+infixr 4 `Boo`
+
+-- | Info about bundled 'Fo'
+pattern Fo :: Int    -- ^ an 'Int'
+           -> String -- ^ a 'String'
+           -> Boo    -- ^ a 'Boo'
+pattern Fo x y = Foo x y
+
+-- | Bundled and no argument docs
+pattern Fo' :: Boo
+pattern Fo' = Foo 1 "hi"
+
+infixr 5 `Fo`
+
+-- | Info about not-bundled 'Bo'
+pattern Bo :: Int    -- ^ an 'Int'
+           -> String -- ^ a 'String'
+           -> Boo -- ^ a 'Boo' pattern
+pattern Bo x y = Foo x y
+
+-- | Not bunded and no argument docs
+pattern Bo' :: Int -> String -> Boo
+pattern Bo' x y = Foo x y
+
+infixr 6 `Bo`
diff --git a/html-test/src/GadtConstructorArgs.hs b/html-test/src/GadtConstructorArgs.hs
new file mode 100644
index 00000000..79ffb4d3
--- /dev/null
+++ b/html-test/src/GadtConstructorArgs.hs
@@ -0,0 +1,13 @@
+{-# LANGUAGE GADTs, PatternSynonyms #-}
+
+module GadtConstructorArgs (Boo(..)) where
+
+data Boo where
+  Fot :: { x :: Int  -- ^ an 'x'
+         , y :: Int  -- ^ a 'y'
+         } -> Boo
+
+  -- | Record GADT with docs
+  Fob :: { w :: Int  -- ^ a 'w'
+         , z :: Int  -- ^ a 'z'
+         } -> Boo    -- ^ a 'Boo'
diff --git a/html-test/src/QuantifiedConstraints.hs b/html-test/src/QuantifiedConstraints.hs
new file mode 100644
index 00000000..82dd81e5
--- /dev/null
+++ b/html-test/src/QuantifiedConstraints.hs
@@ -0,0 +1,11 @@
+{-# LANGUAGE QuantifiedConstraints #-}
+module QuantifiedConstraints where
+
+class Foo a where
+  fooed :: a
+
+needsParensAroundContext :: (forall x. Foo (f x)) => f Int
+needsParensAroundContext = fooed
+
+needsNoParensAroundContext :: Foo (f Int) => f Int
+needsNoParensAroundContext = fooed
diff --git a/html-test/src/Unicode2.hs b/html-test/src/Unicode2.hs
new file mode 100644
index 00000000..ca6b18ba
--- /dev/null
+++ b/html-test/src/Unicode2.hs
@@ -0,0 +1,18 @@
+module Unicode2 where
+
+-- | All of the following work with a unicode character ü:
+--
+--   * an italicized /ü/
+--   
+--   * inline code @ü@
+--
+--   * a code block:
+--
+--   > ü
+--
+--   * a url <https://www.google.com/search?q=ü>
+-- 
+--   * a link to 'ü'
+--
+ü :: ()
+ü = ()
diff --git a/latex-test/ref/ConstructorArgs/ConstructorArgs.tex b/latex-test/ref/ConstructorArgs/ConstructorArgs.tex
new file mode 100644
index 00000000..44304f47
--- /dev/null
+++ b/latex-test/ref/ConstructorArgs/ConstructorArgs.tex
@@ -0,0 +1,69 @@
+\haddockmoduleheading{ConstructorArgs}
+\label{module:ConstructorArgs}
+\haddockbeginheader
+{\haddockverb\begin{verbatim}
+module ConstructorArgs (
+    Foo((:|), Rec, Baz, Boa, (:*), x, y),  Boo(Foo, Foa, Fo, Fo'),  pattern Bo, 
+    pattern Bo'
+  ) where\end{verbatim}}
+\haddockendheader
+
+\begin{haddockdesc}
+\item[\begin{tabular}{@{}l}
+data\ Foo
+\end{tabular}]\haddockbegindoc
+\enspace \emph{Constructors}\par
+\haddockbeginconstrs
+\haddockdecltt{=} & \haddockdecltt{Rec} & doc on a record \\
+                                          & \haddocktt{\qquad \{} \haddockdecltt{x :: String} & doc on the \haddockid{String} field of \haddockid{Rec} \\
+                                          & \haddocktt{\qquad ,} \haddockdecltt{y :: String} & doc on the \haddockid{String} field of \haddockid{Rec} \\ & \haddocktt{\qquad \}} \\
+\haddockdecltt{|} & \haddockdecltt{Baz Int String} & old prefix doc style \\
+\haddockdecltt{|} & \haddockdecltt{Boa} & doc on the \haddockid{Boa} constrictor \\
+                                          & \qquad \haddockdecltt{!Int} & doc on the \haddockid{Int} field of \haddockid{Boa} \\
+                                          & \qquad \haddockdecltt{!String} & doc on the \haddockid{String} field of \haddockid{Boa} \\
+\haddockdecltt{|} & \haddockdecltt{Int :| String} & old infix doc style \\
+\haddockdecltt{|} & \haddockdecltt{(:*)} & doc on the \haddockid{:*} constructor \\
+                                           & \qquad \haddockdecltt{Int} & doc on the \haddockid{Int} field of the \haddockid{:*} constructor \\
+                                           & \qquad \haddockdecltt{String} & doc on the \haddockid{String} field of the \haddockid{:*} constructor \\
+\end{tabulary}\par
+\end{haddockdesc}
+\begin{haddockdesc}
+\item[\begin{tabular}{@{}l}
+data\ Boo\ where
+\end{tabular}]\haddockbegindoc
+\enspace \emph{Constructors}\par
+\haddockbeginconstrs
+& \haddockdecltt{Foo} & Info about a \haddockid{Foo} \\
+                        & \qquad \haddockdecltt{::} \enspace \haddockdecltt{Int} & \haddockid{Int} field of \haddockid{Foo} \\
+                        & \qquad \haddockdecltt{->} \enspace \haddockdecltt{String} & \haddockid{String} field of \haddockid{Foo} \\
+                        & \qquad \haddockdecltt{->} \enspace \haddockdecltt{Boo} & Make a \haddockid{Boo} \\
+& \haddockdecltt{Foa :: Int -> Boo} & no argument docs GADT \\
+\end{tabulary}\par
+\enspace \emph{Bundled Patterns}\par
+\haddockbeginconstrs
+& \haddockdecltt{pattern Fo} & Info about bundled \haddockid{Fo} \\
+                               & \qquad \haddockdecltt{::} \enspace \haddockdecltt{Int} & an \haddockid{Int} \\
+                               & \qquad \haddockdecltt{->} \enspace \haddockdecltt{String} & a \haddockid{String} \\
+                               & \qquad \haddockdecltt{->} \enspace \haddockdecltt{Boo} & a \haddockid{Boo} \\
+& \haddockdecltt{pattern Fo' :: Boo} & Bundled and no argument docs \\
+\end{tabulary}\par
+\end{haddockdesc}
+\begin{haddockdesc}
+\item[\begin{tabular}{@{}l}
+pattern\ Bo
+\end{tabular}]\haddockbegindoc
+\haddockbeginargs
+\haddockdecltt{::} & \haddockdecltt{Int} & an \haddockid{Int} \\
+\haddockdecltt{->} & \haddockdecltt{String} & a \haddockid{String} \\
+\haddockdecltt{->} & \haddockdecltt{Boo} & a \haddockid{Boo} pattern \\
+\end{tabulary}\par
+Info about not-bundled \haddockid{Bo}\par
+
+\end{haddockdesc}
+\begin{haddockdesc}
+\item[\begin{tabular}{@{}l}
+pattern\ Bo'\ ::\ Int\ ->\ String\ ->\ Boo
+\end{tabular}]\haddockbegindoc
+Not bunded and no argument docs\par
+
+\end{haddockdesc}
\ No newline at end of file
diff --git a/latex-test/ref/ConstructorArgs/haddock.sty b/latex-test/ref/ConstructorArgs/haddock.sty
new file mode 100644
index 00000000..6e031a98
--- /dev/null
+++ b/latex-test/ref/ConstructorArgs/haddock.sty
@@ -0,0 +1,57 @@
+% Default Haddock style definitions.  To use your own style, invoke
+% Haddock with the option --latex-style=mystyle.
+
+\usepackage{tabulary} % see below
+
+% make hyperlinks in the PDF, and add an expandabale index
+\usepackage[pdftex,bookmarks=true]{hyperref}
+
+\newenvironment{haddocktitle}
+  {\begin{center}\bgroup\large\bfseries}
+  {\egroup\end{center}}
+\newenvironment{haddockprologue}{\vspace{1in}}{}
+
+\newcommand{\haddockmoduleheading}[1]{\chapter{\texttt{#1}}}
+
+\newcommand{\haddockbeginheader}{\hrulefill}
+\newcommand{\haddockendheader}{\noindent\hrulefill}
+
+% a little gap before the ``Methods'' header
+\newcommand{\haddockpremethods}{\vspace{2ex}}
+
+% inserted before \\begin{verbatim}
+\newcommand{\haddockverb}{\small}
+
+% an identifier: add an index entry
+\newcommand{\haddockid}[1]{\haddocktt{#1}\index{#1@\texttt{#1}}}
+
+% The tabulary environment lets us have a column that takes up ``the
+% rest of the space''.  Unfortunately it doesn't allow
+% the \end{tabulary} to be in the expansion of a macro, it must appear
+% literally in the document text, so Haddock inserts
+% the \end{tabulary} itself.
+\newcommand{\haddockbeginconstrs}{\begin{tabulary}{\linewidth}{@{}llJ@{}}}
+\newcommand{\haddockbeginargs}{\begin{tabulary}{\linewidth}{@{}llJ@{}}}
+
+\newcommand{\haddocktt}[1]{{\small \texttt{#1}}}
+\newcommand{\haddockdecltt}[1]{{\small\bfseries \texttt{#1}}}
+
+\makeatletter
+\newenvironment{haddockdesc}
+               {\list{}{\labelwidth\z@ \itemindent-\leftmargin
+                        \let\makelabel\haddocklabel}}
+               {\endlist}
+\newcommand*\haddocklabel[1]{\hspace\labelsep\haddockdecltt{#1}}
+\makeatother
+
+% after a declaration, start a new line for the documentation.
+% Otherwise, the documentation starts right after the declaration,
+% because we're using the list environment and the declaration is the
+% ``label''.  I tried making this newline part of the label, but
+% couldn't get that to work reliably (the space seemed to stretch
+% sometimes).
+\newcommand{\haddockbegindoc}{\hfill\\[1ex]}
+
+% spacing between paragraphs and no \parindent looks better
+\parskip=10pt plus2pt minus2pt
+\setlength{\parindent}{0cm}
diff --git a/latex-test/ref/ConstructorArgs/main.tex b/latex-test/ref/ConstructorArgs/main.tex
new file mode 100644
index 00000000..80f639c5
--- /dev/null
+++ b/latex-test/ref/ConstructorArgs/main.tex
@@ -0,0 +1,11 @@
+\documentclass{book}
+\usepackage{haddock}
+\begin{document}
+\begin{titlepage}
+\begin{haddocktitle}
+
+\end{haddocktitle}
+\end{titlepage}
+\tableofcontents
+\input{ConstructorArgs}
+\end{document}
\ No newline at end of file
diff --git a/latex-test/ref/GadtConstructorArgs/GadtConstructorArgs.tex b/latex-test/ref/GadtConstructorArgs/GadtConstructorArgs.tex
new file mode 100644
index 00000000..7aaf5512
--- /dev/null
+++ b/latex-test/ref/GadtConstructorArgs/GadtConstructorArgs.tex
@@ -0,0 +1,25 @@
+\haddockmoduleheading{GadtConstructorArgs}
+\label{module:GadtConstructorArgs}
+\haddockbeginheader
+{\haddockverb\begin{verbatim}
+module GadtConstructorArgs (
+    Boo(Fot, Fob, x, y, w, z)
+  ) where\end{verbatim}}
+\haddockendheader
+
+\begin{haddockdesc}
+\item[\begin{tabular}{@{}l}
+data\ Boo\ where
+\end{tabular}]\haddockbegindoc
+\enspace \emph{Constructors}\par
+\haddockbeginconstrs
+& \haddockdecltt{Fot} & \\
+                        & \qquad \haddockdecltt{:: \{} \enspace \haddockdecltt{x :: Int} & an \haddockid{x} \\
+                        & \qquad \haddockdecltt{\ \ \ \ ,} \enspace \haddockdecltt{y :: Int} & a \haddockid{y} \\
+                        & \qquad \haddockdecltt{\ \ \ \ \} ->} \enspace \haddockdecltt{Boo} & \\
+& \haddockdecltt{Fob} & Record GADT with docs \\
+                        & \qquad \haddockdecltt{:: \{} \enspace \haddockdecltt{w :: Int} & a \haddockid{w} \\
+                        & \qquad \haddockdecltt{\ \ \ \ ,} \enspace \haddockdecltt{z :: Int} & a \haddockid{z} \\
+                        & \qquad \haddockdecltt{\ \ \ \ \} ->} \enspace \haddockdecltt{Boo} & a \haddockid{Boo} \\
+\end{tabulary}\par
+\end{haddockdesc}
\ No newline at end of file
diff --git a/latex-test/ref/GadtConstructorArgs/haddock.sty b/latex-test/ref/GadtConstructorArgs/haddock.sty
new file mode 100644
index 00000000..6e031a98
--- /dev/null
+++ b/latex-test/ref/GadtConstructorArgs/haddock.sty
@@ -0,0 +1,57 @@
+% Default Haddock style definitions.  To use your own style, invoke
+% Haddock with the option --latex-style=mystyle.
+
+\usepackage{tabulary} % see below
+
+% make hyperlinks in the PDF, and add an expandabale index
+\usepackage[pdftex,bookmarks=true]{hyperref}
+
+\newenvironment{haddocktitle}
+  {\begin{center}\bgroup\large\bfseries}
+  {\egroup\end{center}}
+\newenvironment{haddockprologue}{\vspace{1in}}{}
+
+\newcommand{\haddockmoduleheading}[1]{\chapter{\texttt{#1}}}
+
+\newcommand{\haddockbeginheader}{\hrulefill}
+\newcommand{\haddockendheader}{\noindent\hrulefill}
+
+% a little gap before the ``Methods'' header
+\newcommand{\haddockpremethods}{\vspace{2ex}}
+
+% inserted before \\begin{verbatim}
+\newcommand{\haddockverb}{\small}
+
+% an identifier: add an index entry
+\newcommand{\haddockid}[1]{\haddocktt{#1}\index{#1@\texttt{#1}}}
+
+% The tabulary environment lets us have a column that takes up ``the
+% rest of the space''.  Unfortunately it doesn't allow
+% the \end{tabulary} to be in the expansion of a macro, it must appear
+% literally in the document text, so Haddock inserts
+% the \end{tabulary} itself.
+\newcommand{\haddockbeginconstrs}{\begin{tabulary}{\linewidth}{@{}llJ@{}}}
+\newcommand{\haddockbeginargs}{\begin{tabulary}{\linewidth}{@{}llJ@{}}}
+
+\newcommand{\haddocktt}[1]{{\small \texttt{#1}}}
+\newcommand{\haddockdecltt}[1]{{\small\bfseries \texttt{#1}}}
+
+\makeatletter
+\newenvironment{haddockdesc}
+               {\list{}{\labelwidth\z@ \itemindent-\leftmargin
+                        \let\makelabel\haddocklabel}}
+               {\endlist}
+\newcommand*\haddocklabel[1]{\hspace\labelsep\haddockdecltt{#1}}
+\makeatother
+
+% after a declaration, start a new line for the documentation.
+% Otherwise, the documentation starts right after the declaration,
+% because we're using the list environment and the declaration is the
+% ``label''.  I tried making this newline part of the label, but
+% couldn't get that to work reliably (the space seemed to stretch
+% sometimes).
+\newcommand{\haddockbegindoc}{\hfill\\[1ex]}
+
+% spacing between paragraphs and no \parindent looks better
+\parskip=10pt plus2pt minus2pt
+\setlength{\parindent}{0cm}
diff --git a/latex-test/ref/GadtConstructorArgs/main.tex b/latex-test/ref/GadtConstructorArgs/main.tex
new file mode 100644
index 00000000..dc1a1aa3
--- /dev/null
+++ b/latex-test/ref/GadtConstructorArgs/main.tex
@@ -0,0 +1,11 @@
+\documentclass{book}
+\usepackage{haddock}
+\begin{document}
+\begin{titlepage}
+\begin{haddocktitle}
+
+\end{haddocktitle}
+\end{titlepage}
+\tableofcontents
+\input{GadtConstructorArgs}
+\end{document}
\ No newline at end of file
diff --git a/latex-test/src/ConstructorArgs/ConstructorArgs.hs b/latex-test/src/ConstructorArgs/ConstructorArgs.hs
new file mode 100644
index 00000000..6b0da711
--- /dev/null
+++ b/latex-test/src/ConstructorArgs/ConstructorArgs.hs
@@ -0,0 +1,56 @@
+{-# LANGUAGE GADTs, PatternSynonyms #-}
+
+module ConstructorArgs (Foo(..), Boo(Foo, Foa, Fo, Fo'), pattern Bo, pattern Bo') where
+
+data Foo
+  = Rec             -- ^ doc on a record
+     { x :: String  -- ^ doc on the `String` field of `Rec`
+     , y :: String  -- ^ doc on the `String` field of `Rec`
+     }
+   | Baz Int String  -- ^ old prefix doc style
+   | Boa             -- ^ doc on the `Boa` constrictor
+       !Int          -- ^ doc on the `Int` field of `Boa`
+       !String       -- ^ doc on the `String` field of `Boa`
+   | Int :| String   -- ^ old infix doc style
+   | Int             -- ^ doc on the `Int` field of the `:*` constructor
+       :*            -- ^ doc on the `:*` constructor
+     String          -- ^ doc on the `String` field of the `:*` constructor
+
+infixr 1 `Foo`
+infixr 2 `Boa`
+infixr 3 :*
+
+data Boo where
+  -- | Info about a 'Foo'
+  Foo :: Int    -- ^ `Int` field of `Foo`
+      -> String -- ^ `String` field of `Foo`
+      -> Boo    -- ^ Make a `Boo`
+
+  -- | no argument docs GADT
+  Foa :: Int -> Boo
+
+infixr 4 `Boo`
+
+-- | Info about bundled 'Fo'
+pattern Fo :: Int    -- ^ an 'Int'
+           -> String -- ^ a 'String'
+           -> Boo    -- ^ a 'Boo'
+pattern Fo x y = Foo x y
+
+-- | Bundled and no argument docs
+pattern Fo' :: Boo
+pattern Fo' = Foo 1 "hi"
+
+infixr 5 `Fo`
+
+-- | Info about not-bundled 'Bo'
+pattern Bo :: Int    -- ^ an 'Int'
+           -> String -- ^ a 'String'
+           -> Boo -- ^ a 'Boo' pattern
+pattern Bo x y = Foo x y
+
+-- | Not bunded and no argument docs
+pattern Bo' :: Int -> String -> Boo
+pattern Bo' x y = Foo x y
+
+infixr 6 `Bo`
diff --git a/latex-test/src/GadtConstructorArgs/GadtConstructorArgs.hs b/latex-test/src/GadtConstructorArgs/GadtConstructorArgs.hs
new file mode 100644
index 00000000..79ffb4d3
--- /dev/null
+++ b/latex-test/src/GadtConstructorArgs/GadtConstructorArgs.hs
@@ -0,0 +1,13 @@
+{-# LANGUAGE GADTs, PatternSynonyms #-}
+
+module GadtConstructorArgs (Boo(..)) where
+
+data Boo where
+  Fot :: { x :: Int  -- ^ an 'x'
+         , y :: Int  -- ^ a 'y'
+         } -> Boo
+
+  -- | Record GADT with docs
+  Fob :: { w :: Int  -- ^ a 'w'
+         , z :: Int  -- ^ a 'z'
+         } -> Boo    -- ^ a 'Boo'
-- 
cgit v1.2.3


From e3b86a49b57f9b127d9c98e47e61fb15f58478e7 Mon Sep 17 00:00:00 2001
From: Simon Jakobi <simon.jakobi@gmail.com>
Date: Fri, 20 Jul 2018 16:05:47 +0200
Subject: Revert "Revert "Bump GHC version to 8.6""

That commit didn't belong onto the ghc-8.6 branch.

This reverts commit acbaef3b9daf1d2dea10017964bf886e77a8e967.
---
 haddock-api/haddock-api.cabal | 4 ++--
 haddock.cabal                 | 2 +-
 2 files changed, 3 insertions(+), 3 deletions(-)

(limited to 'haddock-api')

diff --git a/haddock-api/haddock-api.cabal b/haddock-api/haddock-api.cabal
index 6a7a932b..e1a52824 100644
--- a/haddock-api/haddock-api.cabal
+++ b/haddock-api/haddock-api.cabal
@@ -42,7 +42,7 @@ library
   -- this package typically supports only single major versions
   build-depends: base            ^>= 4.12.0
                , Cabal           ^>= 2.3.0
-               , ghc             ^>= 8.5
+               , ghc             ^>= 8.6
                , ghc-paths       ^>= 0.1.0.9
                , haddock-library ^>= 1.6.0
                , xhtml           ^>= 3000.2.2
@@ -167,7 +167,7 @@ test-suite spec
     Haddock.Backends.Hyperlinker.Types
 
   build-depends: Cabal           ^>= 2.3
-               , ghc             ^>= 8.5
+               , ghc             ^>= 8.6
                , ghc-paths       ^>= 0.1.0.9
                , haddock-library ^>= 1.6.0
                , xhtml           ^>= 3000.2.2
diff --git a/haddock.cabal b/haddock.cabal
index af606894..29d3d114 100644
--- a/haddock.cabal
+++ b/haddock.cabal
@@ -78,7 +78,7 @@ executable haddock
       xhtml >= 3000.2 && < 3000.3,
       Cabal >= 1.10,
       ghc-boot,
-      ghc == 8.5.*,
+      ghc == 8.6.*,
       bytestring,
       parsec,
       text,
-- 
cgit v1.2.3


From d504a2864a4e1982e142cf88c023e7caeea3b76f Mon Sep 17 00:00:00 2001
From: Simon Jakobi <simon.jakobi@gmail.com>
Date: Fri, 22 Jun 2018 21:37:22 +0200
Subject: Don't warn about ambiguous identifiers when the candidate names
 belong to the same type

This also changes the defaulting heuristic for ambiguous identifiers.
We now prefer local names primarily, and type constructors or class
names secondarily.

Partially fixes #854.
---
 haddock-api/src/Haddock/Interface/LexParseRn.hs | 53 ++++++++++++++++---------
 1 file changed, 35 insertions(+), 18 deletions(-)

(limited to 'haddock-api')

diff --git a/haddock-api/src/Haddock/Interface/LexParseRn.hs b/haddock-api/src/Haddock/Interface/LexParseRn.hs
index 731f2a35..e83708d0 100644
--- a/haddock-api/src/Haddock/Interface/LexParseRn.hs
+++ b/haddock-api/src/Haddock/Interface/LexParseRn.hs
@@ -1,5 +1,6 @@
 {-# OPTIONS_GHC -Wwarn #-}
 {-# LANGUAGE BangPatterns #-}
+{-# LANGUAGE ViewPatterns #-}
   -----------------------------------------------------------------------------
 -- |
 -- Module      :  Haddock.Interface.LexParseRn
@@ -18,7 +19,11 @@ module Haddock.Interface.LexParseRn
   , processModuleHeader
   ) where
 
+import Avail
+import Control.Arrow
+import Control.Monad
 import Data.List
+import Data.Ord
 import Documentation.Haddock.Doc (metaDocConcat)
 import DynFlags (languageExtensions)
 import qualified GHC.LanguageExtensions as LangExt
@@ -94,11 +99,9 @@ rename dflags gre = rn
         -- Generate the choices for the possible kind of thing this
         -- is.
         let choices = dataTcOccs x
-        -- Try to look up all the names in the GlobalRdrEnv that match
-        -- the names.
-        let names = concatMap (\c -> map gre_name (lookupGRE_RdrName c gre)) choices
 
-        case names of
+        -- Lookup any GlobalRdrElts that match the choices.
+        case concatMap (\c -> lookupGRE_RdrName c gre) choices of
           -- We found no names in the env so we start guessing.
           [] ->
             case choices of
@@ -117,12 +120,10 @@ rename dflags gre = rn
 
           -- There is only one name in the environment that matches so
           -- use it.
-          [a] -> pure (DocIdentifier a)
+          [a] -> pure (DocIdentifier (gre_name a))
 
-          -- But when there are multiple names available, default to
-          -- type constructors: somewhat awfully GHC returns the
-          -- values in the list positionally.
-          a:b:_ -> ambiguous dflags x (if isTyConName a then a else b) names
+          -- There are multiple names available.
+          gres -> ambiguous dflags x gres
 
       DocWarning doc -> DocWarning <$> rn doc
       DocEmphasis doc -> DocEmphasis <$> rn doc
@@ -167,16 +168,32 @@ outOfScope dflags x =
       pure (monospaced a)
     monospaced a = DocMonospaced (DocString (showPpr dflags a))
 
--- | Warn about an ambiguous identifier.
-ambiguous :: DynFlags -> RdrName -> Name -> [Name] -> ErrMsgM (Doc Name)
-ambiguous dflags x dflt names = do
-  tell [msg]
+-- | Handle ambiguous identifiers.
+--
+-- Prefers local names primarily and type constructors or class names secondarily.
+--
+-- Emits a warning if the 'GlobalRdrElts's don't belong to the same type or class.
+ambiguous :: DynFlags
+          -> RdrName
+          -> [GlobalRdrElt] -- ^ More than one @gre@s sharing the same `RdrName` above.
+          -> ErrMsgM (Doc Name)
+ambiguous dflags x gres = do
+  let noChildren = map availName (gresToAvailInfo gres)
+      dflt = maximumBy (comparing (isLocalName &&& isTyConName)) noChildren
+      msg = "Warning: " ++ x_str ++ " is ambiguous. It is defined\n" ++
+            concatMap (\n -> "    * " ++ defnLoc n ++ "\n") (map gre_name gres) ++
+            "    You may be able to disambiguate the identifier by qualifying it or\n" ++
+            "    by hiding some imports.\n" ++
+            "    Defaulting to " ++ x_str ++ " defined " ++ defnLoc dflt
+  -- TODO: Once we have a syntax for namespace qualification (#667) we may also
+  -- want to emit a warning when an identifier is a data constructor for a type
+  -- of the same name, but not the only constructor.
+  -- For example, for @data D = C | D@, someone may want to reference the @D@
+  -- constructor.
+  when (length noChildren > 1) $ tell [msg]
   pure (DocIdentifier dflt)
   where
-    msg = "Warning: " ++ x_str ++ " is ambiguous. It is defined\n" ++
-          concatMap (\n -> "    * " ++ defnLoc n ++ "\n") names ++
-          "    You may be able to disambiguate the identifier by qualifying it or\n" ++
-          "    by hiding some imports.\n" ++
-          "    Defaulting to " ++ x_str ++ " defined " ++ defnLoc dflt
+    isLocalName (nameSrcLoc -> RealSrcLoc {}) = True
+    isLocalName _ = False
     x_str = '\'' : showPpr dflags x ++ "'"
     defnLoc = showSDoc dflags . pprNameDefnLoc
-- 
cgit v1.2.3


From 73707ed58d879cc04cb644c5dab88c39ca1465b7 Mon Sep 17 00:00:00 2001
From: Simon Jakobi <simon.jakobi@gmail.com>
Date: Sat, 23 Jun 2018 16:45:31 +0200
Subject: outOfScope: Recommend qualifying the identifier

---
 haddock-api/src/Haddock/Interface/LexParseRn.hs | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

(limited to 'haddock-api')

diff --git a/haddock-api/src/Haddock/Interface/LexParseRn.hs b/haddock-api/src/Haddock/Interface/LexParseRn.hs
index e83708d0..87face7c 100644
--- a/haddock-api/src/Haddock/Interface/LexParseRn.hs
+++ b/haddock-api/src/Haddock/Interface/LexParseRn.hs
@@ -164,7 +164,9 @@ outOfScope dflags x =
     Exact name -> warnAndMonospace name  -- Shouldn't happen since x is out of scope
   where
     warnAndMonospace a = do
-      tell ["Warning: '" ++ showPpr dflags a ++ "' is out of scope."]
+      tell ["Warning: '" ++ showPpr dflags a ++ "' is out of scope.\n" ++
+            "    If you qualify the identifier, haddock can try to link it\n" ++
+            "    it anyway."]
       pure (monospaced a)
     monospaced a = DocMonospaced (DocString (showPpr dflags a))
 
-- 
cgit v1.2.3


From 1868443b01232d57ec11dfc831ac0a6915a2b337 Mon Sep 17 00:00:00 2001
From: Yuji Yamamoto <whosekiteneverfly@gmail.com>
Date: Mon, 23 Jul 2018 15:16:01 +0900
Subject: Avoid "invalid argument (invalid character)" on non-unicode Windows
 (#892)

Steps to reproduce and the error message
====

```
> stack haddock basement
... snip ...
    Warning: 'A' is out of scope.
    Warning: 'haddock: internal error: <stdout>: commitBuffer: invalid argument (invalid character)
```

Environment
====

OS: Windows 10 ver. 1709
haddock: [HEAD of ghc-8.4 when I reproduce the error](https://github.com/haskell/haddock/commit/532b209d127e4cecdbf7e9e3dcf4f653a5605b5a). (I had to use this version to avoid another probrem already fixed in HEAD)
GHC: 8.4.3
stack: Version 1.7.1, Git revision 681c800873816c022739ca7ed14755e85a579565 (5807 commits) x86_64 hpack-0.28.2

Related pull request
====

https://github.com/haskell/haddock/pull/566
---
 haddock-api/src/Haddock/Interface.hs | 1 +
 1 file changed, 1 insertion(+)

(limited to 'haddock-api')

diff --git a/haddock-api/src/Haddock/Interface.hs b/haddock-api/src/Haddock/Interface.hs
index a66745ea..7c7f0e75 100644
--- a/haddock-api/src/Haddock/Interface.hs
+++ b/haddock-api/src/Haddock/Interface.hs
@@ -81,6 +81,7 @@ processModules
 processModules verbosity modules flags extIfaces = do
 #if defined(mingw32_HOST_OS)
   -- Avoid internal error: <stderr>: hPutChar: invalid argument (invalid character)' non UTF-8 Windows
+  liftIO $ hSetEncoding stdout $ mkLocaleEncoding TransliterateCodingFailure
   liftIO $ hSetEncoding stderr $ mkLocaleEncoding TransliterateCodingFailure
 #endif
 
-- 
cgit v1.2.3


From 9765c10a27013b5c9168ee507d1f3b34cb4be26f Mon Sep 17 00:00:00 2001
From: Alan Zimmerman <alan.zimm@gmail.com>
Date: Sun, 15 Jul 2018 19:26:54 +0200
Subject: Match XFieldOcc rename in GHC

Trac #15386

(cherry picked from commit e3926b50ab8a7269fd6904b06e881745f08bc5d6)
---
 haddock-api/src/Haddock/Types.hs | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

(limited to 'haddock-api')

diff --git a/haddock-api/src/Haddock/Types.hs b/haddock-api/src/Haddock/Types.hs
index ea74043d..6da45a3b 100644
--- a/haddock-api/src/Haddock/Types.hs
+++ b/haddock-api/src/Haddock/Types.hs
@@ -696,7 +696,7 @@ type instance XUserTyVar    DocNameI = NoExt
 type instance XKindedTyVar  DocNameI = NoExt
 type instance XXTyVarBndr   DocNameI = NoExt
 
-type instance XFieldOcc    DocNameI = DocName
+type instance XCFieldOcc   DocNameI = DocName
 type instance XXFieldOcc   DocNameI = NoExt
 
 type instance XFixitySig   DocNameI = NoExt
-- 
cgit v1.2.3


From 1c4076328cfdd3aadbbbd494a240e25bd7309b0c Mon Sep 17 00:00:00 2001
From: Alexander Biehl <alexbiehl@gmail.com>
Date: Mon, 6 Aug 2018 13:04:02 +0200
Subject: Make --package-version optional for --hoogle generation (#899)

* Make --package-version optional for --hoogle generation

* Import mkVersion

* It's makeVersion not mkVersion
---
 haddock-api/src/Haddock.hs | 11 ++++++++---
 1 file changed, 8 insertions(+), 3 deletions(-)

(limited to 'haddock-api')

diff --git a/haddock-api/src/Haddock.hs b/haddock-api/src/Haddock.hs
index 00eb50f6..1651866a 100644
--- a/haddock-api/src/Haddock.hs
+++ b/haddock-api/src/Haddock.hs
@@ -48,6 +48,7 @@ import Control.Exception
 import Data.Maybe
 import Data.IORef
 import Data.Map (Map)
+import Data.Version (makeVersion)
 import qualified Data.Map as Map
 import System.IO
 import System.Exit
@@ -362,9 +363,13 @@ render dflags flags sinceQual qual ifaces installedIfaces extSrcMap = do
   -- might want to fix that if/when these two get some work on them
   when (Flag_Hoogle `elem` flags) $ do
     case pkgNameVer of
-      (Just (PackageName pkgNameFS), Just pkgVer) ->
-          let pkgNameStr | unpackFS pkgNameFS == "main" && title /= [] = title
-                         | otherwise = unpackFS pkgNameFS
+      (Just (PackageName pkgNameFS), mpkgVer) ->
+          let
+            pkgNameStr | unpackFS pkgNameFS == "main" && title /= [] = title
+                       | otherwise = unpackFS pkgNameFS
+
+            pkgVer =
+              fromMaybe (makeVersion []) mpkgVer
           in ppHoogle dflags' pkgNameStr pkgVer title (fmap _doc prologue)
                visibleIfaces odir
       _ -> putStrLn . unlines $
-- 
cgit v1.2.3


From 40eb5aabed0ae52982a690be311177b2dea2a0bb Mon Sep 17 00:00:00 2001
From: Alec Theriault <alec.theriault@gmail.com>
Date: Mon, 23 Jul 2018 13:23:35 -0700
Subject: Accumulate explicitly which modules to load for 'attachInstances'

The old approach to fixing #469, while correct, consumes a lot of
memory. We ended up with a HUGE 'GblRdrEnv' in 'ic_rn_gbl_env'. However,
'getNameToInstancesIndex' takes that environment and compresses it down
to a much smaller 'ModuleSet'.

Now, we compute that 'ModuleSet' explicitly as we process modules. That
way we can just tell 'getNameToInstancesIndex' what modules to load
(instead of it trying to compute that information from the interactive
context).

(cherry picked from commit 5c7c596c51d69b92164e9ba920157b36ce2b2ec1)
---
 haddock-api/src/Haddock/Interface.hs               | 59 +++++++++++++---------
 .../src/Haddock/Interface/AttachInstances.hs       | 11 ++--
 2 files changed, 42 insertions(+), 28 deletions(-)

(limited to 'haddock-api')

diff --git a/haddock-api/src/Haddock/Interface.hs b/haddock-api/src/Haddock/Interface.hs
index a66745ea..c330c5fe 100644
--- a/haddock-api/src/Haddock/Interface.hs
+++ b/haddock-api/src/Haddock/Interface.hs
@@ -1,4 +1,4 @@
-{-# LANGUAGE CPP, OverloadedStrings #-}
+{-# LANGUAGE CPP, OverloadedStrings, BangPatterns #-}
 -----------------------------------------------------------------------------
 -- |
 -- Module      :  Haddock.Interface
@@ -51,6 +51,7 @@ import System.Directory
 import System.FilePath
 import Text.Printf
 
+import Module (mkModuleSet, emptyModuleSet, unionModuleSet, ModuleSet)
 import Digraph
 import DynFlags hiding (verbosity)
 import Exception
@@ -59,7 +60,9 @@ import HscTypes
 import FastString (unpackFS)
 import MonadUtils (liftIO)
 import TcRnTypes (tcg_rdr_env)
-import RdrName (plusGlobalRdrEnv)
+import Name (nameIsFromExternalPackage, nameOccName)
+import OccName (isTcOcc)
+import RdrName (unQualOK, gre_name, globalRdrEnvElts)
 import ErrUtils (withTiming)
 
 #if defined(mingw32_HOST_OS)
@@ -87,7 +90,7 @@ processModules verbosity modules flags extIfaces = do
   out verbosity verbose "Creating interfaces..."
   let instIfaceMap =  Map.fromList [ (instMod iface, iface) | ext <- extIfaces
                                    , iface <- ifInstalledIfaces ext ]
-  interfaces <- createIfaces0 verbosity modules flags instIfaceMap
+  (interfaces, ms) <- createIfaces0 verbosity modules flags instIfaceMap
 
   let exportedNames =
         Set.unions $ map (Set.fromList . ifaceExports) $
@@ -96,7 +99,7 @@ processModules verbosity modules flags extIfaces = do
   out verbosity verbose "Attaching instances..."
   interfaces' <- {-# SCC attachInstances #-}
                  withTiming getDynFlags "attachInstances" (const ()) $ do
-                   attachInstances (exportedNames, mods) interfaces instIfaceMap
+                   attachInstances (exportedNames, mods) interfaces instIfaceMap ms
 
   out verbosity verbose "Building cross-linking environment..."
   -- Combine the link envs of the external packages into one
@@ -120,7 +123,7 @@ processModules verbosity modules flags extIfaces = do
 --------------------------------------------------------------------------------
 
 
-createIfaces0 :: Verbosity -> [String] -> [Flag] -> InstIfaceMap -> Ghc [Interface]
+createIfaces0 :: Verbosity -> [String] -> [Flag] -> InstIfaceMap -> Ghc ([Interface], ModuleSet)
 createIfaces0 verbosity modules flags instIfaceMap =
   -- Output dir needs to be set before calling depanal since depanal uses it to
   -- compute output file names that are stored in the DynFlags of the
@@ -150,43 +153,51 @@ createIfaces0 verbosity modules flags instIfaceMap =
       depanal [] False
 
 
-createIfaces :: Verbosity -> [Flag] -> InstIfaceMap -> ModuleGraph -> Ghc [Interface]
+createIfaces :: Verbosity -> [Flag] -> InstIfaceMap -> ModuleGraph -> Ghc ([Interface], ModuleSet)
 createIfaces verbosity flags instIfaceMap mods = do
   let sortedMods = flattenSCCs $ topSortModuleGraph False mods Nothing
   out verbosity normal "Haddock coverage:"
-  (ifaces, _) <- foldM f ([], Map.empty) sortedMods
-  return (reverse ifaces)
+  (ifaces, _, !ms) <- foldM f ([], Map.empty, emptyModuleSet) sortedMods
+  return (reverse ifaces, ms)
   where
-    f (ifaces, ifaceMap) modSummary = do
+    f (ifaces, ifaceMap, !ms) modSummary = do
       x <- {-# SCC processModule #-}
            withTiming getDynFlags "processModule" (const ()) $ do
              processModule verbosity modSummary flags ifaceMap instIfaceMap
       return $ case x of
-        Just iface -> (iface:ifaces, Map.insert (ifaceMod iface) iface ifaceMap)
-        Nothing    -> (ifaces, ifaceMap) -- Boot modules don't generate ifaces.
+        Just (iface, ms') -> ( iface:ifaces
+                             , Map.insert (ifaceMod iface) iface ifaceMap
+                             , unionModuleSet ms ms' )
+        Nothing           -> ( ifaces
+                             , ifaceMap
+                             , ms ) -- Boot modules don't generate ifaces.
 
 
-processModule :: Verbosity -> ModSummary -> [Flag] -> IfaceMap -> InstIfaceMap -> Ghc (Maybe Interface)
+processModule :: Verbosity -> ModSummary -> [Flag] -> IfaceMap -> InstIfaceMap -> Ghc (Maybe (Interface, ModuleSet))
 processModule verbosity modsum flags modMap instIfaceMap = do
   out verbosity verbose $ "Checking module " ++ moduleString (ms_mod modsum) ++ "..."
   tm <- {-# SCC "parse/typecheck/load" #-} loadModule =<< typecheckModule =<< parseModule modsum
 
-  -- We need to modify the interactive context's environment so that when
-  -- Haddock later looks for instances, it also looks in the modules it
-  -- encountered while typechecking.
-  --
-  -- See https://github.com/haskell/haddock/issues/469.
-  hsc_env@HscEnv{ hsc_IC = old_IC } <- getSession
-  let new_rdr_env = tcg_rdr_env . fst . GHC.tm_internals_ $ tm
-  setSession hsc_env{ hsc_IC = old_IC {
-    ic_rn_gbl_env = ic_rn_gbl_env old_IC `plusGlobalRdrEnv` new_rdr_env
-  } }
-
   if not $ isBootSummary modsum then do
     out verbosity verbose "Creating interface..."
     (interface, msgs) <- {-# SCC createIterface #-}
                         withTiming getDynFlags "createInterface" (const ()) $ do
                           runWriterGhc $ createInterface tm flags modMap instIfaceMap
+
+    -- We need to keep track of which modules were somehow in scope so that when
+    -- Haddock later looks for instances, it also looks in these modules too.
+    --
+    -- See https://github.com/haskell/haddock/issues/469.
+    hsc_env <- getSession
+    let new_rdr_env = tcg_rdr_env . fst . GHC.tm_internals_ $ tm
+        this_pkg = thisPackage (hsc_dflags hsc_env)
+        !mods = mkModuleSet [ nameModule name
+                            | gre <- globalRdrEnvElts new_rdr_env
+                            , let name = gre_name gre
+                            , nameIsFromExternalPackage this_pkg name
+                            , isTcOcc (nameOccName name)   -- Types and classes only
+                            , unQualOK gre ]               -- In scope unqualified
+
     liftIO $ mapM_ putStrLn (nub msgs)
     dflags <- getDynFlags
     let (haddockable, haddocked) = ifaceHaddockCoverage interface
@@ -220,7 +231,7 @@ processModule verbosity modsum flags modMap instIfaceMap = do
         unless header $ out verbosity normal "    Module header"
         mapM_ (out verbosity normal . ("    " ++)) undocumentedExports
     interface' <- liftIO $ evaluate interface
-    return (Just interface')
+    return (Just (interface', mods))
   else
     return Nothing
 
diff --git a/haddock-api/src/Haddock/Interface/AttachInstances.hs b/haddock-api/src/Haddock/Interface/AttachInstances.hs
index bf50ded3..2d72d117 100644
--- a/haddock-api/src/Haddock/Interface/AttachInstances.hs
+++ b/haddock-api/src/Haddock/Interface/AttachInstances.hs
@@ -1,4 +1,4 @@
-{-# LANGUAGE CPP, MagicHash #-}
+{-# LANGUAGE CPP, MagicHash, BangPatterns #-}
 {-# LANGUAGE TypeFamilies #-}
 -----------------------------------------------------------------------------
 -- |
@@ -34,6 +34,7 @@ import FamInstEnv
 import FastString
 import GHC
 import InstEnv
+import Module ( ModuleSet, moduleSetElts )
 import MonadUtils (liftIO)
 import Name
 import NameEnv
@@ -51,11 +52,13 @@ type Modules = Set.Set Module
 type ExportInfo = (ExportedNames, Modules)
 
 -- Also attaches fixities
-attachInstances :: ExportInfo -> [Interface] -> InstIfaceMap -> Ghc [Interface]
-attachInstances expInfo ifaces instIfaceMap = do
-  (_msgs, mb_index) <- getNameToInstancesIndex (map ifaceMod ifaces)
+attachInstances :: ExportInfo -> [Interface] -> InstIfaceMap -> ModuleSet -> Ghc [Interface]
+attachInstances expInfo ifaces instIfaceMap mods = do
+  (_msgs, mb_index) <- getNameToInstancesIndex (map ifaceMod ifaces) mods'
   mapM (attach $ fromMaybe emptyNameEnv mb_index) ifaces
   where
+    mods' = Just (moduleSetElts mods)
+
     -- TODO: take an IfaceMap as input
     ifaceMap = Map.fromList [ (ifaceMod i, i) | i <- ifaces ]
 
-- 
cgit v1.2.3


From 3902a807acf4bccf5cd01d2115bed10d57316661 Mon Sep 17 00:00:00 2001
From: Matthew Pickering <matthewtpickering@gmail.com>
Date: Tue, 21 Aug 2018 08:34:50 +0100
Subject: Load plugins when starting a GHC session (#905)

Fixes #900

(cherry picked from commit e6aa8fb47b9477cc5ef5e46097524fe83e080f6d)
---
 haddock-api/src/Haddock.hs | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

(limited to 'haddock-api')

diff --git a/haddock-api/src/Haddock.hs b/haddock-api/src/Haddock.hs
index 00eb50f6..86a65901 100644
--- a/haddock-api/src/Haddock.hs
+++ b/haddock-api/src/Haddock.hs
@@ -75,6 +75,7 @@ import Packages
 import Panic (handleGhcException)
 import Module
 import FastString
+import qualified DynamicLoading
 
 --------------------------------------------------------------------------------
 -- * Exception handling
@@ -437,7 +438,10 @@ withGhc' libDir flags ghcActs = runGhc (Just libDir) $ do
   -- that may need to be re-linked: Haddock doesn't do any
   -- dynamic or static linking at all!
   _ <- setSessionDynFlags dynflags''
-  ghcActs dynflags''
+  hscenv <- GHC.getSession
+  dynflags''' <- liftIO (DynamicLoading.initializePlugins hscenv dynflags'')
+  _ <- setSessionDynFlags dynflags'''
+  ghcActs dynflags'''
   where
 
     -- ignore sublists of flags that start with "+RTS" and end in "-RTS"
-- 
cgit v1.2.3


From fb1db8f48ec97bdb26cac129c582913870e3d1bf Mon Sep 17 00:00:00 2001
From: Alec Theriault <alec.theriault@gmail.com>
Date: Sat, 22 Sep 2018 09:41:23 -0700
Subject: Bump haddock-api-2.21.0, haddock-library-1.7.0

* Update CHANGELOGS
* Update new versions in Cabal files
* Purge references to ghc-8.4/master branches in README
---
 CHANGES.md                            | 12 ++++++++----
 README.md                             |  6 +++---
 haddock-api/haddock-api.cabal         | 12 ++++++------
 haddock-library/CHANGES.md            |  4 ++++
 haddock-library/haddock-library.cabal |  4 ++--
 haddock.cabal                         | 10 +++++-----
 6 files changed, 28 insertions(+), 20 deletions(-)

(limited to 'haddock-api')

diff --git a/CHANGES.md b/CHANGES.md
index d9ddab54..ee19ae3d 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -1,13 +1,17 @@
-## TBD / GHC-8.5+
+## Changes in version 2.21.0
 
  * Overhaul handling of data declarations in XHTML and LaTeX. Adds support for
    documenting individual arguments of constructors/patterns (#709)
 
-## Changes in version 2.20.0
+ * Actually list all fixities for `--hoogle` (#871)
+
+ * Fix broken instance source links (#869)
 
-TODO
+ * Avoiding line breaks due to ling line in the output of `--hoogle` (#868)
 
-## Changes in version 2.19.1
+ * Capture docs on type family instances (#867)
+
+## Changes in version 2.20.0
 
  * Show where instances are defined (#748)
 
diff --git a/README.md b/README.md
index 51642aab..38354996 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# Haddock, a Haskell Documentation Tool [![Build Status](https://travis-ci.org/haskell/haddock.svg?branch=master)](https://travis-ci.org/haskell/haddock)
+# Haddock, a Haskell Documentation Tool [![Build Status](https://travis-ci.org/haskell/haddock.svg?branch=ghc-8.6)](https://travis-ci.org/haskell/haddock)
 
 
 ## About haddock
@@ -57,9 +57,9 @@ and then proceed using your favourite build tool.
 #### Using [`cabal new-build`](http://cabal.readthedocs.io/en/latest/nix-local-build-overview.html)
 
 ```bash
-cabal new-build -w ghc-8.4.1
+cabal new-build -w ghc-8.6.1
 # build & run the test suite
-cabal new-test -w ghc-8.4.1 all
+cabal new-test -w ghc-8.6.1 all
 ```
 
 #### Using Cabal sandboxes
diff --git a/haddock-api/haddock-api.cabal b/haddock-api/haddock-api.cabal
index e1a52824..fa14eb50 100644
--- a/haddock-api/haddock-api.cabal
+++ b/haddock-api/haddock-api.cabal
@@ -1,13 +1,13 @@
 cabal-version:        2.0
 name:                 haddock-api
-version:              2.20.0
+version:              2.21.0
 synopsis:             A documentation-generation tool for Haskell libraries
 description:          Haddock is a documentation-generation tool for Haskell
                       libraries
 license:              BSD3
 license-file:         LICENSE
 author:               Simon Marlow, David Waern
-maintainer:           Alex Biehl <alexbiehl@gmail.com>, Simon Hengel <sol@typeful.net>, Mateusz Kowalczyk <fuuzetsu@fuuzetsu.co.uk>
+maintainer:           Alec Theriault <alec.theriault@gmail.com>, Alex Biehl <alexbiehl@gmail.com>, Simon Hengel <sol@typeful.net>, Mateusz Kowalczyk <fuuzetsu@fuuzetsu.co.uk>
 homepage:             http://www.haskell.org/haddock/
 bug-reports:          https://github.com/haskell/haddock/issues
 copyright:            (c) Simon Marlow, David Waern
@@ -41,10 +41,10 @@ library
 
   -- this package typically supports only single major versions
   build-depends: base            ^>= 4.12.0
-               , Cabal           ^>= 2.3.0
+               , Cabal           ^>= 2.4.0
                , ghc             ^>= 8.6
                , ghc-paths       ^>= 0.1.0.9
-               , haddock-library ^>= 1.6.0
+               , haddock-library ^>= 1.7.0
                , xhtml           ^>= 3000.2.2
 
   -- Versions for the dependencies below are transitively pinned by
@@ -166,10 +166,10 @@ test-suite spec
     Haddock.Backends.Hyperlinker.Parser
     Haddock.Backends.Hyperlinker.Types
 
-  build-depends: Cabal           ^>= 2.3
+  build-depends: Cabal           ^>= 2.4
                , ghc             ^>= 8.6
                , ghc-paths       ^>= 0.1.0.9
-               , haddock-library ^>= 1.6.0
+               , haddock-library ^>= 1.7.0
                , xhtml           ^>= 3000.2.2
                , hspec           >= 2.4.4 && < 2.6
                , QuickCheck      ^>= 2.11
diff --git a/haddock-library/CHANGES.md b/haddock-library/CHANGES.md
index e41b8087..ec30a4d3 100644
--- a/haddock-library/CHANGES.md
+++ b/haddock-library/CHANGES.md
@@ -1,3 +1,7 @@
+## Changes in version 1.7.0
+
+ * Replace `attoparsec` with `parsec` (#799)
+
 ## Changes in version 1.6.0
 
  * `MetaDoc` stores package name for since annotations
diff --git a/haddock-library/haddock-library.cabal b/haddock-library/haddock-library.cabal
index 1fc3f772..820a36ad 100644
--- a/haddock-library/haddock-library.cabal
+++ b/haddock-library/haddock-library.cabal
@@ -1,6 +1,6 @@
 cabal-version:        2.0
 name:                 haddock-library
-version:              1.6.0
+version:              1.7.0
 synopsis:             Library exposing some functionality of Haddock.
 description:          Haddock is a documentation-generation tool for Haskell
                       libraries. These modules expose some functionality of it
@@ -10,7 +10,7 @@ description:          Haddock is a documentation-generation tool for Haskell
                       itself, see the ‘haddock’ package.
 license:              BSD3
 license-files:        LICENSE
-maintainer:           Alex Biehl <alexbiehl@gmail.com>, Simon Hengel <sol@typeful.net>, Mateusz Kowalczyk <fuuzetsu@fuuzetsu.co.uk>
+maintainer:           Alec Theriault <alec.theriault@gmail.com>, Alex Biehl <alexbiehl@gmail.com>, Simon Hengel <sol@typeful.net>, Mateusz Kowalczyk <fuuzetsu@fuuzetsu.co.uk>
 homepage:             http://www.haskell.org/haddock/
 bug-reports:          https://github.com/haskell/haddock/issues
 category:             Documentation
diff --git a/haddock.cabal b/haddock.cabal
index 29d3d114..1c84562d 100644
--- a/haddock.cabal
+++ b/haddock.cabal
@@ -1,6 +1,6 @@
 cabal-version:        2.0
 name:                 haddock
-version:              2.20.0
+version:              2.21.0
 synopsis:             A documentation-generation tool for Haskell libraries
 description:
   This is Haddock, a tool for automatically generating documentation
@@ -23,17 +23,17 @@ description:
   without any documentation annotations, Haddock can generate useful documentation
   from your source code.
   .
-  <<https://cdn.rawgit.com/haskell/haddock/master/doc/cheatsheet/haddocks.svg>>
+  <<https://cdn.rawgit.com/haskell/haddock/ghc-8.6/doc/cheatsheet/haddocks.svg>>
 license:              BSD3
 license-file:         LICENSE
 author:               Simon Marlow, David Waern
-maintainer:           Alex Biehl <alexbiehl@gmail.com>, Simon Hengel <sol@typeful.net>, Mateusz Kowalczyk <fuuzetsu@fuuzetsu.co.uk>
+maintainer:           Alec Theriault <alec.theriault@gmail.com>, Alex Biehl <alexbiehl@gmail.com>, Simon Hengel <sol@typeful.net>, Mateusz Kowalczyk <fuuzetsu@fuuzetsu.co.uk>
 homepage:             http://www.haskell.org/haddock/
 bug-reports:          https://github.com/haskell/haddock/issues
 copyright:            (c) Simon Marlow, David Waern
 category:             Documentation
 build-type:           Simple
-tested-with:          GHC==8.4.*
+tested-with:          GHC==8.6.*
 
 extra-source-files:
   CHANGES.md
@@ -142,7 +142,7 @@ executable haddock
   else
     -- in order for haddock's advertised version number to have proper meaning,
     -- we pin down to a single haddock-api version.
-    build-depends:  haddock-api == 2.20.0
+    build-depends:  haddock-api == 2.21.0
 
 test-suite html-test
   type:             exitcode-stdio-1.0
-- 
cgit v1.2.3


From 246905efb043ca1aec041defe77b2cfa2cbcda92 Mon Sep 17 00:00:00 2001
From: Alec Theriault <alec.theriault@gmail.com>
Date: Sat, 22 Sep 2018 10:53:31 -0700
Subject: Turn haddock-library into a minor release

Fix some version bounds in haddock-library too.
---
 haddock-api/haddock-api.cabal         | 4 ++--
 haddock-library/CHANGES.md            | 2 +-
 haddock-library/haddock-library.cabal | 7 ++++---
 3 files changed, 7 insertions(+), 6 deletions(-)

(limited to 'haddock-api')

diff --git a/haddock-api/haddock-api.cabal b/haddock-api/haddock-api.cabal
index fa14eb50..384b5794 100644
--- a/haddock-api/haddock-api.cabal
+++ b/haddock-api/haddock-api.cabal
@@ -44,7 +44,7 @@ library
                , Cabal           ^>= 2.4.0
                , ghc             ^>= 8.6
                , ghc-paths       ^>= 0.1.0.9
-               , haddock-library ^>= 1.7.0
+               , haddock-library ^>= 1.6.1
                , xhtml           ^>= 3000.2.2
 
   -- Versions for the dependencies below are transitively pinned by
@@ -169,7 +169,7 @@ test-suite spec
   build-depends: Cabal           ^>= 2.4
                , ghc             ^>= 8.6
                , ghc-paths       ^>= 0.1.0.9
-               , haddock-library ^>= 1.7.0
+               , haddock-library ^>= 1.6.1
                , xhtml           ^>= 3000.2.2
                , hspec           >= 2.4.4 && < 2.6
                , QuickCheck      ^>= 2.11
diff --git a/haddock-library/CHANGES.md b/haddock-library/CHANGES.md
index ec30a4d3..c62edd85 100644
--- a/haddock-library/CHANGES.md
+++ b/haddock-library/CHANGES.md
@@ -1,4 +1,4 @@
-## Changes in version 1.7.0
+## Changes in version 1.6.1
 
  * Replace `attoparsec` with `parsec` (#799)
 
diff --git a/haddock-library/haddock-library.cabal b/haddock-library/haddock-library.cabal
index 820a36ad..195d409e 100644
--- a/haddock-library/haddock-library.cabal
+++ b/haddock-library/haddock-library.cabal
@@ -1,6 +1,6 @@
 cabal-version:        2.0
 name:                 haddock-library
-version:              1.7.0
+version:              1.6.1
 synopsis:             Library exposing some functionality of Haddock.
 description:          Haddock is a documentation-generation tool for Haskell
                       libraries. These modules expose some functionality of it
@@ -71,7 +71,7 @@ test-suite spec
       Documentation.Haddock.Utf8Spec
 
   build-depends:
-      base         >= 4.5     && < 4.12
+      base         >= 4.5     && < 4.13
     , base-compat  >= 0.9.3   && < 0.11
     , bytestring   >= 0.9.2.1 && < 0.11
     , containers   >= 0.4.2.1 && < 0.7
@@ -91,8 +91,9 @@ test-suite fixtures
   main-is:          Fixtures.hs
   ghc-options:      -Wall -O0
   hs-source-dirs:   fixtures
+  buildable:        False
   build-depends:
-      base         >= 4.5     && < 4.12
+      base         >= 4.5     && < 4.13
     , base-compat  >= 0.9.3   && < 0.11
     , directory             ^>= 1.3.0.2
     , filepath              ^>= 1.4.1.2
-- 
cgit v1.2.3


From 44169f4b1907e34fdf8ff84cf8b7509b1dfcaf55 Mon Sep 17 00:00:00 2001
From: Alec Theriault <alec.theriault@gmail.com>
Date: Tue, 16 Oct 2018 10:54:21 -0700
Subject: Bump haddock-library to 1.7.0

The 1.6.1 release should've been a major bump, since types in
the `Documentation.Haddock.Parser.Monad` module changed. This version
makes that module internal (as it morally should be).
---
 haddock-api/haddock-api.cabal         | 4 ++--
 haddock-library/CHANGES.md            | 4 ++++
 haddock-library/haddock-library.cabal | 6 +++---
 3 files changed, 9 insertions(+), 5 deletions(-)

(limited to 'haddock-api')

diff --git a/haddock-api/haddock-api.cabal b/haddock-api/haddock-api.cabal
index 384b5794..fa14eb50 100644
--- a/haddock-api/haddock-api.cabal
+++ b/haddock-api/haddock-api.cabal
@@ -44,7 +44,7 @@ library
                , Cabal           ^>= 2.4.0
                , ghc             ^>= 8.6
                , ghc-paths       ^>= 0.1.0.9
-               , haddock-library ^>= 1.6.1
+               , haddock-library ^>= 1.7.0
                , xhtml           ^>= 3000.2.2
 
   -- Versions for the dependencies below are transitively pinned by
@@ -169,7 +169,7 @@ test-suite spec
   build-depends: Cabal           ^>= 2.4
                , ghc             ^>= 8.6
                , ghc-paths       ^>= 0.1.0.9
-               , haddock-library ^>= 1.6.1
+               , haddock-library ^>= 1.7.0
                , xhtml           ^>= 3000.2.2
                , hspec           >= 2.4.4 && < 2.6
                , QuickCheck      ^>= 2.11
diff --git a/haddock-library/CHANGES.md b/haddock-library/CHANGES.md
index c62edd85..0175b6af 100644
--- a/haddock-library/CHANGES.md
+++ b/haddock-library/CHANGES.md
@@ -1,3 +1,7 @@
+## Changes in version 1.7.0
+
+ * Make `Documentation.Haddock.Parser.Monad` an internal module
+
 ## Changes in version 1.6.1
 
  * Replace `attoparsec` with `parsec` (#799)
diff --git a/haddock-library/haddock-library.cabal b/haddock-library/haddock-library.cabal
index 74c928b2..0b4405b9 100644
--- a/haddock-library/haddock-library.cabal
+++ b/haddock-library/haddock-library.cabal
@@ -1,6 +1,6 @@
 cabal-version:        2.0
 name:                 haddock-library
-version:              1.6.1
+version:              1.7.0
 synopsis:             Library exposing some functionality of Haddock.
 description:          Haddock is a documentation-generation tool for Haskell
                       libraries. These modules expose some functionality of it
@@ -35,14 +35,14 @@ library
     Documentation.Haddock.Doc
     Documentation.Haddock.Markup
     Documentation.Haddock.Parser
-    Documentation.Haddock.Parser.Monad
     Documentation.Haddock.Types
     Documentation.Haddock.Utf8
 
   other-modules:
     Documentation.Haddock.Parser.Util
+    Documentation.Haddock.Parser.Monad
 
-  ghc-options: -funbox-strict-fields -Wall -fwarn-tabs -O2
+  ghc-options: -funbox-strict-fields -Wall -fwarn-tabs
   if impl(ghc >= 8.0)
     ghc-options: -Wcompat -Wnoncanonical-monad-instances -Wnoncanonical-monadfail-instances
 
-- 
cgit v1.2.3