summaryrefslogtreecommitdiff
path: root/compiler
diff options
context:
space:
mode:
authorsimonpj@microsoft.com <unknown>2011-01-13 11:12:33 +0000
committersimonpj@microsoft.com <unknown>2011-01-13 11:12:33 +0000
commit6ffbfe99284a4e9da0ff5a55ef49bc7450d1aa00 (patch)
tree0d4417efc0eb099745be11fd1904069db41a047e /compiler
parent5882c5ff503c5b3b425708621cbc3371cc36e5de (diff)
downloadhaskell-6ffbfe99284a4e9da0ff5a55ef49bc7450d1aa00.tar.gz
Improve the finder's error messages
I'd done all the work to add fuzzy-match suggestions, but they weren't really being used! Here's what you get now module Foo where import Data.Lst Foo.hs:3:1: Failed to load interface for `Data.Lst' Perhaps you meant Data.List (from base) Data.List (needs flag -package haskell2010-1.0.0.0) Data.Int (needs flag -package haskell2010-1.0.0.0) Use -v to see a list of the files searched for.
Diffstat (limited to 'compiler')
-rw-r--r--compiler/main/Finder.lhs35
1 files changed, 28 insertions, 7 deletions
diff --git a/compiler/main/Finder.lhs b/compiler/main/Finder.lhs
index 6b6c52f6ad..5b1bae4253 100644
--- a/compiler/main/Finder.lhs
+++ b/compiler/main/Finder.lhs
@@ -26,6 +26,8 @@ module Finder (
) where
+#include "HsVersions.h"
+
import Module
import HscTypes
import Packages
@@ -45,6 +47,7 @@ import System.Directory
import System.FilePath
import Control.Monad
import System.Time ( ClockTime )
+import Data.List ( partition )
type FileExt = String -- Filename extension
@@ -561,9 +564,12 @@ cantFindErr _ multiple_found _ mod_name (FoundMultiple pkgs)
hsep (map (text.packageIdString) pkgs)]
)
cantFindErr cannot_find _ dflags mod_name find_result
- = hang (ptext cannot_find <+> quotes (ppr mod_name) <> colon)
- 2 more_info
+ = ptext cannot_find <+> quotes (ppr mod_name)
+ $$ more_info
where
+ pkg_map :: PackageConfigMap
+ pkg_map = pkgIdMap (pkgState dflags)
+
more_info
= case find_result of
NoPackage pkg
@@ -576,9 +582,11 @@ cantFindErr cannot_find _ dflags mod_name find_result
| Just pkg <- mb_pkg, pkg /= thisPackage dflags
-> not_found_in_package pkg files
+ | not (null suggest)
+ -> pp_suggestions suggest $$ tried_these files
+
| null files && null mod_hiddens && null pkg_hiddens
- -> vcat [ ptext (sLit "it is not a module in the current program, or in any known package.")
- , pp_suggestions suggest ]
+ -> ptext (sLit "It is not a module in the current program, or in any known package.")
| otherwise
-> vcat (map pkg_hidden pkg_hiddens) $$
@@ -610,7 +618,7 @@ cantFindErr cannot_find _ dflags mod_name find_result
| verbosity dflags < 3 =
ptext (sLit "Use -v to see a list of the files searched for.")
| otherwise =
- hang (ptext (sLit "locations searched:")) 2 $ vcat (map text files)
+ hang (ptext (sLit "Locations searched:")) 2 $ vcat (map text files)
pkg_hidden pkg =
ptext (sLit "It is a member of the hidden package") <+> quotes (ppr pkg)
@@ -628,9 +636,22 @@ cantFindErr cannot_find _ dflags mod_name find_result
mod_hidden pkg =
ptext (sLit "it is a hidden module in the package") <+> quotes (ppr pkg)
+ pp_suggestions :: [Module] -> SDoc
pp_suggestions sugs
| null sugs = empty
- | otherwise = ptext (sLit "Perhaps you meant") <+> vcat (map pp sugs)
+ | otherwise = hang (ptext (sLit "Perhaps you meant"))
+ 2 (vcat [ vcat (map pp_exp exposed_sugs)
+ , vcat (map pp_hid hidden_sugs) ])
where
- pp mod = ppr mod <+> parens (ptext (sLit "package") <+> ppr (modulePackageId mod))
+ (exposed_sugs, hidden_sugs) = partition from_exposed_pkg sugs
+
+ from_exposed_pkg m = case lookupPackage pkg_map (modulePackageId m) of
+ Just pkg_config -> exposed pkg_config
+ Nothing -> WARN( True, ppr m ) -- Should not happen
+ False
+
+ pp_exp mod = ppr (moduleName mod)
+ <+> parens (ptext (sLit "from") <+> ppr (modulePackageId mod))
+ pp_hid mod = ppr (moduleName mod)
+ <+> parens (ptext (sLit "needs flag -package") <+> ppr (modulePackageId mod))
\end{code}