[commit: ghc] master: Report all possible results from related name spaces (ae41a50)
git at git.haskell.org
git at git.haskell.org
Fri Jun 6 11:18:00 UTC 2014
Repository : ssh://git@git.haskell.org/ghc
On branch : master
Link : http://ghc.haskell.org/trac/ghc/changeset/ae41a50f0378c00351df5414b35026fc4bce2b44/ghc
>---------------------------------------------------------------
commit ae41a50f0378c00351df5414b35026fc4bce2b44
Author: Joachim Breitner <mail at joachim-breitner.de>
Date: Fri Jun 6 12:11:48 2014 +0200
Report all possible results from related name spaces
instead of just one matching directly. This is an alternative way to fix
ticket #9177.
>---------------------------------------------------------------
ae41a50f0378c00351df5414b35026fc4bce2b44
compiler/basicTypes/OccName.lhs | 24 +++++++-----------------
compiler/rename/RnEnv.lhs | 14 +++++++++-----
2 files changed, 16 insertions(+), 22 deletions(-)
diff --git a/compiler/basicTypes/OccName.lhs b/compiler/basicTypes/OccName.lhs
index b1fd831..28aeff8 100644
--- a/compiler/basicTypes/OccName.lhs
+++ b/compiler/basicTypes/OccName.lhs
@@ -33,6 +33,8 @@ module OccName (
-- * The 'NameSpace' type
NameSpace, -- Abstract
+ nameSpacesRelated,
+
-- ** Construction
-- $real_vs_source_data_constructors
tcName, clsName, tcClsName, dataName, varName,
@@ -83,8 +85,6 @@ module OccName (
isTcClsNameSpace, isTvNameSpace, isDataConNameSpace, isVarNameSpace, isValNameSpace,
- toRelatedNameSpace,
-
-- * The 'OccEnv' type
OccEnv, emptyOccEnv, unitOccEnv, extendOccEnv, mapOccEnv,
lookupOccEnv, mkOccEnv, mkOccEnv_C, extendOccEnvList, elemOccEnv,
@@ -372,21 +372,10 @@ demoteOccName (OccName space name) = do
space' <- demoteNameSpace space
return $ OccName space' name
--- What would this name be if used in the related name space
--- (variables <-> data construtors, type variables <-> type constructors)
-toRelatedNameSpace :: OccName -> Maybe OccName
-toRelatedNameSpace (OccName space name) = OccName (otherNameSpace space) `fmap` name'
- where
- name' | name == fsLit "[]" = Nothing -- Some special cases first
- | name == fsLit "->" = Nothing
- | hd == '(' = Nothing
- | hd == ':' = Just tl
- | startsVarSym hd = Just (':' `consFS` name)
- | isUpper hd = Just (toLower hd `consFS` tl)
- | isLower hd = Just (toUpper hd `consFS` tl)
- | otherwise = pprTrace "toRelatedNameSpace" (ppr name)
- Nothing
- (hd,tl) = (headFS name, tailFS name)
+-- Name spaces are related if there is a chance to mean the one when one writes
+-- the other, i.e. variables <-> data construtors and type variables <-> type constructors
+nameSpacesRelated :: NameSpace -> NameSpace -> Bool
+nameSpacesRelated ns1 ns2 = ns1 == ns2 || otherNameSpace ns1 == ns2
otherNameSpace :: NameSpace -> NameSpace
otherNameSpace VarName = DataName
@@ -395,6 +384,7 @@ otherNameSpace TvName = TcClsName
otherNameSpace TcClsName = TvName
+
{- | Other names in the compiler add aditional information to an OccName.
This class provides a consistent way to access the underlying OccName. -}
class HasOccName name where
diff --git a/compiler/rename/RnEnv.lhs b/compiler/rename/RnEnv.lhs
index d0c51d3..f333a23 100644
--- a/compiler/rename/RnEnv.lhs
+++ b/compiler/rename/RnEnv.lhs
@@ -1452,7 +1452,7 @@ unknownNameSuggestErr where_look tried_rdr_name
all_possibilities
= [ (showPpr dflags r, (r, Left loc))
| (r,loc) <- local_possibilities local_env ]
- ++ [ (showPpr dflags r, rp) | (r,rp) <- global_possibilities global_env ]
+ ++ [ (showPpr dflags r, rp) | (r, rp) <- global_possibilities global_env ]
suggest = fuzzyLookup (showPpr dflags tried_rdr_name) all_possibilities
perhaps = ptext (sLit "Perhaps you meant")
@@ -1464,21 +1464,25 @@ unknownNameSuggestErr where_look tried_rdr_name
; return extra_err }
where
pp_item :: (RdrName, HowInScope) -> SDoc
- pp_item (rdr, Left loc) = quotes (ppr rdr) <+> loc' -- Locally defined
+ pp_item (rdr, Left loc) = pp_ns rdr <+> quotes (ppr rdr) <+> loc' -- Locally defined
where loc' = case loc of
UnhelpfulSpan l -> parens (ppr l)
RealSrcSpan l -> parens (ptext (sLit "line") <+> int (srcSpanStartLine l))
- pp_item (rdr, Right is) = quotes (ppr rdr) <+> -- Imported
+ pp_item (rdr, Right is) = pp_ns rdr <+> quotes (ppr rdr) <+> -- Imported
parens (ptext (sLit "imported from") <+> ppr (is_mod is))
+ pp_ns :: RdrName -> SDoc
+ pp_ns rdr | ns /= tried_ns = pprNameSpace ns
+ | otherwise = empty
+ where ns = rdrNameSpace rdr
+
tried_occ = rdrNameOcc tried_rdr_name
tried_is_sym = isSymOcc tried_occ
tried_ns = occNameSpace tried_occ
tried_is_qual = isQual tried_rdr_name
- correct_name_space occ = occNameSpace occ == tried_ns
+ correct_name_space occ = nameSpacesRelated (occNameSpace occ) tried_ns
&& isSymOcc occ == tried_is_sym
- || toRelatedNameSpace occ == Just tried_occ
-- Treat operator and non-operators as non-matching
-- This heuristic avoids things like
-- Not in scope 'f'; perhaps you meant '+' (from Prelude)
More information about the ghc-commits
mailing list