From 4b2dd6b968640830631b4071b962c47c541f9722 Mon Sep 17 00:00:00 2001 From: Michal Terepeta Date: Sat, 27 Nov 2010 21:13:38 +0000 Subject: [PATCH] Improve error message when importing data constructors (ticket #4058). --- compiler/rename/RnNames.lhs | 45 +++++++++++++++++++++++++++++++++++++++---- 1 file changed, 41 insertions(+), 4 deletions(-) diff --git a/compiler/rename/RnNames.lhs b/compiler/rename/RnNames.lhs index b5ed7d0..5524e2d 100644 --- a/compiler/rename/RnNames.lhs +++ b/compiler/rename/RnNames.lhs @@ -37,7 +37,7 @@ import ErrUtils import Util import FastString import ListSetOps -import Data.List ( partition, (\\), delete ) +import Data.List ( partition, (\\), delete, find ) import qualified Data.Set as Set import System.IO import Control.Monad @@ -604,7 +604,7 @@ filterImports iface decl_spec (Just (want_hiding, import_items)) all_avails lookup_ie :: Bool -> IE RdrName -> MaybeErr Message [(IE Name,AvailInfo)] lookup_ie opt_typeFamilies ie = let bad_ie :: MaybeErr Message a - bad_ie = Failed (badImportItemErr iface decl_spec ie) + bad_ie = Failed (badImportItemErr iface decl_spec ie all_avails) lookup_name rdr | isQual rdr = Failed (qualImportItemErr rdr) @@ -1456,14 +1456,51 @@ qualImportItemErr rdr = hang (ptext (sLit "Illegal qualified name in import item:")) 2 (ppr rdr) -badImportItemErr :: ModIface -> ImpDeclSpec -> IE RdrName -> SDoc -badImportItemErr iface decl_spec ie +badImportItemErrStd :: ModIface -> ImpDeclSpec -> IE RdrName -> SDoc +badImportItemErrStd iface decl_spec ie = sep [ptext (sLit "Module"), quotes (ppr (is_mod decl_spec)), source_import, ptext (sLit "does not export"), quotes (ppr ie)] where source_import | mi_boot iface = ptext (sLit "(hi-boot interface)") | otherwise = empty +badImportItemErrDataCon :: OccName -> ModIface -> ImpDeclSpec -> IE RdrName -> SDoc +badImportItemErrDataCon dataType iface decl_spec ie + = vcat [ ptext (sLit "In module") + <+> quotes (ppr (is_mod decl_spec)) + <+> source_import <> colon + , nest 2 $ quotes datacon + <+> ptext (sLit "is a data constructor of") + <+> quotes (ppr dataType) + , ptext (sLit "To import it use") + , nest 2 $ quotes (ptext (sLit "import") + <+> ppr (is_mod decl_spec) + <+> parens (ppr dataType <+> parens datacon)) + , ptext (sLit "or") + , nest 2 $ quotes (ptext (sLit "import") + <+> ppr (is_mod decl_spec) + <+> parens (ppr dataType <+> parens (ptext $ sLit ".."))) + ] + where + datacon = ppr . rdrNameOcc $ ieName ie + source_import | mi_boot iface = ptext (sLit "(hi-boot interface)") + | otherwise = empty + +badImportItemErr :: ModIface -> ImpDeclSpec -> IE RdrName -> [AvailInfo] -> SDoc +badImportItemErr iface decl_spec ie avails + = case find checkIfDataCon avails of + Just con -> badImportItemErrDataCon (availOccName con) iface decl_spec ie + Nothing -> badImportItemErrStd iface decl_spec ie + where + checkIfDataCon (AvailTC _ ns) = + case find (\n -> importedFS == nameOccNameFS n) ns of + Just n -> isDataConName n + Nothing -> False + checkIfDataCon _ = False + availOccName = nameOccName . availName + nameOccNameFS = occNameFS . nameOccName + importedFS = occNameFS . rdrNameOcc $ ieName ie + illegalImportItemErr :: SDoc illegalImportItemErr = ptext (sLit "Illegal import item") -- 1.7.10.4