[project @ 2002-02-13 14:05:50 by simonpj]
[ghc-hetmet.git] / ghc / compiler / main / HscMain.lhs
1 %
2 % (c) The GRASP/AQUA Project, Glasgow University, 1993-2000
3 %
4
5 \section[GHC_Main]{Main driver for Glasgow Haskell compiler}
6
7 \begin{code}
8 module HscMain ( HscResult(..), hscMain, 
9 #ifdef GHCI
10                  hscStmt, hscThing, hscModuleContents,
11 #endif
12                  initPersistentCompilerState ) where
13
14 #include "HsVersions.h"
15
16 #ifdef GHCI
17 import Interpreter
18 import ByteCodeGen      ( byteCodeGen )
19 import CoreTidy         ( tidyCoreExpr )
20 import CorePrep         ( corePrepExpr )
21 import Rename           ( renameStmt, renameRdrName, slurpIface )
22 import RdrName          ( rdrNameOcc, setRdrNameOcc )
23 import RdrHsSyn         ( RdrNameStmt )
24 import OccName          ( dataName, tcClsName, 
25                           occNameSpace, setOccNameSpace )
26 import Type             ( Type )
27 import Id               ( Id, idName, setGlobalIdDetails )
28 import IdInfo           ( GlobalIdDetails(VanillaGlobal) )
29 import Name             ( isLocalName )
30 import NameEnv          ( lookupNameEnv )
31 import Module           ( lookupModuleEnv )
32 import RdrName          ( rdrEnvElts )
33 import PrelNames        ( iNTERACTIVE )
34 import StringBuffer     ( stringToStringBuffer )
35 import FastString       ( mkFastString )
36 import Maybes           ( catMaybes )
37
38 import List             ( nub )
39 #endif
40
41 import HsSyn
42
43 import RdrName          ( mkRdrOrig )
44 import Id               ( idName )
45 import IdInfo           ( CafInfo(..), CgInfoEnv, CgInfo(..) )
46 import StringBuffer     ( hGetStringBuffer, freeStringBuffer )
47 import Parser
48 import Lex              ( ParseResult(..), ExtFlags(..), mkPState )
49 import SrcLoc           ( mkSrcLoc )
50 import Finder           ( findModule )
51 import Rename           ( checkOldIface, renameModule, closeIfaceDecls )
52 import Rules            ( emptyRuleBase )
53 import PrelInfo         ( wiredInThingEnv, wiredInThings )
54 import PrelRules        ( builtinRules )
55 import PrelNames        ( knownKeyNames )
56 import MkIface          ( mkFinalIface )
57 import TcModule
58 import InstEnv          ( emptyInstEnv )
59 import Desugar
60 import Flattening       ( flatten, flattenExpr )
61 import SimplCore
62 import CoreUtils        ( coreBindsSize )
63 import CoreTidy         ( tidyCorePgm )
64 import CorePrep         ( corePrepPgm )
65 import StgSyn
66 import CoreToStg        ( coreToStg )
67 import SimplStg         ( stg2stg )
68 import CodeGen          ( codeGen )
69 import CodeOutput       ( codeOutput )
70
71 import Module           ( ModuleName, moduleName, mkHomeModule )
72 import CmdLineOpts
73 import DriverState      ( v_HCHeader )
74 import ErrUtils         ( dumpIfSet_dyn, showPass, printError )
75 import Util             ( unJust )
76 import UniqSupply       ( mkSplitUniqSupply )
77
78 import Bag              ( consBag, emptyBag )
79 import Outputable
80 import HscStats         ( ppSourceStats )
81 import HscTypes
82 import FiniteMap        ( FiniteMap, plusFM, emptyFM, addToFM )
83 import OccName          ( OccName )
84 import Name             ( Name, nameModule, nameOccName, getName )
85 import NameEnv          ( emptyNameEnv, mkNameEnv )
86 import Module           ( Module )
87
88 import IOExts           ( newIORef, readIORef, writeIORef, 
89                           unsafePerformIO )
90
91 import Monad            ( when )
92 import Maybe            ( isJust, fromJust )
93 import IO
94
95 import MkExternalCore   ( emitExternalCore )
96 \end{code}
97
98
99 %************************************************************************
100 %*                                                                      *
101 \subsection{The main compiler pipeline}
102 %*                                                                      *
103 %************************************************************************
104
105 \begin{code}
106 data HscResult
107    -- compilation failed
108    = HscFail     PersistentCompilerState -- updated PCS
109    -- concluded that it wasn't necessary
110    | HscNoRecomp PersistentCompilerState -- updated PCS
111                  ModDetails              -- new details (HomeSymbolTable additions)
112                  ModIface                -- new iface (if any compilation was done)
113    -- did recompilation
114    | HscRecomp   PersistentCompilerState -- updated PCS
115                  ModDetails              -- new details (HomeSymbolTable additions)
116                  ModIface                -- new iface (if any compilation was done)
117                  Bool                   -- stub_h exists
118                  Bool                   -- stub_c exists
119 #ifdef GHCI
120                  (Maybe ([UnlinkedBCO],ItblEnv)) -- interpreted code, if any
121 #else
122                  (Maybe ())                      -- no interpreted code whatsoever
123 #endif
124
125         -- no errors or warnings; the individual passes
126         -- (parse/rename/typecheck) print messages themselves
127
128 hscMain
129   :: GhciMode
130   -> DynFlags
131   -> Module
132   -> ModuleLocation             -- location info
133   -> Bool                       -- True <=> source unchanged
134   -> Bool                       -- True <=> have an object file (for msgs only)
135   -> Maybe ModIface             -- old interface, if available
136   -> HomeSymbolTable            -- for home module ModDetails
137   -> HomeIfaceTable
138   -> PersistentCompilerState    -- IN: persistent compiler state
139   -> IO HscResult
140
141 hscMain ghci_mode dflags mod location source_unchanged have_object 
142         maybe_old_iface hst hit pcs
143  = {-# SCC "hscMain" #-}
144    do {
145       showPass dflags ("Checking old interface for hs = " 
146                         ++ show (ml_hs_file location)
147                         ++ ", hspp = " ++ show (ml_hspp_file location));
148
149       (pcs_ch, errs_found, (recomp_reqd, maybe_checked_iface))
150          <- _scc_ "checkOldIface"
151             checkOldIface ghci_mode dflags hit hst pcs mod (ml_hi_file location)
152                 source_unchanged maybe_old_iface;
153
154       if errs_found then
155          return (HscFail pcs_ch)
156       else do {
157
158       let no_old_iface = not (isJust maybe_checked_iface)
159           what_next | recomp_reqd || no_old_iface = hscRecomp 
160                     | otherwise                   = hscNoRecomp
161       ;
162       what_next ghci_mode dflags have_object mod location 
163                 maybe_checked_iface hst hit pcs_ch
164       }}
165
166
167 -- we definitely expect to have the old interface available
168 hscNoRecomp ghci_mode dflags have_object 
169             mod location (Just old_iface) hst hit pcs_ch
170  | ghci_mode == OneShot
171  = do {
172       when (verbosity dflags > 0) $
173           hPutStrLn stderr "compilation IS NOT required";
174       let { bomb = panic "hscNoRecomp:OneShot" };
175       return (HscNoRecomp pcs_ch bomb bomb)
176       }
177  | otherwise
178  = do {
179       when (verbosity dflags >= 1) $
180                 hPutStrLn stderr ("Skipping  " ++ 
181                         showModMsg have_object mod location);
182
183       -- CLOSURE
184       (pcs_cl, closure_errs, cl_hs_decls) 
185          <- closeIfaceDecls dflags hit hst pcs_ch old_iface ;
186       if closure_errs then 
187          return (HscFail pcs_cl) 
188       else do {
189
190       -- TYPECHECK
191       maybe_tc_result 
192         <- typecheckIface dflags pcs_cl hst old_iface cl_hs_decls;
193
194       case maybe_tc_result of {
195          Nothing -> return (HscFail pcs_cl);
196          Just (pcs_tc, new_details) ->
197
198       return (HscNoRecomp pcs_tc new_details old_iface)
199       }}}
200
201 hscRecomp ghci_mode dflags have_object 
202           mod location maybe_checked_iface hst hit pcs_ch
203  = do   {
204           -- what target are we shooting for?
205         ; let toInterp = dopt_HscLang dflags == HscInterpreted
206         ; let toNothing = dopt_HscLang dflags == HscNothing
207
208         ; when (ghci_mode /= OneShot && verbosity dflags >= 1) $
209                 hPutStrLn stderr ("Compiling " ++ 
210                         showModMsg (not toInterp) mod location);
211
212             -------------------
213             -- PARSE
214             -------------------
215         ; maybe_parsed <- myParseModule dflags 
216                              (unJust "hscRecomp:hspp" (ml_hspp_file location))
217         ; case maybe_parsed of {
218              Nothing -> return (HscFail pcs_ch);
219              Just rdr_module -> do {
220         ; let this_mod = mkHomeModule (hsModuleName rdr_module)
221     
222             -------------------
223             -- RENAME
224             -------------------
225         ; (pcs_rn, print_unqual, maybe_rn_result) 
226              <- _scc_ "Rename" 
227                  renameModule dflags ghci_mode hit hst pcs_ch this_mod rdr_module
228         ; case maybe_rn_result of {
229              Nothing -> return (HscFail pcs_ch);
230              Just (dont_discard, new_iface, rn_result) -> do {
231
232             -------------------
233             -- TYPECHECK
234             -------------------
235         ; maybe_tc_result 
236             <- _scc_ "TypeCheck" 
237                typecheckModule dflags pcs_rn hst print_unqual rn_result
238         ; case maybe_tc_result of {
239              Nothing -> return (HscFail pcs_ch);
240              Just (pcs_tc, tc_result) -> do {
241     
242             -------------------
243             -- DESUGAR
244             -------------------
245         ; (ds_details, foreign_stuff) 
246              <- _scc_ "DeSugar" 
247                 deSugar dflags pcs_tc hst this_mod print_unqual tc_result
248
249             -------------------
250             -- FLATTENING
251             -------------------
252         ; flat_details
253              <- _scc_ "Flattening"
254                 flatten dflags pcs_tc hst ds_details
255
256         ; pcs_middle
257             <- _scc_ "pcs_middle"
258                 if ghci_mode == OneShot 
259                   then do init_pcs <- initPersistentCompilerState
260                           init_prs <- initPersistentRenamerState
261                           let 
262                               rules   = pcs_rules pcs_tc        
263                               orig_tc = prsOrig (pcs_PRS pcs_tc)
264                               new_prs = init_prs{ prsOrig=orig_tc }
265
266                           orig_tc `seq` rules `seq` new_prs `seq`
267                             return init_pcs{ pcs_PRS = new_prs,
268                                              pcs_rules = rules }
269                   else return pcs_tc
270
271         -- alive at this point:  
272         --      pcs_middle
273         --      foreign_stuff
274         --      ds_details
275         --      new_iface               
276
277             -------------------
278             -- SIMPLIFY
279             -------------------
280         ; simpl_details
281              <- _scc_     "Core2Core"
282                 core2core dflags pcs_middle hst dont_discard flat_details
283
284             -------------------
285             -- TIDY
286             -------------------
287         ; cg_info_ref <- newIORef Nothing ;
288         ; let cg_info :: CgInfoEnv
289               cg_info = unsafePerformIO $ do {
290                            maybe_cg_env <- readIORef cg_info_ref ;
291                            case maybe_cg_env of
292                              Just env -> return env
293                              Nothing  -> do { printError "Urk! Looked at CgInfo too early!";
294                                               return emptyNameEnv } }
295                 -- cg_info_ref will be filled in just after restOfCodeGeneration
296                 -- Meanwhile, tidyCorePgm is careful not to look at cg_info!
297
298         ; (pcs_simpl, tidy_details) 
299              <- _scc_ "CoreTidy"
300                 tidyCorePgm dflags this_mod pcs_middle cg_info simpl_details
301       
302         ; pcs_final <- if ghci_mode == OneShot then initPersistentCompilerState
303                                                else return pcs_simpl
304
305         -- alive at this point:  
306         --      tidy_details
307         --      new_iface               
308
309         ; emitExternalCore dflags new_iface tidy_details 
310
311         ; let final_details = tidy_details {md_binds = []} 
312         ; final_details `seq` return ()
313
314             -------------------
315             -- PREPARE FOR CODE GENERATION
316             -------------------
317               -- Do saturation and convert to A-normal form
318         ; prepd_details <- _scc_ "CorePrep" 
319                            corePrepPgm dflags tidy_details
320
321             -------------------
322             -- CONVERT TO STG and COMPLETE CODE GENERATION
323             -------------------
324         ; let
325             ModDetails{md_binds=binds, md_types=env_tc} = prepd_details
326
327             local_tycons     = typeEnvTyCons  env_tc
328             local_classes    = typeEnvClasses env_tc
329
330             imported_module_names = map ideclName (hsModuleImports rdr_module)
331
332             mod_name_to_Module nm
333                  = do m <- findModule nm ; return (fst (fromJust m))
334
335             (h_code, c_code, headers, fe_binders) = foreign_stuff
336
337             -- turn the list of headers requested in foreign import
338             -- declarations into a string suitable for emission into generated
339             -- C code...
340             --
341             foreign_headers =   
342                 unlines 
343               . map (\fname -> "#include \"" ++ _UNPK_ fname ++ "\"")
344               . reverse 
345               $ headers
346
347           -- ...and add the string to the headers requested via command line
348           -- options 
349           --
350         ; fhdrs <- readIORef v_HCHeader
351         ; writeIORef v_HCHeader (fhdrs ++ foreign_headers)
352
353         ; imported_modules <- mapM mod_name_to_Module imported_module_names
354
355         ; (stub_h_exists, stub_c_exists, maybe_bcos, final_iface )
356            <- if toInterp
357 #ifdef GHCI
358                 then do 
359                     -----------------  Generate byte code ------------------
360                     (bcos,itbl_env) <- byteCodeGen dflags binds 
361                                         local_tycons local_classes
362
363                     -- Fill in the code-gen info
364                     writeIORef cg_info_ref (Just emptyNameEnv)
365
366                     ------------------ BUILD THE NEW ModIface ------------
367                     final_iface <- _scc_ "MkFinalIface" 
368                           mkFinalIface ghci_mode dflags location 
369                                    maybe_checked_iface new_iface tidy_details
370
371                     return ( False, False, Just (bcos,itbl_env), final_iface )
372 #else
373                 then error "GHC not compiled with interpreter"
374 #endif
375
376                 else do
377                     -----------------  Convert to STG ------------------
378                     (stg_binds, cost_centre_info, stg_back_end_info) 
379                               <- _scc_ "CoreToStg"
380                                  myCoreToStg dflags this_mod binds
381                     
382                     -- Fill in the code-gen info for the earlier tidyCorePgm
383                     writeIORef cg_info_ref (Just stg_back_end_info)
384
385                     ------------------ BUILD THE NEW ModIface ------------
386                     final_iface <- _scc_ "MkFinalIface" 
387                           mkFinalIface ghci_mode dflags location 
388                                    maybe_checked_iface new_iface tidy_details
389                     if toNothing 
390                       then do
391                           return (False, False, Nothing, final_iface)
392                       else do
393                           ------------------  Code generation ------------------
394                           abstractC <- _scc_ "CodeGen"
395                                        codeGen dflags this_mod imported_modules
396                                                cost_centre_info fe_binders
397                                                local_tycons stg_binds
398                           
399                           ------------------  Code output -----------------------
400                           (stub_h_exists, stub_c_exists)
401                              <- codeOutput dflags this_mod [] --local_tycons
402                                    binds stg_binds
403                                    c_code h_code abstractC
404                               
405                           return (stub_h_exists, stub_c_exists, Nothing, final_iface)
406
407           -- and the answer is ...
408         ; return (HscRecomp pcs_final
409                             final_details
410                             final_iface
411                             stub_h_exists stub_c_exists
412                             maybe_bcos)
413           }}}}}}}
414
415 myParseModule dflags src_filename
416  = do --------------------------  Parser  ----------------
417       showPass dflags "Parser"
418       _scc_  "Parser" do
419
420       buf <- hGetStringBuffer True{-expand tabs-} src_filename
421
422       let exts = ExtFlags {glasgowExtsEF = dopt Opt_GlasgowExts dflags,
423                            parrEF        = dopt Opt_PArr        dflags}
424           loc  = mkSrcLoc (_PK_ src_filename) 1
425
426       case parseModule buf (mkPState loc exts) of {
427
428         PFailed err -> do { hPutStrLn stderr (showSDoc err);
429                             freeStringBuffer buf;
430                             return Nothing };
431
432         POk _ rdr_module@(HsModule mod_name _ _ _ _ _ _) -> do {
433
434       dumpIfSet_dyn dflags Opt_D_dump_parsed "Parser" (ppr rdr_module) ;
435       
436       dumpIfSet_dyn dflags Opt_D_source_stats "Source Statistics"
437                            (ppSourceStats False rdr_module) ;
438       
439       return (Just rdr_module)
440         -- ToDo: free the string buffer later.
441       }}
442
443
444 myCoreToStg dflags this_mod tidy_binds
445  = do 
446       () <- coreBindsSize tidy_binds `seq` return ()
447       -- TEMP: the above call zaps some space usage allocated by the
448       -- simplifier, which for reasons I don't understand, persists
449       -- thoroughout code generation -- JRS
450       --
451       -- This is still necessary. -- SDM (10 Dec 2001)
452
453       stg_binds <- _scc_ "Core2Stg" 
454              coreToStg dflags tidy_binds
455
456       (stg_binds2, cost_centre_info) <- _scc_ "Core2Stg" 
457              stg2stg dflags this_mod stg_binds
458
459       let env_rhs :: CgInfoEnv
460           env_rhs = mkNameEnv [ caf_info `seq` (idName bndr, CgInfo caf_info)
461                               | (bind,_) <- stg_binds2, 
462                                 let caf_info 
463                                      | stgBindHasCafRefs bind = MayHaveCafRefs
464                                      | otherwise              = NoCafRefs,
465                                 bndr <- stgBinders bind ]
466
467       return (stg_binds2, cost_centre_info, env_rhs)
468 \end{code}
469
470
471 %************************************************************************
472 %*                                                                      *
473 \subsection{Compiling a do-statement}
474 %*                                                                      *
475 %************************************************************************
476
477 \begin{code}
478 #ifdef GHCI
479 hscStmt
480   :: DynFlags
481   -> HomeSymbolTable    
482   -> HomeIfaceTable
483   -> PersistentCompilerState    -- IN: persistent compiler state
484   -> InteractiveContext         -- Context for compiling
485   -> String                     -- The statement
486   -> Bool                       -- just treat it as an expression
487   -> IO ( PersistentCompilerState, 
488           Maybe ( [Id], 
489                   Type, 
490                   UnlinkedBCOExpr) )
491 \end{code}
492
493 When the UnlinkedBCOExpr is linked you get an HValue of type
494         IO [HValue]
495 When you run it you get a list of HValues that should be 
496 the same length as the list of names; add them to the ClosureEnv.
497
498 A naked expression returns a singleton Name [it].
499
500         What you type                   The IO [HValue] that hscStmt returns
501         -------------                   ------------------------------------
502         let pat = expr          ==>     let pat = expr in return [coerce HVal x, coerce HVal y, ...]
503                                         bindings: [x,y,...]
504
505         pat <- expr             ==>     expr >>= \ pat -> return [coerce HVal x, coerce HVal y, ...]
506                                         bindings: [x,y,...]
507
508         expr (of IO type)       ==>     expr >>= \ v -> return [v]
509           [NB: result not printed]      bindings: [it]
510           
511
512         expr (of non-IO type, 
513           result showable)      ==>     let v = expr in print v >> return [v]
514                                         bindings: [it]
515
516         expr (of non-IO type, 
517           result not showable)  ==>     error
518
519 \begin{code}
520 hscStmt dflags hst hit pcs0 icontext stmt just_expr
521    =  do { maybe_stmt <- hscParseStmt dflags stmt
522         ; case maybe_stmt of
523              Nothing -> return (pcs0, Nothing)
524              Just parsed_stmt -> do {
525
526            let { notExprStmt (ExprStmt _ _ _) = False;
527                  notExprStmt _                = True 
528                };
529
530            if (just_expr && notExprStmt parsed_stmt)
531                 then do hPutStrLn stderr ("not an expression: `" ++ stmt ++ "'")
532                         return (pcs0, Nothing)
533                 else do {
534
535                 -- Rename it
536           (pcs1, print_unqual, maybe_renamed_stmt)
537                  <- renameStmt dflags hit hst pcs0 icontext parsed_stmt
538
539         ; case maybe_renamed_stmt of
540                 Nothing -> return (pcs0, Nothing)
541                 Just (bound_names, rn_stmt) -> do {
542
543                 -- Typecheck it
544           maybe_tc_return <- 
545             if just_expr 
546                 then case rn_stmt of { (ExprStmt e _ _, decls) -> 
547                      typecheckExpr dflags pcs1 hst (ic_type_env icontext)
548                            print_unqual iNTERACTIVE (e,decls) }
549                 else typecheckStmt dflags pcs1 hst (ic_type_env icontext)
550                            print_unqual iNTERACTIVE bound_names rn_stmt
551
552         ; case maybe_tc_return of
553                 Nothing -> return (pcs0, Nothing)
554                 Just (pcs2, tc_expr, bound_ids, ty) ->  do {
555
556                 -- Desugar it
557           ds_expr <- deSugarExpr dflags pcs2 hst iNTERACTIVE print_unqual tc_expr
558         
559                 -- Flatten it
560         ; flat_expr <- flattenExpr dflags pcs2 hst ds_expr
561
562                 -- Simplify it
563         ; simpl_expr <- simplifyExpr dflags pcs2 hst flat_expr
564
565                 -- Tidy it (temporary, until coreSat does cloning)
566         ; tidy_expr <- tidyCoreExpr simpl_expr
567
568                 -- Prepare for codegen
569         ; prepd_expr <- corePrepExpr dflags tidy_expr
570
571                 -- Convert to BCOs
572         ; bcos <- coreExprToBCOs dflags prepd_expr
573
574         ; let
575                 -- Make all the bound ids "global" ids, now that
576                 -- they're notionally top-level bindings.  This is
577                 -- important: otherwise when we come to compile an expression
578                 -- using these ids later, the byte code generator will consider
579                 -- the occurrences to be free rather than global.
580              global_bound_ids = map globaliseId bound_ids;
581              globaliseId id   = setGlobalIdDetails id VanillaGlobal
582
583         ; return (pcs2, Just (global_bound_ids, ty, bcos))
584
585      }}}}}
586
587 hscParseStmt :: DynFlags -> String -> IO (Maybe RdrNameStmt)
588 hscParseStmt dflags str
589  = do --------------------------  Parser  ----------------
590       showPass dflags "Parser"
591       _scc_ "Parser"  do
592
593       buf <- stringToStringBuffer str
594
595       let exts = ExtFlags {glasgowExtsEF = dopt Opt_GlasgowExts dflags,
596                            parrEF        = dopt Opt_PArr        dflags}
597           loc  = mkSrcLoc SLIT("<interactive>") 1
598
599       case parseStmt buf (mkPState loc exts) of {
600
601         PFailed err -> do { hPutStrLn stderr (showSDoc err);
602 --      Not yet implemented in <4.11    freeStringBuffer buf;
603                             return Nothing };
604
605         -- no stmt: the line consisted of just space or comments
606         POk _ Nothing -> return Nothing;
607
608         POk _ (Just rdr_stmt) -> do {
609
610       --ToDo: can't free the string buffer until we've finished this
611       -- compilation sweep and all the identifiers have gone away.
612       --freeStringBuffer buf;
613       dumpIfSet_dyn dflags Opt_D_dump_parsed "Parser" (ppr rdr_stmt);
614       return (Just rdr_stmt)
615       }}
616 #endif
617 \end{code}
618
619 %************************************************************************
620 %*                                                                      *
621 \subsection{Getting information about an identifer}
622 %*                                                                      *
623 %************************************************************************
624
625 \begin{code}
626 #ifdef GHCI
627 hscThing -- like hscStmt, but deals with a single identifier
628   :: DynFlags
629   -> HomeSymbolTable
630   -> HomeIfaceTable
631   -> PersistentCompilerState    -- IN: persistent compiler state
632   -> InteractiveContext         -- Context for compiling
633   -> String                     -- The identifier
634   -> IO ( PersistentCompilerState,
635           [TyThing] )
636
637 hscThing dflags hst hit pcs0 ic str
638    = do maybe_rdr_name <- myParseIdentifier dflags str
639         case maybe_rdr_name of {
640           Nothing -> return (pcs0, []);
641           Just rdr_name -> do
642
643         -- if the identifier is a constructor (begins with an
644         -- upper-case letter), then we need to consider both
645         -- constructor and type class identifiers.
646         let rdr_names
647                 | occNameSpace occ == dataName = [ rdr_name, tccls_name ]
648                 | otherwise                    = [ rdr_name ]
649               where
650                 occ        = rdrNameOcc rdr_name
651                 tccls_occ  = setOccNameSpace occ tcClsName
652                 tccls_name = setRdrNameOcc rdr_name tccls_occ
653
654         (pcs, unqual, maybe_rn_result) <- 
655            renameRdrName dflags hit hst pcs0 ic rdr_names
656
657         case maybe_rn_result of {
658              Nothing -> return (pcs, []);
659              Just (names, decls) -> do {
660
661         maybe_pcs <- typecheckExtraDecls dflags pcs hst unqual
662                         iNTERACTIVE decls;
663
664         case maybe_pcs of {
665              Nothing -> return (pcs, []);
666              Just pcs ->
667                 let do_lookup n
668                         | isLocalName n = lookupNameEnv (ic_type_env ic) n
669                         | otherwise     = lookupType hst (pcs_PTE pcs) n
670                 
671                     maybe_ty_things = map do_lookup names
672                 in
673                 return (pcs, catMaybes maybe_ty_things) }
674         }}}
675
676 myParseIdentifier dflags str
677   = do buf <- stringToStringBuffer str
678  
679        let exts = ExtFlags {glasgowExtsEF = dopt Opt_GlasgowExts dflags,
680                             parrEF        = dopt Opt_PArr        dflags}
681            loc  = mkSrcLoc SLIT("<interactive>") 1
682
683        case parseIdentifier buf (mkPState loc exts) of
684
685           PFailed err -> do { hPutStrLn stderr (showSDoc err);
686                               freeStringBuffer buf;
687                               return Nothing }
688
689           POk _ rdr_name -> do { --should, but can't: freeStringBuffer buf;
690                                  return (Just rdr_name) }
691 #endif
692 \end{code}
693
694 %************************************************************************
695 %*                                                                      *
696 \subsection{Find all the things defined in a module}
697 %*                                                                      *
698 %************************************************************************
699
700 \begin{code}
701 #ifdef GHCI
702 hscModuleContents
703   :: DynFlags
704   -> HomeSymbolTable
705   -> HomeIfaceTable
706   -> PersistentCompilerState    -- IN: persistent compiler state
707   -> Module                     -- module to inspect
708   -> Bool                       -- grab just the exports, or the whole toplev
709   -> IO (PersistentCompilerState, Maybe [TyThing])
710
711 hscModuleContents dflags hst hit pcs0 mod exports_only = do {
712
713   -- slurp the interface if necessary
714   (pcs1, print_unqual, maybe_rn_stuff) 
715         <- slurpIface dflags hit hst pcs0 mod;
716
717   case maybe_rn_stuff of {
718         Nothing -> return (pcs0, Nothing);
719         Just (names, rn_decls) -> do {
720
721   -- Typecheck the declarations
722   maybe_pcs <-
723      typecheckExtraDecls dflags pcs1 hst print_unqual iNTERACTIVE rn_decls;
724
725   case maybe_pcs of {
726         Nothing   -> return (pcs1, Nothing);
727         Just pcs2 -> 
728
729   let { all_names 
730            | exports_only = names
731            | otherwise =
732              let { iface = fromJust (lookupModuleEnv hit mod);
733                    env   = fromJust (mi_globals iface);
734                    range = rdrEnvElts env;
735              } in
736              -- grab all the things from the global env that are locally def'd
737              nub [ n | elts <- range, GRE n LocalDef _ <- elts ];
738
739         pte = pcs_PTE pcs2;
740
741         ty_things = map (fromJust . lookupType hst pte) all_names;
742
743       } in
744
745   return (pcs2, Just ty_things)
746   }}}}
747 #endif
748 \end{code}
749
750 %************************************************************************
751 %*                                                                      *
752 \subsection{Initial persistent state}
753 %*                                                                      *
754 %************************************************************************
755
756 \begin{code}
757 initPersistentCompilerState :: IO PersistentCompilerState
758 initPersistentCompilerState 
759   = do prs <- initPersistentRenamerState
760        return (
761         PCS { pcs_PIT   = emptyIfaceTable,
762               pcs_PTE   = wiredInThingEnv,
763               pcs_insts = emptyInstEnv,
764               pcs_rules = emptyRuleBase,
765               pcs_PRS   = prs
766             }
767         )
768
769 initPersistentRenamerState :: IO PersistentRenamerState
770   = do us <- mkSplitUniqSupply 'r'
771        return (
772         PRS { prsOrig  = NameSupply { nsUniqs = us,
773                                       nsNames = initOrigNames,
774                                       nsIPs   = emptyFM },
775               prsDecls   = (emptyNameEnv, 0),
776               prsInsts   = (emptyBag, 0),
777               prsRules   = foldr add_rule (emptyBag, 0) builtinRules,
778               prsImpMods = emptyFM
779             }
780         )
781   where
782     add_rule (name,rule) (rules, n_rules)
783          = (gated_decl `consBag` rules, n_rules+1)
784         where
785            gated_decl = (gate_fn, (mod, IfaceRuleOut rdr_name rule))
786            mod        = nameModule name
787            rdr_name   = mkRdrOrig (moduleName mod) (nameOccName name)
788            gate_fn vis_fn = vis_fn name -- Load the rule whenever name is visible
789
790 initOrigNames :: FiniteMap (ModuleName,OccName) Name
791 initOrigNames 
792    = grab knownKeyNames `plusFM` grab (map getName wiredInThings)
793      where
794         grab names = foldl add emptyFM names
795         add env name 
796            = addToFM env (moduleName (nameModule name), nameOccName name) name
797 \end{code}