Commit 547c5971 authored by Simon Peyton Jones's avatar Simon Peyton Jones

Reduce module qualifiers in pretty-printing

The change is in HscTypes.mkPrintUnqualified, and suppresses the
module qualifier on Names from ghc-prim, base, and template-haskell,
where no ambiguity can aries.  It's somewhat arbitrary, but helps
with things like 'Constraint' which are often not in scope, but
occasionally show up in error messages.
parent 9f0f99fd
......@@ -534,8 +534,8 @@ pprModulePrefix sty mod occ = sdocWithDynFlags $ \dflags ->
NameQual modname -> ppr modname <> dot -- Name is in scope
NameNotInScope1 -> ppr mod <> dot -- Not in scope
NameNotInScope2 -> ppr (modulePackageKey mod) <> colon -- Module not in
<> ppr (moduleName mod) <> dot -- scope either
_otherwise -> empty
<> ppr (moduleName mod) <> dot -- scope either
NameUnqual -> empty -- In scope unqualified
ppr_underscore_unique :: Unique -> SDoc
-- Print an underscore separating the name from its unique
......
......@@ -1524,11 +1524,26 @@ mkPrintUnqualified dflags env = QueryQualify qual_name
(mkQualPackage dflags)
where
qual_name mod occ
| [] <- unqual_gres
, modulePackageKey mod `elem` [primPackageKey, basePackageKey, thPackageKey]
, not (isDerivedOccName occ)
= NameUnqual -- For names from ubiquitous packages that come with GHC, if
-- there are no entities called unqualified 'occ', then
-- print unqualified. Doing so does not cause ambiguity,
-- and it reduces the amount of qualification in error
-- messages. We can't do this for all packages, because we
-- might get errors like "Can't unify T with T". But the
-- ubiquitous packages don't contain any such gratuitous
-- name clashes.
--
-- A motivating example is 'Constraint'. It's often not in
-- scope, but printing GHC.Prim.Constraint seems overkill.
| [gre] <- unqual_gres
, right_name gre
= NameUnqual
-- If there's a unique entity that's in scope unqualified with 'occ'
-- AND that entity is the right one, then we can use the unqualified name
= NameUnqual -- If there's a unique entity that's in scope
-- unqualified with 'occ' AND that entity is
-- the right one, then we can use the unqualified name
| [gre] <- qual_gres
= NameQual (get_qual_mod (gre_prov gre))
......
......@@ -173,15 +173,17 @@ type QueryQualifyModule = Module -> Bool
type QueryQualifyPackage = PackageKey -> Bool
-- See Note [Printing original names] in HscTypes
data QualifyName -- given P:M.T
= NameUnqual -- refer to it as "T"
| NameQual ModuleName -- refer to it as "X.T" for the supplied X
| NameNotInScope1
-- it is not in scope at all, but M.T is not bound in the current
-- scope, so we can refer to it as "M.T"
| NameNotInScope2
-- it is not in scope at all, and M.T is already bound in the
-- current scope, so we must refer to it as "P:M.T"
data QualifyName -- Given P:M.T
= NameUnqual -- It's in scope unqualified as "T"
-- OR nothing called "T" is in scope
| NameQual ModuleName -- It's in scope qualified as "X.T"
| NameNotInScope1 -- It's not in scope at all, but M.T is not bound
-- in the current scope, so we can refer to it as "M.T"
| NameNotInScope2 -- It's not in scope at all, and M.T is already bound in
-- the current scope, so we must refer to it as "P:M.T"
reallyAlwaysQualifyNames :: QueryQualifyName
reallyAlwaysQualifyNames _ _ = NameNotInScope2
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment