Commit 4b2dd6b9 authored by Michal Terepeta's avatar Michal Terepeta

Improve error message when importing data constructors (ticket #4058).

parent 8625c675
......@@ -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")
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment