X-Git-Url: http://git.megacz.com/?p=ghc-hetmet.git;a=blobdiff_plain;f=compiler%2Frename%2FRnEnv.lhs;h=2ecaf612954c63302e2c74cf2c979ab4a69ce752;hp=888ac289b1a6534145e2434599c65888ba177a06;hb=7bb3d1fc79521d591cd9f824893963141a7997b6;hpb=0a7a51d7faab28b2bc1aa5998ed36e9f60ecb1e5 diff --git a/compiler/rename/RnEnv.lhs b/compiler/rename/RnEnv.lhs index 888ac28..2ecaf61 100644 --- a/compiler/rename/RnEnv.lhs +++ b/compiler/rename/RnEnv.lhs @@ -15,7 +15,7 @@ module RnEnv ( lookupInstDeclBndr, lookupRecordBndr, lookupConstructorFields, lookupSyntaxName, lookupSyntaxTable, lookupGreRn, lookupGreLocalRn, lookupGreRn_maybe, - getLookupOccRn, + getLookupOccRn, addUsedRdrNames, newLocalsRn, newIPNameRn, bindLocalNames, bindLocalNamesFV, @@ -68,6 +68,7 @@ import List ( nubBy ) import DynFlags import FastString import Control.Monad +import qualified Data.Set as Set \end{code} \begin{code} @@ -307,6 +308,7 @@ lookup_sub_bndr :: (GlobalRdrElt -> Bool) -> SDoc -> RdrName -> RnM Name lookup_sub_bndr is_good doc rdr_name | isUnqual rdr_name -- Find all the things the rdr-name maps to = do { -- and pick the one with the right parent name + ; addUsedRdrName rdr_name ; env <- getGlobalRdrEnv ; case filter is_good (lookupGlobalRdrEnv env (rdrNameOcc rdr_name)) of -- NB: lookupGlobalRdrEnv, not lookupGRE_RdrName! @@ -328,22 +330,18 @@ lookup_sub_bndr is_good doc rdr_name newIPNameRn :: IPName RdrName -> TcRnIf m n (IPName Name) newIPNameRn ip_rdr = newIPName (mapIPName rdrNameOcc ip_rdr) --- Looking up family names in type instances is a subtle affair. The family --- may be imported, in which case we need to lookup the occurence of a global --- name. Alternatively, the family may be in the same binding group (and in --- fact in a declaration processed later), and we need to create a new top --- source binder. +-- If the family is declared locally, it will not yet be in the main +-- environment; hence, we pass in an extra one here, which we check first. +-- See "Note [Looking up family names in family instances]" in 'RnNames'. -- --- So, also this is strictly speaking an occurence, we cannot raise an error --- message yet for instances without a family declaration. This will happen --- during renaming the type instance declaration in RnSource.rnTyClDecl. --- -lookupFamInstDeclBndr :: Module -> Located RdrName -> RnM Name -lookupFamInstDeclBndr mod lrdr_name@(L _ rdr_name) - = do { mb_gre <- lookupGreRn_maybe rdr_name - ; case mb_gre of - Just gre -> returnM (gre_name gre) - Nothing -> newTopSrcBinder mod lrdr_name } +lookupFamInstDeclBndr :: GlobalRdrEnv -> Located RdrName -> RnM Name +lookupFamInstDeclBndr tyclGroupEnv (L loc rdr_name) + = setSrcSpan loc $ + case lookupGRE_RdrName rdr_name tyclGroupEnv of + (gre:_) -> return $ gre_name gre + -- if there is more than one, an error will be raised elsewhere + [] -> lookupOccRn rdr_name + -------------------------------------------------- -- Occurrences @@ -424,7 +422,27 @@ unboundName rdr_name lookupGreRn_maybe :: RdrName -> RnM (Maybe GlobalRdrElt) -- Just look up the RdrName in the GlobalRdrEnv lookupGreRn_maybe rdr_name - = lookupGreRn_help rdr_name (lookupGRE_RdrName rdr_name) + = do { mGre <- lookupGreRn_help rdr_name (lookupGRE_RdrName rdr_name) + ; case mGre of + Just gre -> + case gre_prov gre of + LocalDef -> return () + Imported _ -> addUsedRdrName rdr_name + Nothing -> + return () + ; return mGre } + +addUsedRdrName :: RdrName -> RnM () +addUsedRdrName rdr + = do { env <- getGblEnv + ; updMutVar (tcg_used_rdrnames env) + (\s -> Set.insert rdr s) } + +addUsedRdrNames :: [RdrName] -> RnM () +addUsedRdrNames rdrs + = do { env <- getGblEnv + ; updMutVar (tcg_used_rdrnames env) + (\s -> foldr Set.insert s rdrs) } lookupGreRn :: RdrName -> RnM GlobalRdrElt -- If not found, add error message, and return a fake GRE