X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Fcompiler%2Fmain%2FErrUtils.lhs;h=a33098a42c3bfb991054cf18cacfdc52cbdcdcb3;hb=3a223cd2811d46295048b3a2dab11403ca291b20;hp=a262bd685fcfb9c77944f8582a9c03f2b25a8688;hpb=51a571c0f5b0201ea53bec60fcaafb78c01c017e;p=ghc-hetmet.git diff --git a/ghc/compiler/main/ErrUtils.lhs b/ghc/compiler/main/ErrUtils.lhs index a262bd6..a33098a 100644 --- a/ghc/compiler/main/ErrUtils.lhs +++ b/ghc/compiler/main/ErrUtils.lhs @@ -5,100 +5,123 @@ \begin{code} module ErrUtils ( - ErrMsg, WarnMsg, Message, Messages, errorsFound, warningsFound, + ErrMsg, WarnMsg, Message, + Messages, errorsFound, emptyMessages, addShortErrLocLine, addShortWarnLocLine, addErrLocHdrLine, addWarnLocHdrLine, dontAddErrLoc, printErrorsAndWarnings, pprBagOfErrors, pprBagOfWarnings, + printError, ghcExit, doIfSet, doIfSet_dyn, - dumpIfSet, dumpIfSet_core, dumpIfSet_dyn, dumpIfSet_dyn_or, + dumpIfSet, dumpIfSet_core, dumpIfSet_dyn, dumpIfSet_dyn_or, mkDumpDoc, showPass ) where #include "HsVersions.h" -import Bag ( Bag, bagToList, isEmptyBag ) +import Bag ( Bag, bagToList, isEmptyBag, emptyBag ) import SrcLoc ( SrcLoc, noSrcLoc, isGoodSrcLoc ) import Util ( sortLt ) import Outputable +import qualified Pretty import CmdLineOpts ( DynFlags(..), DynFlag(..), dopt ) +import List ( replicate ) import System ( ExitCode(..), exitWith ) -import IO ( hPutStr, stderr ) +import IO ( hPutStr, hPutStrLn, stderr, stdout ) \end{code} \begin{code} -type MsgWithLoc = (SrcLoc, SDoc) +type MsgWithLoc = (SrcLoc, Pretty.Doc) + -- The SrcLoc is used for sorting errors into line-number order + -- NB Pretty.Doc not SDoc: we deal with the printing style (in ptic + -- whether to qualify an External Name) at the error occurrence type ErrMsg = MsgWithLoc type WarnMsg = MsgWithLoc type Message = SDoc -addShortErrLocLine :: SrcLoc -> Message -> ErrMsg -addErrLocHdrLine :: SrcLoc -> Message -> Message -> ErrMsg -addWarnLocHdrLine :: SrcLoc -> Message -> Message -> ErrMsg -addShortWarnLocLine :: SrcLoc -> Message -> WarnMsg - -addShortErrLocLine locn rest_of_err_msg - | isGoodSrcLoc locn = (locn, hang (ppr locn <> colon) 4 - rest_of_err_msg) - | otherwise = (locn, rest_of_err_msg) - -addErrLocHdrLine locn hdr rest_of_err_msg - = ( locn - , hang (ppr locn <> colon<+> hdr) - 4 rest_of_err_msg - ) - -addWarnLocHdrLine locn hdr rest_of_err_msg - = ( locn - , hang (ppr locn <> colon <+> ptext SLIT("Warning:") <+> hdr) - 4 (rest_of_err_msg) - ) - -addShortWarnLocLine locn rest_of_err_msg - | isGoodSrcLoc locn = (locn, hang (ppr locn <> colon) 4 - (ptext SLIT("Warning:") <+> rest_of_err_msg)) - | otherwise = (locn, rest_of_err_msg) +addShortErrLocLine :: SrcLoc -> PrintUnqualified -> Message -> ErrMsg +addShortWarnLocLine :: SrcLoc -> PrintUnqualified -> Message -> WarnMsg + -- Used heavily by renamer/typechecker + -- Be refined about qualification, return an ErrMsg -dontAddErrLoc :: Message -> ErrMsg -dontAddErrLoc msg = (noSrcLoc, msg) +addErrLocHdrLine :: SrcLoc -> Message -> Message -> Message +addWarnLocHdrLine :: SrcLoc -> Message -> Message -> Message + -- Used by Lint and other system stuff + -- Always print qualified, return a Message + +addShortErrLocLine locn print_unqual msg + = (locn, doc (mkErrStyle print_unqual)) + where + doc = mkErrDoc locn msg + +addShortWarnLocLine locn print_unqual msg + = (locn, doc (mkErrStyle print_unqual)) + where + doc = mkWarnDoc locn msg + +addErrLocHdrLine locn hdr msg + = mkErrDoc locn (hdr $$ msg) +addWarnLocHdrLine locn hdr msg + = mkWarnDoc locn (hdr $$ msg) + +dontAddErrLoc :: Message -> ErrMsg +dontAddErrLoc msg = (noSrcLoc, msg defaultErrStyle) + +mkErrDoc locn msg + | isGoodSrcLoc locn = hang (ppr locn <> colon) 4 msg + | otherwise = msg + +mkWarnDoc locn msg + | isGoodSrcLoc locn = hang (ppr locn <> colon) 4 warn_msg + | otherwise = warn_msg + where + warn_msg = ptext SLIT("Warning:") <+> msg \end{code} +\begin{code} +printError :: String -> IO () +printError str = hPutStrLn stderr str +\end{code} \begin{code} type Messages = (Bag WarnMsg, Bag ErrMsg) -errorsFound :: Messages -> Bool -errorsFound (warns, errs) = not (isEmptyBag errs) +emptyMessages :: Messages +emptyMessages = (emptyBag, emptyBag) -warningsFound :: Messages -> Bool -warningsFound (warns, errs) = not (isEmptyBag warns) +errorsFound :: DynFlags -> Messages -> Bool +-- The dyn-flags are used to see if the user has specified +-- -Werorr, which says that warnings should be fatal +errorsFound dflags (warns, errs) + | dopt Opt_WarnIsError dflags = not (isEmptyBag errs) || not (isEmptyBag warns) + | otherwise = not (isEmptyBag errs) -printErrorsAndWarnings :: PrintUnqualified -> Messages -> IO () +printErrorsAndWarnings :: Messages -> IO () -- Don't print any warnings if there are errors -printErrorsAndWarnings unqual (warns, errs) +printErrorsAndWarnings (warns, errs) | no_errs && no_warns = return () - | no_errs = printErrs unqual (pprBagOfWarnings warns) - | otherwise = printErrs unqual (pprBagOfErrors errs) + | no_errs = printErrs (pprBagOfWarnings warns) + | otherwise = printErrs (pprBagOfErrors errs) where no_warns = isEmptyBag warns no_errs = isEmptyBag errs -pprBagOfErrors :: Bag ErrMsg -> SDoc +pprBagOfErrors :: Bag ErrMsg -> Pretty.Doc pprBagOfErrors bag_of_errors - = vcat [text "" $$ p | (_,p) <- sorted_errs ] + = Pretty.vcat [Pretty.text "" Pretty.$$ p | (_,p) <- sorted_errs ] where bag_ls = bagToList bag_of_errors sorted_errs = sortLt occ'ed_before bag_ls occ'ed_before (a,_) (b,_) = LT == compare a b -pprBagOfWarnings :: Bag WarnMsg -> SDoc +pprBagOfWarnings :: Bag WarnMsg -> Pretty.Doc pprBagOfWarnings bag_of_warns = pprBagOfErrors bag_of_warns \end{code} @@ -129,32 +152,36 @@ showPass dflags what dumpIfSet :: Bool -> String -> SDoc -> IO () dumpIfSet flag hdr doc | not flag = return () - | otherwise = printDump (dump hdr doc) + | otherwise = printDump (mkDumpDoc hdr doc) dumpIfSet_core :: DynFlags -> DynFlag -> String -> SDoc -> IO () dumpIfSet_core dflags flag hdr doc | dopt flag dflags || verbosity dflags >= 4 - || dopt Opt_D_verbose_core2core dflags = printDump (dump hdr doc) + || dopt Opt_D_verbose_core2core dflags = printDump (mkDumpDoc hdr doc) | otherwise = return () dumpIfSet_dyn :: DynFlags -> DynFlag -> String -> SDoc -> IO () dumpIfSet_dyn dflags flag hdr doc - | dopt flag dflags || verbosity dflags >= 4 = printDump (dump hdr doc) - | otherwise = return () + | dopt flag dflags || verbosity dflags >= 4 + = if flag `elem` [Opt_D_dump_stix, Opt_D_dump_asm] + then printForC stdout (mkDumpDoc hdr doc) + else printDump (mkDumpDoc hdr doc) + | otherwise + = return () dumpIfSet_dyn_or :: DynFlags -> [DynFlag] -> String -> SDoc -> IO () dumpIfSet_dyn_or dflags flags hdr doc | or [dopt flag dflags | flag <- flags] || verbosity dflags >= 4 - = printDump (dump hdr doc) + = printDump (mkDumpDoc hdr doc) | otherwise = return () -dump hdr doc +mkDumpDoc hdr doc = vcat [text "", line <+> text hdr <+> line, doc, text ""] where - line = text (take 20 (repeat '=')) + line = text (replicate 20 '=') \end{code}