git.iko.soy/rowtype-yoga/purescript-native
on golang help sign in
Multiple errors during name resolution
9eb1965Phil Freeman
examples/failing/MultipleErrors2.pursnew file+5
@@ -0,0 +1,5 @@
1+module MultipleErrors2 where
2+
3+foo = itDoesntExist
4+
5+bar = neitherDoesThis
src/Language/PureScript/Errors.hs+17
@@ -16,10 +16,12 @@
16
16
17module Language.PureScript.Errors where
17module Language.PureScript.Errors where
18
18
19+import Data.Either (lefts, rights)
19import Data.List (intersperse, intercalate)
20import Data.List (intersperse, intercalate)
20import Data.Monoid
21import Data.Monoid
21
22
22import Control.Monad.Error
23import Control.Monad.Error
24+import Control.Applicative ((<$>))
23
25
24import Language.PureScript.Declarations
26import Language.PureScript.Declarations
25import Language.PureScript.Pretty
27import Language.PureScript.Pretty
@@ -121,3 +123,18 @@ rethrow f = flip catchError $ \e -> throwError (f e)
121--
123--
122rethrowWithPosition :: (MonadError ErrorStack m) => SourcePos -> m a -> m a
124rethrowWithPosition :: (MonadError ErrorStack m) => SourcePos -> m a -> m a
123rethrowWithPosition pos = rethrow (positionError pos <>)
125rethrowWithPosition pos = rethrow (positionError pos <>)
126+
127+-- |
128+-- Collect errors in in parallel
129+--
130+parU :: (MonadError ErrorStack m, Functor m) => [a] -> (a -> m b) -> m [b]
131+parU xs f = forM xs (withError . f) >>= collectErrors
132+ where
133+ withError :: (MonadError ErrorStack m, Functor m) => m a -> m (Either ErrorStack a)
134+ withError u = catchError (Right <$> u) (return . Left)
135+
136+ collectErrors :: (MonadError ErrorStack m, Functor m) => [Either ErrorStack a] -> m [a]
137+ collectErrors es = case lefts es of
138+ [err] -> throwError err
139+ [] -> return $ rights es
140+ errs -> throwError $ MultipleErrors errs
src/Language/PureScript/Sugar/Names.hs+1−1
@@ -176,7 +176,7 @@ elaborateExports exps (Module mn decls _) = Module mn decls (Just $
176--
176--
177renameInModule :: ImportEnvironment -> ExportEnvironment -> Module -> Either ErrorStack Module
177renameInModule :: ImportEnvironment -> ExportEnvironment -> Module -> Either ErrorStack Module
178renameInModule imports exports (Module mn decls exps) =
178renameInModule imports exports (Module mn decls exps) =
179− Module mn <$> mapM go decls <*> pure exps
179+ Module mn <$> parU decls go <*> pure exps
180 where
180 where
181 (go, _, _, _, _) = everywhereWithContextOnValuesM (Nothing, []) updateDecl updateValue updateBinder updateCase defS
181 (go, _, _, _, _) = everywhereWithContextOnValuesM (Nothing, []) updateDecl updateValue updateBinder updateCase defS
182
182
src/Language/PureScript/TypeChecker/Monad.hs−17
@@ -28,7 +28,6 @@ import Language.PureScript.Options
28import Language.PureScript.Errors
28import Language.PureScript.Errors
29
29
30import Data.Maybe
30import Data.Maybe
31−import Data.Either (lefts, rights)
32
31
33import Control.Applicative
32import Control.Applicative
34import Control.Monad.State
33import Control.Monad.State
@@ -233,19 +232,3 @@ liftUnify unify = do
233 (a, ust) <- runUnify (defaultUnifyState { unifyNextVar = checkNextVar st }) unify
232 (a, ust) <- runUnify (defaultUnifyState { unifyNextVar = checkNextVar st }) unify
234 modify $ \st' -> st' { checkNextVar = unifyNextVar ust }
233 modify $ \st' -> st' { checkNextVar = unifyNextVar ust }
235 return (a, unifyCurrentSubstitution ust)
234 return (a, unifyCurrentSubstitution ust)
236−
237−-- |
238−-- Typecheck in parallel
239−--
240−parU :: [a] -> (a -> UnifyT t Check b) -> UnifyT t Check [b]
241−parU xs f = forM xs (withError . f) >>= collectErrors
242− where
243− withError :: UnifyT t Check a -> UnifyT t Check (Either ErrorStack a)
244− withError u = catchError (Right <$> u) (return . Left)
245−
246− collectErrors :: [Either ErrorStack a] -> UnifyT t Check [a]
247− collectErrors es = case lefts es of
248− [err] -> throwError err
249− [] -> return $ rights es
250− errs -> throwError $ MultipleErrors errs
251−