X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Fcompiler%2Fmain%2FErrUtils.lhs;h=b6d9bade5a5894d328baf518c8a8c1f8d1e79f31;hb=d4e2c3a1d02169cdbd71577a3189d94a158e806b;hp=c5abb68aff12fb915f4a4ef4fd35cc9b13eec00b;hpb=402c1716fed6f9888f05a7431eb9ceeeb1e4bc91;p=ghc-hetmet.git diff --git a/ghc/compiler/main/ErrUtils.lhs b/ghc/compiler/main/ErrUtils.lhs index c5abb68..b6d9bad 100644 --- a/ghc/compiler/main/ErrUtils.lhs +++ b/ghc/compiler/main/ErrUtils.lhs @@ -9,17 +9,21 @@ module ErrUtils ( addShortErrLocLine, addShortWarnLocLine, addErrLocHdrLine, dontAddErrLoc, - pprBagOfErrors, pprBagOfWarnings, + printErrorsAndWarnings, pprBagOfErrors, pprBagOfWarnings, ghcExit, - doIfSet, dumpIfSet + doIfSet, doIfSet_dyn, dumpIfSet, dumpIfSet_dyn ) where #include "HsVersions.h" -import Bag ( Bag, bagToList ) +import Bag ( Bag, bagToList, isEmptyBag ) import SrcLoc ( SrcLoc, noSrcLoc ) import Util ( sortLt ) import Outputable +import CmdLineOpts ( DynFlags, DynFlag, dopt ) + +import System ( ExitCode(..), exitWith ) +import IO ( hPutStr, stderr ) \end{code} \begin{code} @@ -57,6 +61,16 @@ dontAddErrLoc title rest_of_err_msg | otherwise = ( noSrcLoc, hang (text title <> colon) 4 rest_of_err_msg ) +printErrorsAndWarnings :: (Bag WarnMsg, Bag ErrMsg) -> IO () + -- Don't print any warnings if there are errors +printErrorsAndWarnings (warns, errs) + | no_errs && no_warns = return () + | no_errs = printErrs (pprBagOfWarnings warns) + | otherwise = printErrs (pprBagOfErrors errs) + where + no_warns = isEmptyBag warns + no_errs = isEmptyBag errs + pprBagOfErrors :: Bag ErrMsg -> SDoc pprBagOfErrors bag_of_errors = vcat [text "" $$ p | (_,p) <- sorted_errs ] @@ -72,28 +86,38 @@ pprBagOfWarnings bag_of_warns = pprBagOfErrors bag_of_warns \begin{code} ghcExit :: Int -> IO () - ghcExit val - = if val /= 0 - then error "Compilation had errors\n" - else return () + | val == 0 = exitWith ExitSuccess + | otherwise = do hPutStr stderr "\nCompilation had errors\n\n" + exitWith (ExitFailure val) \end{code} \begin{code} doIfSet :: Bool -> IO () -> IO () doIfSet flag action | flag = action | otherwise = return () + +doIfSet_dyn :: DynFlags -> DynFlag -> IO () -> IO() +doIfSet_dyn dflags flag action | dopt flag dflags = action + | otherwise = return () \end{code} \begin{code} dumpIfSet :: Bool -> String -> SDoc -> IO () dumpIfSet flag hdr doc - | not flag = return () - | otherwise = printDump dump - where - dump = vcat [text "", - line <+> text hdr <+> line, - doc, - text ""] - line = text (take 20 (repeat '=')) + | not flag = return () + | otherwise = printDump (dump hdr doc) + +dumpIfSet_dyn :: DynFlags -> DynFlag -> String -> SDoc -> IO () +dumpIfSet_dyn dflags flag hdr doc + | not (dopt flag dflags) = return () + | otherwise = printDump (dump hdr doc) + +dump hdr doc + = vcat [text "", + line <+> text hdr <+> line, + doc, + text ""] + where + line = text (take 20 (repeat '=')) \end{code}