X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Fcompiler%2Frename%2FRnHiFiles.lhs;h=fbf9e790a5b9665b4e4c01adf891371580905ac4;hb=91c750cbd18e3d610b0db498ded38d5b3c5adfac;hp=c1f27882d10bd0f6bda21aca1eed9654c5d46c9b;hpb=47108330f6f832dd82aba3d125a1ad114f4a45e7;p=ghc-hetmet.git diff --git a/ghc/compiler/rename/RnHiFiles.lhs b/ghc/compiler/rename/RnHiFiles.lhs index c1f2788..fbf9e79 100644 --- a/ghc/compiler/rename/RnHiFiles.lhs +++ b/ghc/compiler/rename/RnHiFiles.lhs @@ -11,8 +11,7 @@ module RnHiFiles ( lookupFixityRn, - getTyClDeclBinders, - removeContext -- removeContext probably belongs somewhere else + getTyClDeclBinders ) where #include "HsVersions.h" @@ -29,13 +28,13 @@ import HscTypes ( ModuleLocation(..), AvailInfo, GenAvailInfo(..), Avails, Deprecations(..) ) import HsSyn ( TyClDecl(..), InstDecl(..), - HsType(..), FixitySig(..), RuleDecl(..), - tyClDeclNames, tyClDeclSysNames - ) -import RdrHsSyn ( RdrNameTyClDecl, RdrNameInstDecl, RdrNameRuleDecl, - extractHsTyRdrNames + HsType(..), HsPred(..), FixitySig(..), RuleDecl(..), + tyClDeclNames, tyClDeclSysNames, hsTyVarNames, getHsInstHead, ) +import RdrHsSyn ( RdrNameTyClDecl, RdrNameInstDecl, RdrNameRuleDecl ) +import RnHsSyn ( extractHsTyNames_s ) import BasicTypes ( Version, defaultFixity ) +import RnTypes ( rnHsType ) import RnEnv import RnMonad import ParseIface ( parseIface ) @@ -44,6 +43,7 @@ import Name ( Name {-instance NamedThing-}, nameModule, isLocalName, nameIsLocalOrFrom ) import NameEnv +import NameSet import Module import RdrName ( rdrNameOcc ) import SrcLoc ( mkSrcLoc ) @@ -54,6 +54,7 @@ import ErrUtils ( Message ) import Finder ( findModule, findPackageModule ) import Lex import FiniteMap +import ListSetOps ( minusList ) import Outputable import Bag import Config @@ -321,6 +322,7 @@ loadDecl mod (version_map, decls_map) (version, decl) new_version_map = extendNameEnv version_map main_name version in + traceRn (text "Loading" <+> ppr full_avail) `thenRn_` returnRn (new_version_map, new_decls_map) ----------------------------------------------------- @@ -362,23 +364,36 @@ loadInstDecl mod insts decl@(InstDecl inst_ty _ _ _ _) -- instance Foo a => Baz (T a) where ... -- -- Here the gates are Baz and T, but *not* Foo. + -- + -- HOWEVER: functional dependencies make things more complicated + -- class C a b | a->b where ... + -- instance C Foo Baz where ... + -- Here, the gates are really only C and Foo, *not* Baz. + -- That is, if C and Foo are visible, even if Baz isn't, we must + -- slurp the decl. + -- + -- Rather than take fundeps into account "properly", we just slurp + -- if C is visible and *any one* of the Names in the types + -- This is a slightly brutal approximation, but most instance decls + -- are regular H98 ones and it's perfect for them. + -- + -- NOTICE that we rename the type before extracting its free + -- variables. The free-variable finder for a renamed HsType + -- does the Right Thing for built-in syntax like [] and (,). + initIfaceRnMS mod ( + rnHsType (text "In an interface instance decl") inst_ty + ) `thenRn` \ inst_ty' -> let - munged_inst_ty = removeContext inst_ty - free_names = extractHsTyRdrNames munged_inst_ty - in - mapRn lookupIfaceName free_names `thenRn` \ gate_names -> - returnRn ((gate_names, (mod, decl)) `consBag` insts) + (tvs,(cls,tys)) = getHsInstHead inst_ty' + free_tcs = nameSetToList (extractHsTyNames_s tys) `minusList` hsTyVarNames tvs + gate_fn vis_fn = vis_fn cls && (null free_tcs || any vis_fn free_tcs) + -- Here is the implementation of HOWEVER above + -- (Note that we do let the inst decl in if it mentions + -- no tycons at all. Hence the null free_ty_names.) + in + returnRn ((gate_fn, (mod, decl)) `consBag` insts) --- In interface files, the instance decls now look like --- forall a. Foo a -> Baz (T a) --- so we have to strip off function argument types as well --- as the bit before the '=>' (which is always empty in interface files) -removeContext (HsForAllTy tvs cxt ty) = HsForAllTy tvs [] (removeFuns ty) -removeContext ty = removeFuns ty - -removeFuns (HsFunTy _ ty) = removeFuns ty -removeFuns ty = ty ----------------------------------------------------- @@ -399,9 +414,9 @@ loadRules mod (rule_bag, n_slurped) (version, rules) loadRule :: Module -> RdrNameRuleDecl -> RnM d (GatedDecl RdrNameRuleDecl) -- "Gate" the rule simply by whether the rule variable is -- needed. We can refine this later. -loadRule mod decl@(IfaceRule _ _ var _ _ src_loc) +loadRule mod decl@(IfaceRule _ _ _ var _ _ src_loc) = lookupIfaceName var `thenRn` \ var_name -> - returnRn ([var_name], (mod, decl)) + returnRn (\vis_fn -> vis_fn var_name, (mod, decl)) ----------------------------------------------------- @@ -482,7 +497,8 @@ findAndReadIface doc_str mod_name hi_boot_file -- and start up GHCi - it won't complain that all the modules it tries -- to load are found in the home location. ioToRnM_no_fail (readIORef v_GhcMode) `thenRn` \ mode -> - let home_allowed = mode `notElem` [ DoInteractive, DoLink ] + let home_allowed = hi_boot_file || + mode `notElem` [ DoInteractive, DoMake ] in ioToRnM (if home_allowed @@ -504,7 +520,7 @@ findAndReadIface doc_str mod_name hi_boot_file (hiModuleNameMismatchWarn wanted_mod read_mod) `thenRn_` -- check that the package names agree - checkRn + warnCheckRn (modulePackage wanted_mod == modulePackage read_mod) (packageNameMismatchWarn wanted_mod read_mod) `thenRn_` @@ -560,15 +576,14 @@ readIface file_path bale_out err = returnRn (Left (badIfaceFile file_path err)) \end{code} - %********************************************************* %* * \subsection{Looking up fixities} %* * %********************************************************* -@lookupFixityRn@ has to be in RnIfaces (or RnHiFiles) because -it calls @loadHomeInterface@. +@lookupFixityRn@ has to be in RnIfaces (or RnHiFiles), instead of +its obvious home in RnEnv, because it calls @loadHomeInterface@. lookupFixity is a bit strange. @@ -593,13 +608,19 @@ lookupFixityRn name returnRn (lookupLocalFixity local_fix_env name) else -- It's imported - -- For imported names, we have to get their fixities by doing a loadHomeInterface, - -- and consulting the Ifaces that comes back from that, because the interface - -- file for the Name might not have been loaded yet. Why not? Suppose you import module A, - -- which exports a function 'f', which is defined in module B. Then B isn't loaded - -- right away (after all, it's possible that nothing from B will be used). - -- When we come across a use of 'f', we need to know its fixity, and it's then, - -- and only then, that we load B.hi. That is what's happening here. + -- For imported names, we have to get their fixities by doing a + -- loadHomeInterface, and consulting the Ifaces that comes back + -- from that, because the interface file for the Name might not + -- have been loaded yet. Why not? Suppose you import module A, + -- which exports a function 'f', thus; + -- module CurrentModule where + -- import A( f ) + -- module A( f ) where + -- import B( f ) + -- Then B isn't loaded right away (after all, it's possible that + -- nothing from B will be used). When we come across a use of + -- 'f', we need to know its fixity, and it's then, and only + -- then, that we load B.hi. That is what's happening here. loadHomeInterface doc name `thenRn` \ iface -> returnRn (lookupNameEnv (mi_fixities iface) name `orElse` defaultFixity) where @@ -634,7 +655,7 @@ hiModuleNameMismatchWarn requested_mod read_mod = packageNameMismatchWarn :: Module -> Module -> Message packageNameMismatchWarn requested_mod read_mod = - sep [ ptext SLIT("Module"), quotes (ppr requested_mod), + fsep [ ptext SLIT("Module"), quotes (ppr requested_mod), ptext SLIT("is located in package"), quotes (ptext (modulePackage requested_mod)), ptext SLIT("but its interface file claims it is part of package"), @@ -645,10 +666,6 @@ warnRedundantSourceImport mod_name = ptext SLIT("Unnecessary {- SOURCE -} in the import of module") <+> quotes (ppr mod_name) -notLoaded mod - = ptext SLIT("Module") <+> quotes (ppr mod) <+> ptext SLIT("is not loaded") - warnSelfImport mod = ptext SLIT("Importing my own interface: module") <+> ppr mod \end{code} -