@@ -16,8 +16,8 @@ module Language.PureScript.Sugar.Names (
16 desugarImports
16 desugarImports
19−import Data.Maybe (fromMaybe)
19+import Data.Maybe (fromMaybe, isJust)
20−import Data.List (intersect)
20+import Data.List (intersect, intercalate, (\\))
21import Data.Data
21import Data.Data
22import Data.Generics (extM, mkM, everywhereM)
22import Data.Generics (extM, mkM, everywhereM)
23import Data.Generics.Extras (mkS, extS, everywhereWithContextM')
23import Data.Generics.Extras (mkS, extS, everywhereWithContextM')
@@ -116,7 +116,7 @@ desugarImports modules = do
116 exports <- findExports modules
116 exports <- findExports modules
117 mapM (renameInModule' exports) modules
117 mapM (renameInModule' exports) modules
119− renameInModule' exports m = do
119+ renameInModule' exports m@(Module mn _) = do
120 imports <- resolveImports exports m
120 imports <- resolveImports exports m
121 rethrowForModule m (renameInModule imports m)
121 rethrowForModule m (renameInModule imports m)
@@ -225,12 +225,20 @@ resolveImports env (Module currentModule decls) =
225 importExplicit mn imp (TypeImport name dctors) = do
225 importExplicit mn imp (TypeImport name dctors) = do
226 allDctors <- allExportedDataConstructors env mn name
226 allDctors <- allExportedDataConstructors env mn name
227 types' <- updateImports mn (importedTypes imp) name
227 types' <- updateImports mn (importedTypes imp) name
228+ dctors' <- maybe (return allDctors) (check "data constructor" allDctors) dctors
228− dctors' <- foldM (updateImports mn) (importedDataConstructors imp) (fromMaybe allDctors dctors)
229+ dctors'' <- foldM (updateImports mn) (importedDataConstructors imp) dctors'
229− return $ imp { importedTypes = types', importedDataConstructors = dctors' }
230+ return $ imp { importedTypes = types', importedDataConstructors = dctors'' }
230 importExplicit mn imp (TypeClassImport name) = do
231 importExplicit mn imp (TypeClassImport name) = do
231 typeClasses' <- updateImports mn (importedTypeClasses imp) name
232 typeClasses' <- updateImports mn (importedTypeClasses imp) name
232 return $ imp { importedTypeClasses = typeClasses' }
233 return $ imp { importedTypeClasses = typeClasses' }
235+ -- Check that each item in a list of explicit imports does actually exist
236+ check :: (Show a, Eq a) => String -> [a] -> [a] -> Either String [a]
237+ check t all selected = case selected \\ all of
238+ [] -> return selected
239+ (unknown:[]) -> throwError $ "Unknown " ++ t ++ " '" ++ show unknown ++ "'"
240+ unknowns -> throwError $ "Unknown " ++ t ++ "s '" ++ (intercalate "', '" (show `map` unknowns)) ++ "'"
234 -- Import everything from a module
242 -- Import everything from a module
235 importAll :: ImportEnvironment -> ModuleName -> ExportEnvironment -> Either String ImportEnvironment
243 importAll :: ImportEnvironment -> ModuleName -> ExportEnvironment -> Either String ImportEnvironment
236 importAll imp mn env = do
244 importAll imp mn env = do