git.iko.soy/rowtype-yoga/purescript-native
on golang help sign in
Check that specific data constructors do exist
3ac606dGary Burgess
examples/failing/ImportExplicit.purs+1−1
@@ -5,7 +5,7 @@ module M1 where
5
5
6module Main where
6module Main where
7
7
8− import M1 (X)
8+ import M1 (X(..))
9
9
10 testX = X
10 testX = X
11 testY = Y
11 testY = Y
examples/failing/ImportExplicit2.purs+1−1
@@ -4,4 +4,4 @@ module M1 where
4
4
5module Main where
5module Main where
6
6
7− import M1 (X)
7+ import M1 (X(..))
examples/failing/ImportExplicit3.pursnew file+7
@@ -0,0 +1,7 @@
1+module M1 where
2+
3+ data X = Y
4+
5+module Main where
6+
7+ import M1 (X(Z, Q))
src/Language/PureScript/Sugar/Names.hs+13−5
@@ -16,8 +16,8 @@ module Language.PureScript.Sugar.Names (
16 desugarImports
16 desugarImports
17) where
17) where
18
18
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
118 where
118 where
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)
122
122
@@ -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' }
233
234
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)) ++ "'"
241+
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