aboutsummaryrefslogtreecommitdiff
path: root/src/Haddock/Interface
diff options
context:
space:
mode:
authorDavid Waern <david.waern@gmail.com>2008-02-09 22:33:24 +0000
committerDavid Waern <david.waern@gmail.com>2008-02-09 22:33:24 +0000
commit953a67e86fedb849eed06154fb59de2091bb148f (patch)
tree49ad6da30d4062f6e52d46737f153af7fe2262b0 /src/Haddock/Interface
parent95352ca3832192a94697988c5979e258dc85003a (diff)
Change the representation of DocNames
Ross Paterson reported a bug where links would point to the defining module instead of the "best" module for an identifier (e.g Int pointing to GHC.Base instead of Data.Int). This patch fixes this problem by refactoring the way renamed names are represented. Instead of representing them by: > data DocName = Link Name | NoLink Name they are now represented as such: > data DocName = Documented Name Module | Undocumented Name and the the link-env looks like this: > type LinkEnv = Map Name Module There are several reasons for this. First of all, the bug was caused by changing the module part of Names during the renaming process, without changing the Unique field. This caused names to be overwritten during the loading of .haddock files (which caches names using the NameCache of the GHC session). So we might create new Uniques during renaming to fix this (but I'm not sure that would be problem-free). Instead, we just keep the Name and add the Module where the name is best documented, since it can be useful to keep the original Name around (for e.g. source-code location info and for users of the Haddock API). Also, the names Link/NoLink don't really make sense, since wether to use links or not is entirely up to the users of DocName. In the process of following this change into H.Backends.Html I removed the assumption that binder names are Undocumented (which was just an unnecessary assumption, the OccName is the only thing needed to render these). This will probably make it possible to get rid of the renamer and replace it with a traversal from SYB or Uniplate. Since DocName has changed, InterfaceFile has changed so this patch also increments the file-format version. No backwards-compatibility is implemented.
Diffstat (limited to 'src/Haddock/Interface')
-rw-r--r--src/Haddock/Interface/AttachInstances.hs2
-rw-r--r--src/Haddock/Interface/Rename.hs13
2 files changed, 8 insertions, 7 deletions
diff --git a/src/Haddock/Interface/AttachInstances.hs b/src/Haddock/Interface/AttachInstances.hs
index d43213c8..e3acc6cf 100644
--- a/src/Haddock/Interface/AttachInstances.hs
+++ b/src/Haddock/Interface/AttachInstances.hs
@@ -133,7 +133,7 @@ toHsType t = case t of
TyConApp tc ts -> case ts of
t1:t2:rest
- | isNameConSym . tyConName $ tc ->
+ | isSymOcc . nameOccName . tyConName $ tc ->
app (HsOpTy (toLHsType t1) (noLoc . tyConName $ tc) (toLHsType t2)) rest
_ -> app (tycon tc) ts
diff --git a/src/Haddock/Interface/Rename.hs b/src/Haddock/Interface/Rename.hs
index 947c3b29..11a0a14c 100644
--- a/src/Haddock/Interface/Rename.hs
+++ b/src/Haddock/Interface/Rename.hs
@@ -8,6 +8,7 @@
module Haddock.Interface.Rename (renameInterface) where
+import Haddock.DocName
import Haddock.Types
import Haddock.GHC.Utils
@@ -35,7 +36,7 @@ renameInterface renamingEnv mod =
-- is mapped to itself, and everything else comes from the global renaming
-- env
let localEnv = foldl fn renamingEnv (ifaceVisibleExports mod)
- where fn env name = Map.insert name (nameSetMod name (ifaceMod mod)) env
+ where fn env name = Map.insert name (ifaceMod mod) env
docs = Map.toList (ifaceDocMap mod)
renameMapElem (k,d) = do d' <- renameDoc d; return (k, d')
@@ -119,8 +120,8 @@ runRnFM :: LinkEnv -> RnM a -> (a,[Name])
runRnFM env rn = unRn rn lkp
where
lkp n = case Map.lookup n env of
- Nothing -> (False, NoLink n)
- Just q -> (True, Link q)
+ Nothing -> (False, Undocumented n)
+ Just mod -> (True, Documented n mod)
--------------------------------------------------------------------------------
@@ -128,8 +129,8 @@ runRnFM env rn = unRn rn lkp
--------------------------------------------------------------------------------
-keep n = NoLink n
-keepL (L loc n) = L loc (NoLink n)
+keep n = Undocumented n
+keepL (L loc n) = L loc (Undocumented n)
rename = lookupRn id
@@ -162,7 +163,7 @@ renameDoc doc = case doc of
lkp <- getLookupRn
case [ n | (True, n) <- map lkp ids ] of
ids'@(_:_) -> return (DocIdentifier ids')
- [] -> return (DocIdentifier (map NoLink ids))
+ [] -> return (DocIdentifier (map Undocumented ids))
DocModule str -> return (DocModule str)
DocEmphasis doc -> do
doc' <- renameDoc doc