-pname id = text id
-
-pqname ("",id) = pname id
-pqname (m,id) = pname m <> char '.' <> pname id
+pname = text
+
+pqname (m,v) = pmname m <> pname v
+
+-- be sure to print the '.' here so we don't print out
+-- ".foo" for unqualified foo...
+pmname Nothing = empty
+pmname (Just m) = panmname m <> char '.'
+
+panmname (M (pkgName, parents, name)) =
+ let parentStrs = map pname parents in
+ pname pkgName <> char ':' <>
+ -- This is to be sure to not print out:
+ -- main:.Main for when there's a single module name
+ -- with no parents.
+ (case parentStrs of
+ [] -> empty
+ _ -> hcat (punctuate hierModuleSeparator
+ (map pname parents))
+ <> hierModuleSeparator)
+ <> pname name
+
+-- note that this is not a '.' but a Z-encoded '.':
+-- GHCziIOBase.IO, not GHC.IOBase.IO.
+-- What a pain.
+hierModuleSeparator = text (zEncodeString ".")