summaryrefslogtreecommitdiff
path: root/compiler/GHC/Rename/Env.hs
diff options
context:
space:
mode:
Diffstat (limited to 'compiler/GHC/Rename/Env.hs')
-rw-r--r--compiler/GHC/Rename/Env.hs96
1 files changed, 73 insertions, 23 deletions
diff --git a/compiler/GHC/Rename/Env.hs b/compiler/GHC/Rename/Env.hs
index 090810512f..957b118b88 100644
--- a/compiler/GHC/Rename/Env.hs
+++ b/compiler/GHC/Rename/Env.hs
@@ -13,8 +13,11 @@ module GHC.Rename.Env (
newTopSrcBinder,
lookupLocatedTopBndrRn, lookupLocatedTopBndrRnN, lookupTopBndrRn,
+ lookupLocatedTopConstructorRn, lookupLocatedTopConstructorRnN,
- lookupLocatedOccRn, lookupOccRn, lookupOccRn_maybe,
+ lookupLocatedOccRn, lookupLocatedOccRnConstr, lookupLocatedOccRnRecField,
+ lookupLocatedOccRnNone,
+ lookupOccRn, lookupOccRn_maybe,
lookupLocalOccRn_maybe, lookupInfoOccRn,
lookupLocalOccThLvl_maybe, lookupLocalOccRn,
lookupTypeOccRn,
@@ -250,7 +253,7 @@ terribly efficient, but there seems to be no better way.
-- Can be made to not be exposed
-- Only used unwrapped in rnAnnProvenance
-lookupTopBndrRn :: RdrName -> RnM Name
+lookupTopBndrRn :: WhatLooking -> RdrName -> RnM Name
-- Look up a top-level source-code binder. We may be looking up an unqualified 'f',
-- and there may be several imported 'f's too, which must not confuse us.
-- For example, this is OK:
@@ -261,7 +264,7 @@ lookupTopBndrRn :: RdrName -> RnM Name
--
-- A separate function (importsFromLocalDecls) reports duplicate top level
-- decls, so here it's safe just to choose an arbitrary one.
-lookupTopBndrRn rdr_name =
+lookupTopBndrRn which_suggest rdr_name =
lookupExactOrOrig rdr_name id $
do { -- Check for operators in type or class declarations
-- See Note [Type and class operator definitions]
@@ -275,14 +278,20 @@ lookupTopBndrRn rdr_name =
[gre] -> return (greMangledName gre)
_ -> do -- Ambiguous (can't happen) or unbound
traceRn "lookupTopBndrRN fail" (ppr rdr_name)
- unboundName WL_LocalTop rdr_name
+ unboundName (LF which_suggest WL_LocalTop) rdr_name
}
+lookupLocatedTopConstructorRn :: Located RdrName -> RnM (Located Name)
+lookupLocatedTopConstructorRn = wrapLocM (lookupTopBndrRn WL_Constructor)
+
+lookupLocatedTopConstructorRnN :: LocatedN RdrName -> RnM (LocatedN Name)
+lookupLocatedTopConstructorRnN = wrapLocMA (lookupTopBndrRn WL_Constructor)
+
lookupLocatedTopBndrRn :: Located RdrName -> RnM (Located Name)
-lookupLocatedTopBndrRn = wrapLocM lookupTopBndrRn
+lookupLocatedTopBndrRn = wrapLocM (lookupTopBndrRn WL_Anything)
lookupLocatedTopBndrRnN :: LocatedN RdrName -> RnM (LocatedN Name)
-lookupLocatedTopBndrRnN = wrapLocMA lookupTopBndrRn
+lookupLocatedTopBndrRnN = wrapLocMA (lookupTopBndrRn WL_Anything)
-- | Lookup an @Exact@ @RdrName@. See Note [Looking up Exact RdrNames].
-- This never adds an error, but it may return one, see
@@ -393,7 +402,7 @@ lookupFamInstName :: Maybe Name -> LocatedN RdrName
lookupFamInstName (Just cls) tc_rdr -- Associated type; c.f GHC.Rename.Bind.rnMethodBind
= wrapLocMA (lookupInstDeclBndr cls (text "associated type")) tc_rdr
lookupFamInstName Nothing tc_rdr -- Family instance; tc_rdr is an *occurrence*
- = lookupLocatedOccRn tc_rdr
+ = lookupLocatedOccRnConstr tc_rdr
-----------------------------------------------
lookupConstructorFields :: Name -> RnM [FieldLabel]
@@ -550,7 +559,8 @@ lookupRecFieldOcc_update dup_fields_ok rdr_name = do
Nothing -> unbound
| otherwise -> unbound
where
- unbound = UnambiguousGre . NormalGreName <$> unboundName WL_Global rdr_name
+ unbound = UnambiguousGre . NormalGreName
+ <$> unboundName (LF WL_RecField WL_Global) rdr_name
{- Note [DisambiguateRecordFields]
@@ -991,6 +1001,18 @@ lookupLocatedOccRn :: GenLocated (SrcSpanAnn' ann) RdrName
-> TcRn (GenLocated (SrcSpanAnn' ann) Name)
lookupLocatedOccRn = wrapLocMA lookupOccRn
+lookupLocatedOccRnConstr :: GenLocated (SrcSpanAnn' ann) RdrName
+ -> TcRn (GenLocated (SrcSpanAnn' ann) Name)
+lookupLocatedOccRnConstr = wrapLocMA lookupOccRnConstr
+
+lookupLocatedOccRnRecField :: GenLocated (SrcSpanAnn' ann) RdrName
+ -> TcRn (GenLocated (SrcSpanAnn' ann) Name)
+lookupLocatedOccRnRecField = wrapLocMA lookupOccRnRecField
+
+lookupLocatedOccRnNone :: GenLocated (SrcSpanAnn' ann) RdrName
+ -> TcRn (GenLocated (SrcSpanAnn' ann) Name)
+lookupLocatedOccRnNone = wrapLocMA lookupOccRnNone
+
lookupLocalOccRn_maybe :: RdrName -> RnM (Maybe Name)
-- Just look in the local environment
lookupLocalOccRn_maybe rdr_name
@@ -1003,13 +1025,34 @@ lookupLocalOccThLvl_maybe name
= do { lcl_env <- getLclEnv
; return (lookupNameEnv (tcl_th_bndrs lcl_env) name) }
--- lookupOccRn looks up an occurrence of a RdrName
-lookupOccRn :: RdrName -> RnM Name
-lookupOccRn rdr_name
+-- lookupOccRn' looks up an occurrence of a RdrName, and uses its argument to
+-- determine what kind of suggestions should be displayed if it is not in scope
+lookupOccRn' :: WhatLooking -> RdrName -> RnM Name
+lookupOccRn' which_suggest rdr_name
= do { mb_name <- lookupOccRn_maybe rdr_name
; case mb_name of
Just name -> return name
- Nothing -> reportUnboundName rdr_name }
+ Nothing -> reportUnboundName' which_suggest rdr_name }
+
+-- lookupOccRn looks up an occurrence of a RdrName and displays suggestions if
+-- it is not in scope
+lookupOccRn :: RdrName -> RnM Name
+lookupOccRn = lookupOccRn' WL_Anything
+
+-- lookupOccRnConstr looks up an occurrence of a RdrName and displays
+-- constructors and pattern synonyms as suggestions if it is not in scope
+lookupOccRnConstr :: RdrName -> RnM Name
+lookupOccRnConstr = lookupOccRn' WL_Constructor
+
+-- lookupOccRnRecField looks up an occurrence of a RdrName and displays
+-- record fields as suggestions if it is not in scope
+lookupOccRnRecField :: RdrName -> RnM Name
+lookupOccRnRecField = lookupOccRn' WL_RecField
+
+-- lookupOccRnRecField looks up an occurrence of a RdrName and displays
+-- no suggestions if it is not in scope
+lookupOccRnNone :: RdrName -> RnM Name
+lookupOccRnNone = lookupOccRn' WL_None
-- Only used in one place, to rename pattern synonym binders.
-- See Note [Renaming pattern synonym variables] in GHC.Rename.Bind
@@ -1018,7 +1061,7 @@ lookupLocalOccRn rdr_name
= do { mb_name <- lookupLocalOccRn_maybe rdr_name
; case mb_name of
Just name -> return name
- Nothing -> unboundName WL_LocalOnly rdr_name }
+ Nothing -> unboundName (LF WL_Anything WL_LocalOnly) rdr_name }
-- lookupTypeOccRn looks up an optionally promoted RdrName.
-- Used for looking up type variables.
@@ -1043,7 +1086,7 @@ lookup_demoted rdr_name
; if data_kinds
then do { mb_demoted_name <- lookupOccRn_maybe demoted_rdr
; case mb_demoted_name of
- Nothing -> unboundNameX WL_Any rdr_name star_info
+ Nothing -> unboundNameX looking_for rdr_name star_info
Just demoted_name ->
do { addDiagnostic
(WarningWithFlag Opt_WarnUntickedPromotedConstructors)
@@ -1057,12 +1100,13 @@ lookup_demoted rdr_name
lookupOccRn_maybe demoted_rdr
; let suggestion | isJust mb_demoted_name = suggest_dk
| otherwise = star_info
- ; unboundNameX WL_Any rdr_name suggestion } }
+ ; unboundNameX looking_for rdr_name suggestion } }
| otherwise
- = reportUnboundName rdr_name
+ = reportUnboundName' (lf_which looking_for) rdr_name
where
+ looking_for = LF WL_Constructor WL_Anywhere
suggest_dk = text "A data constructor of that name is in scope; did you mean DataKinds?"
untickedPromConstrWarn name =
text "Unticked promoted constructor" <> colon <+> quotes (ppr name) <> dot
@@ -1208,7 +1252,11 @@ lookupGlobalOccRn' fos rdr_name =
case mn of
Just n -> return n
Nothing -> do { traceRn "lookupGlobalOccRn" (ppr rdr_name)
- ; unboundName WL_Global rdr_name }
+ ; unboundName (LF which_suggest WL_Global) rdr_name }
+ where which_suggest = case fos of
+ WantNormal -> WL_Anything
+ WantBoth -> WL_RecField
+ WantField -> WL_RecField
-- Looks up a RdrName occurrence in the GlobalRdrEnv and with
-- lookupQualifiedNameGHCi. Does not try to find an Exact or Orig name first.
@@ -1444,7 +1492,7 @@ lookupGreAvailRn rdr_name
GreNotFound ->
do
traceRn "lookupGreAvailRn" (ppr rdr_name)
- name <- unboundName WL_Global rdr_name
+ name <- unboundName (LF WL_Anything WL_Global) rdr_name
return (name, avail name)
MultipleNames gres ->
do
@@ -1811,11 +1859,12 @@ lookupBindGroupOcc ctxt what rdr_name
lookup_top keep_me
= do { env <- getGlobalRdrEnv
+ ; dflags <- getDynFlags
; let all_gres = lookupGlobalRdrEnv env (rdrNameOcc rdr_name)
names_in_scope = -- If rdr_name lacks a binding, only
-- recommend alternatives from related
-- namespaces. See #17593.
- filter (\n -> nameSpacesRelated
+ filter (\n -> nameSpacesRelated dflags WL_Anything
(rdrNameSpace rdr_name)
(nameNameSpace n))
$ map greMangledName
@@ -1974,7 +2023,7 @@ lookupIfThenElse
= do { rebindable_on <- xoptM LangExt.RebindableSyntax
; if not rebindable_on
then return Nothing
- else do { ite <- lookupOccRn (mkVarUnqual (fsLit "ifThenElse"))
+ else do { ite <- lookupOccRnNone (mkVarUnqual (fsLit "ifThenElse"))
; return (Just ite) } }
lookupSyntaxName :: Name -- ^ The standard name
@@ -1989,7 +2038,7 @@ lookupSyntaxName std_name
= do { rebind <- xoptM LangExt.RebindableSyntax
; if not rebind
then return (std_name, emptyFVs)
- else do { nm <- lookupOccRn (mkRdrUnqual (nameOccName std_name))
+ else do { nm <- lookupOccRnNone (mkRdrUnqual (nameOccName std_name))
; return (nm, unitFV nm) } }
lookupSyntaxExpr :: Name -- ^ The standard name
@@ -2013,7 +2062,8 @@ lookupSyntaxNames std_names
; if not rebindable_on then
return (map (HsVar noExtField . noLocA) std_names, emptyFVs)
else
- do { usr_names <- mapM (lookupOccRn . mkRdrUnqual . nameOccName) std_names
+ do { usr_names <-
+ mapM (lookupOccRnNone . mkRdrUnqual . nameOccName) std_names
; return (map (HsVar noExtField . noLocA) usr_names, mkFVs usr_names) } }
@@ -2047,7 +2097,7 @@ lookupQualifiedDo ctxt std_name
lookupNameWithQualifier :: Name -> ModuleName -> RnM (Name, FreeVars)
lookupNameWithQualifier std_name modName
- = do { qname <- lookupOccRn (mkRdrQual modName (nameOccName std_name))
+ = do { qname <- lookupOccRnNone (mkRdrQual modName (nameOccName std_name))
; return (qname, unitFV qname) }
-- See Note [QualifiedDo].