Another round of External Core fixes
[ghc-hetmet.git] / compiler / main / Main.hs
index dc03f64..4c31fcd 100644 (file)
@@ -1,10 +1,4 @@
 {-# OPTIONS -fno-warn-incomplete-patterns -optc-DNON_POSIX_SOURCE #-}
-{-# OPTIONS -w #-}
--- The above warning supression flag is a temporary kludge.
--- While working on this module you are encouraged to remove it and fix
--- any warnings in the module. See
---     http://hackage.haskell.org/trac/ghc/wiki/Commentary/CodingStyle#Warnings
--- for details
 
 -----------------------------------------------------------------------------
 --
@@ -43,7 +37,7 @@ import StaticFlags
 import DynFlags
 import BasicTypes      ( failed )
 import ErrUtils                ( putMsg )
-import FastString      ( getFastStringTable, isZEncoded, hasZEncoding )
+import FastString
 import Outputable
 import Util
 import Panic
@@ -71,6 +65,7 @@ import Data.Maybe
 -----------------------------------------------------------------------------
 -- GHC's command-line interface
 
+main :: IO ()
 main =
   GHC.defaultErrorHandler defaultDynFlags $ do
   
@@ -179,12 +174,13 @@ main =
     DoMkDependHS           -> doMkDependHS session (map fst srcs)
     StopBefore p           -> oneShot dflags p srcs
     DoInteractive          -> interactiveUI session srcs Nothing
-    DoEval expr            -> interactiveUI session srcs (Just expr)
+    DoEval exprs           -> interactiveUI session srcs $ Just $ reverse exprs
 
   dumpFinalStats dflags
   exitWith ExitSuccess
 
 #ifndef GHCI
+interactiveUI :: a -> b -> c -> IO ()
 interactiveUI _ _ _ = 
   throwDyn (CmdLineError "not built for interactive use")
 #endif
@@ -194,6 +190,8 @@ interactiveUI _ _ _ =
 -- interpret the -x <suffix> option, and attach a (Maybe Phase) to each source
 -- file indicating the phase specified by the -x option in force, if any.
 
+partition_args :: [String] -> [(String, Maybe Phase)] -> [String]
+               -> ([(String, Maybe Phase)], [String])
 partition_args [] srcs objs = (reverse srcs, reverse objs)
 partition_args ("-x":suff:args) srcs objs
   | "none" <- suff     = partition_args args srcs objs
@@ -223,6 +221,7 @@ partition_args (arg:args) srcs objs
       Everything else is considered to be a linker object, and passed
       straight through to the linker.
     -}
+looks_like_an_input :: String -> Bool
 looks_like_an_input m =  isSourceFilename m 
                      || looksLikeModuleName m
                      || '.' `notElem` m
@@ -316,20 +315,22 @@ data CmdLineMode
                             -- StopBefore StopLn is the default
   | DoMake                  -- ghc --make
   | DoInteractive           -- ghc --interactive
-  | DoEval String           -- ghc -e
+  | DoEval [String]         -- ghc -e foo -e bar => DoEval ["bar", "foo"]
   deriving (Show)
 
-isInteractiveMode, isInterpretiveMode     :: CmdLineMode -> Bool
-isLinkMode, isCompManagerMode :: CmdLineMode -> Bool
-
+#ifdef GHCI
+isInteractiveMode :: CmdLineMode -> Bool
 isInteractiveMode DoInteractive = True
 isInteractiveMode _            = False
+#endif
 
 -- isInterpretiveMode: byte-code compiler involved
+isInterpretiveMode :: CmdLineMode -> Bool
 isInterpretiveMode DoInteractive = True
 isInterpretiveMode (DoEval _)    = True
 isInterpretiveMode _             = False
 
+needsInputsMode :: CmdLineMode -> Bool
 needsInputsMode DoMkDependHS   = True
 needsInputsMode (StopBefore _) = True
 needsInputsMode DoMake         = True
@@ -337,10 +338,12 @@ needsInputsMode _         = False
 
 -- True if we are going to attempt to link in this mode.
 -- (we might not actually link, depending on the GhcLink flag)
+isLinkMode :: CmdLineMode -> Bool
 isLinkMode (StopBefore StopLn) = True
 isLinkMode DoMake             = True
 isLinkMode _                          = False
 
+isCompManagerMode :: CmdLineMode -> Bool
 isCompManagerMode DoMake        = True
 isCompManagerMode DoInteractive = True
 isCompManagerMode (DoEval _)    = True
@@ -376,31 +379,38 @@ mode_flags =
 
       ------- interfaces ----------------------------------------------------
   ,  ( "-show-iface"     , HasArg (\f -> setMode (ShowInterface f)
-                                         "--show-iface"))
+                                                 "--show-iface"))
 
       ------- primary modes ------------------------------------------------
