X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Fcompiler%2Ftypecheck%2FTcEnv.lhs;h=31d81a4bd6d6712086978343309dc3e88449dc6e;hb=edf6bdfb5dee21f9bc5077083e5350ee64efffbc;hp=8657a85130f8df768a4e1e5b27a50d1985f79b8a;hpb=a7032af4e333a273678801466a08b619af442c42;p=ghc-hetmet.git diff --git a/ghc/compiler/typecheck/TcEnv.lhs b/ghc/compiler/typecheck/TcEnv.lhs index 8657a85..31d81a4 100644 --- a/ghc/compiler/typecheck/TcEnv.lhs +++ b/ghc/compiler/typecheck/TcEnv.lhs @@ -46,7 +46,6 @@ import HsSyn ( LRuleDecl, LHsBinds, LSig, LHsTyVarBndr, HsTyVarBndr(..), pprLHsBinds ) import TcIface ( tcImportDecl ) import IfaceEnv ( newGlobalBinder ) -import TcRnTypes ( pprTcTyThingCategory ) import TcRnMonad import TcMType ( zonkTcType, zonkTcTyVarsAndFV ) import TcType ( Type, TcKind, TcTyVar, TcTyVarSet, TcType, @@ -64,7 +63,8 @@ import InstEnv ( Instance, DFunId, instanceDFunId, instanceHead ) import DataCon ( DataCon ) import TyCon ( TyCon ) import Class ( Class ) -import Name ( Name, NamedThing(..), getSrcLoc, mkInternalName, nameIsLocalOrFrom ) +import Name ( Name, NamedThing(..), getSrcLoc, nameModule, isExternalName ) +import PrelNames ( thFAKE ) import NameEnv import OccName ( mkDFunOcc, occNameString ) import HscTypes ( extendTypeEnvList, lookupType, @@ -93,21 +93,32 @@ tcLookupLocatedGlobal name = addLocM tcLookupGlobal name tcLookupGlobal :: Name -> TcM TyThing +-- The Name is almost always an ExternalName, but not always +-- In GHCi, we may make command-line bindings (ghci> let x = True) +-- that bind a GlobalId, but with an InternalName tcLookupGlobal name = do { env <- getGblEnv - ; if nameIsLocalOrFrom (tcg_mod env) name - - then -- It's defined in this module - case lookupNameEnv (tcg_type_env env) name of - Just thing -> return thing - Nothing -> notFound name -- Panic! + + -- Try local envt + ; case lookupNameEnv (tcg_type_env env) name of { + Just thing -> return thing ; + Nothing -> do - else do -- It's imported + -- Try global envt { (eps,hpt) <- getEpsAndHpt - ; case lookupType hpt (eps_PTE eps) name of - Just thing -> return thing - Nothing -> tcImportDecl name - }} + ; case lookupType hpt (eps_PTE eps) name of { + Just thing -> return thing ; + Nothing -> do + + -- Should it have been in the local envt? + { let mod = nameModule name + ; if mod == tcg_mod env || mod == thFAKE then + notFound name -- It should be local, so panic + -- The thFAKE possibility is because it + -- might be in a declaration bracket + else + tcImportDecl name -- Go find it in an interface + }}}}} tcLookupGlobalId :: Name -> TcM Id -- Never used for Haskell-source DataCons, hence no ADataCon case @@ -486,40 +497,6 @@ tcMetaTy tc_name %************************************************************************ %* * -\subsection{Making new Ids} -%* * -%************************************************************************ - -Constructing new Ids - -\begin{code} -newLocalName :: Name -> TcM Name -newLocalName name -- Make a clone - = newUnique `thenM` \ uniq -> - returnM (mkInternalName uniq (getOccName name) (getSrcLoc name)) -\end{code} - -Make a name for the dict fun for an instance decl. It's an *external* -name, like otber top-level names, and hence must be made with newGlobalBinder. - -\begin{code} -newDFunName :: Class -> [Type] -> SrcLoc -> TcM Name -newDFunName clas (ty:_) loc - = do { index <- nextDFunIndex - ; is_boot <- tcIsHsBoot - ; mod <- getModule - ; let info_string = occNameString (getOccName clas) ++ - occNameString (getDFunTyKey ty) - dfun_occ = mkDFunOcc info_string is_boot index - - ; newGlobalBinder mod dfun_occ Nothing loc } - -newDFunName clas [] loc = pprPanic "newDFunName" (ppr clas <+> ppr loc) -\end{code} - - -%************************************************************************ -%* * \subsection{The InstInfo type} %* * %************************************************************************ @@ -576,6 +553,24 @@ simpleInstInfoTyCon :: InstInfo -> TyCon simpleInstInfoTyCon inst = tcTyConAppTyCon (simpleInstInfoTy inst) \end{code} +Make a name for the dict fun for an instance decl. It's an *external* +name, like otber top-level names, and hence must be made with newGlobalBinder. + +\begin{code} +newDFunName :: Class -> [Type] -> SrcLoc -> TcM Name +newDFunName clas (ty:_) loc + = do { index <- nextDFunIndex + ; is_boot <- tcIsHsBoot + ; mod <- getModule + ; let info_string = occNameString (getOccName clas) ++ + occNameString (getDFunTyKey ty) + dfun_occ = mkDFunOcc info_string is_boot index + + ; newGlobalBinder mod dfun_occ Nothing loc } + +newDFunName clas [] loc = pprPanic "newDFunName" (ppr clas <+> ppr loc) +\end{code} + %************************************************************************ %* *