summaryrefslogtreecommitdiff
path: root/src/Parser.hs
diff options
context:
space:
mode:
Diffstat (limited to 'src/Parser.hs')
-rw-r--r--src/Parser.hs31
1 files changed, 14 insertions, 17 deletions
diff --git a/src/Parser.hs b/src/Parser.hs
index d90b796..b2d666c 100644
--- a/src/Parser.hs
+++ b/src/Parser.hs
@@ -2,9 +2,11 @@
module Parser (
parseTestFiles,
+ CustomTestError(..),
) where
import Control.Monad
+import Control.Monad.Except
import Control.Monad.State
import Data.IORef
@@ -22,7 +24,6 @@ import Text.Megaparsec.Char
import Text.Megaparsec.Char.Lexer qualified as L
import System.Directory
-import System.Exit
import System.FilePath
import System.IO.Error
@@ -174,27 +175,23 @@ parseTestModule absPath = do
eof
return Module {..}
-parseTestFiles :: [ FilePath ] -> IO ( [ Module ], [ Module ] )
+parseTestFiles :: [ FilePath ] -> IO (Either CustomTestError ( [ Module ], [ Module ] ))
parseTestFiles paths = do
parsedModules <- newIORef []
- requestedModules <- reverse <$> foldM (go parsedModules) [] paths
- allModules <- map snd <$> readIORef parsedModules
- return ( requestedModules, allModules )
+ runExceptT $ do
+ requestedModules <- reverse <$> foldM (go parsedModules) [] paths
+ allModules <- map snd <$> liftIO (readIORef parsedModules)
+ return ( requestedModules, allModules )
where
go parsedModules res path = do
- let moduleName = error "current module name should be set at the beginning of parseTestModule"
- parseTestFile parsedModules moduleName path >>= \case
- Left (ImportModuleError bundle) -> do
- putStr (errorBundlePretty bundle)
- exitFailure
+ liftIO (parseTestFile parsedModules Nothing path) >>= \case
Left err -> do
- putStr (showErrorComponent err)
- exitFailure
+ throwError err
Right cur -> do
return $ cur : res
-parseTestFile :: IORef [ ( FilePath, Module ) ] -> ModuleName -> FilePath -> IO (Either CustomTestError Module)
-parseTestFile parsedModules moduleName path = do
+parseTestFile :: IORef [ ( FilePath, Module ) ] -> Maybe ModuleName -> FilePath -> IO (Either CustomTestError Module)
+parseTestFile parsedModules mbModuleName path = do
absPath <- makeAbsolute path
(lookup absPath <$> readIORef parsedModules) >>= \case
Just found -> return $ Right found
@@ -207,10 +204,10 @@ parseTestFile parsedModules moduleName path = do
, testContext = SomeExpr (Undefined "void" :: Expr Void)
, testNextTypeVar = 0
, testTypeUnif = M.empty
- , testCurrentModuleName = moduleName
+ , testCurrentModuleName = fromMaybe (error "current module name should be set at the beginning of parseTestModule") mbModuleName
, testParseModule = \(ModuleName current) mname@(ModuleName imported) -> do
let projectRoot = iterate takeDirectory absPath !! length current
- parseTestFile parsedModules mname $ projectRoot </> foldr (</>) "" (map T.unpack imported) <.> takeExtension absPath
+ parseTestFile parsedModules (Just mname) $ projectRoot </> foldr (</>) "" (map T.unpack imported) <.> takeExtension absPath
}
mbContent <- (Just <$> TL.readFile path) `catchIOError` \e ->
if isDoesNotExistError e then return Nothing else ioError e
@@ -222,4 +219,4 @@ parseTestFile parsedModules moduleName path = do
Right testModule -> do
modifyIORef parsedModules (( absPath, testModule ) : )
return $ Right testModule
- Nothing -> return $ Left $ ModuleNotFound moduleName
+ Nothing -> return $ Left $ maybe (FileNotFound path) ModuleNotFound mbModuleName