-  ,  ( "M"             , PassFlag (setMode DoMkDependHS))
-  ,  ( "E"             , PassFlag (setMode (StopBefore anyHsc)))
-  ,  ( "C"             , PassFlag (\f -> do setMode (StopBefore HCc) f
-                                            addFlag "-fvia-C"))
-  ,  ( "S"             , PassFlag (setMode (StopBefore As)))
-  ,  ( "-make"         , PassFlag (setMode DoMake))
-  ,  ( "-interactive"  , PassFlag (setMode DoInteractive))
-  ,  ( "e"              , HasArg   (\s -> setMode (DoEval s) "-e"))
-
-       -- -fno-code says to stop after Hsc but don't generate any code.
-  ,  ( "fno-code"      , PassFlag (\f -> do setMode (StopBefore HCc) f
-                                            addFlag "-fno-code"
-                                            addFlag "-no-recomp"))
+  ,  ( "M"              , PassFlag (setMode DoMkDependHS))
+  ,  ( "E"              , PassFlag (setMode (StopBefore anyHsc)))
+  ,  ( "C"              , PassFlag (\f -> do setMode (StopBefore HCc) f
+                                             addFlag "-fvia-C"))
+  ,  ( "S"              , PassFlag (setMode (StopBefore As)))
+  ,  ( "-make"          , PassFlag (setMode DoMake))
+  ,  ( "-interactive"   , PassFlag (setMode DoInteractive))
+  ,  ( "e"              , HasArg   (\s -> updateMode (updateDoEval s) "-e"))
+
+       -- -fno-code says to stop after Hsc but don't generate any code.
+  ,  ( "fno-code"       , PassFlag (\f -> do setMode (StopBefore HCc) f
+                                             addFlag "-fno-code"
+                                             addFlag "-no-recomp"))
   ]
 
 setMode :: CmdLineMode -> String -> ModeM ()
-setMode m flag = do
+setMode m flag = updateMode (\_ -> m) flag
+
+updateDoEval :: String -> CmdLineMode -> CmdLineMode
+updateDoEval expr (DoEval exprs) = DoEval (expr : exprs)
+updateDoEval expr _              = DoEval [expr]
+
+updateMode :: (CmdLineMode -> CmdLineMode) -> String -> ModeM ()
+updateMode f flag = do
   (old_mode, old_flag, flags) <- getCmdLineState
   if notNull old_flag && flag /= old_flag
       then throwDyn (UsageError
                ("cannot use `" ++ old_flag ++ "' with `" ++ flag ++ "'"))
-      else putCmdLineState (m, flag, flags)
+      else putCmdLineState (f old_mode, flag, flags)
 
 addFlag :: String -> ModeM ()
 addFlag s = do
@@ -412,13 +422,13 @@ addFlag s = do
 -- Run --make mode
 
 doMake :: Session -> [(String,Maybe Phase)] -> IO ()
-doMake sess []    = throwDyn (UsageError "no input files")
+doMake _    []    = throwDyn (UsageError "no input files")
 doMake sess srcs  = do 
     let (hs_srcs, non_hs_srcs) = partition haskellish srcs
 
        haskellish (f,Nothing) = 
          looksLikeModuleName f || isHaskellSrcFilename f || '.' `notElem` f
-       haskellish (f,Just phase) = 
+       haskellish (_,Just phase) = 
          phase `notElem` [As, Cc, CmmCpp, Cmm, StopLn]
 
     dflags <- GHC.getSessionDynFlags sess
@@ -444,12 +454,12 @@ doShowIface dflags file = do
 -- Various banners and verbosity output.
 
 showBanner :: CmdLineMode -> DynFlags -> IO ()
-showBanner cli_mode dflags = do
+showBanner _cli_mode dflags = do
    let verb = verbosity dflags
 
 #ifdef GHCI
    -- Show the GHCi banner
-   when (isInteractiveMode cli_mode && verb >= 1) $ putStrLn ghciWelcomeMsg
+   when (isInteractiveMode _cli_mode && verb >= 1) $ putStrLn ghciWelcomeMsg
 #endif
 
    -- Display details of the configuration in verbose mode
@@ -478,6 +488,7 @@ showVersion = do
   putStrLn (cProjectName ++ ", version " ++ cProjectVersion)
   exitWith ExitSuccess
 
+showGhcUsage :: DynFlags -> CmdLineMode -> IO ()
 showGhcUsage dflags cli_mode = do 
   let usage_path 
        | DoInteractive <- cli_mode = ghciUsagePath dflags
@@ -513,7 +524,8 @@ dumpFastStringStats dflags = do
   putMsg dflags msg
   where
    x `pcntOf` y = int ((x * 100) `quot` y) <> char '%'
-  
+
+countFS :: Int -> Int -> Int -> Int -> [[FastString]] -> (Int, Int, Int, Int)
 countFS entries longest is_z has_z [] = (entries, longest, is_z, has_z)
 countFS entries longest is_z has_z (b:bs) = 
   let