-addShortErrLocLine :: SrcLoc -> Message -> ErrMsg
-addErrLocHdrLine :: SrcLoc -> Message -> Message -> ErrMsg
-addShortWarnLocLine :: SrcLoc -> Message -> WarnMsg
-
-addShortErrLocLine locn rest_of_err_msg
- = ( locn
- , hang (ppr locn <> colon)
- 4 rest_of_err_msg
- )
-
-addErrLocHdrLine locn hdr rest_of_err_msg
- = ( locn
- , hang (ppr locn <> colon<+> hdr)
- 4 rest_of_err_msg
- )
-
-addShortWarnLocLine locn rest_of_err_msg
- = ( locn
- , hang (ppr locn <> colon)
- 4 (ptext SLIT("Warning:") <+> rest_of_err_msg)
- )
-
-dontAddErrLoc :: String -> Message -> ErrMsg
-dontAddErrLoc title rest_of_err_msg
- | null title = (noSrcLoc, rest_of_err_msg)
- | otherwise =
- ( noSrcLoc, hang (text title <> colon) 4 rest_of_err_msg )
-
-printErrorsAndWarnings :: (Bag WarnMsg, Bag ErrMsg) -> IO ()
+mkLocMessage :: SrcSpan -> Message -> Message
+mkLocMessage locn msg
+ | opt_ErrorSpans = hang (ppr locn <> colon) 4 msg
+ | otherwise = hang (ppr (srcSpanStart locn) <> colon) 4 msg
+ -- always print the location, even if it is unhelpful. Error messages
+ -- are supposed to be in a standard format, and one without a location
+ -- would look strange. Better to say explicitly "<no location info>".
+
+printError :: SrcSpan -> Message -> IO ()
+printError span msg = printErrs (mkLocMessage span msg $ defaultErrStyle)
+\end{code}
+
+Collecting up messages for later ordering and printing.
+
+\begin{code}
+data ErrMsg = ErrMsg SrcSpan Pretty.Doc
+ -- The SrcSpan 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 WarnMsg = ErrMsg
+
+-- These two are used heavily by renamer/typechecker.
+-- Be refined about qualification, return an ErrMsg
+mkErrMsg :: SrcSpan -> PrintUnqualified -> Message -> ErrMsg
+mkErrMsg locn print_unqual msg
+ = ErrMsg locn (mkLocMessage locn msg $ mkErrStyle print_unqual)
+
+mkWarnMsg :: SrcSpan -> PrintUnqualified -> Message -> WarnMsg
+mkWarnMsg = mkErrMsg
+
+type Messages = (Bag WarnMsg, Bag ErrMsg)
+
+emptyMessages :: Messages
+emptyMessages = (emptyBag, emptyBag)
+
+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 :: Messages -> IO ()