diff options
author | Roman Smrž <roman.smrz@seznam.cz> | 2025-01-19 20:01:05 +0100 |
---|---|---|
committer | Roman Smrž <roman.smrz@seznam.cz> | 2025-01-19 22:18:26 +0100 |
commit | 340d408024980bddac83971dbef7d6a17c407382 (patch) | |
tree | 1413d32097dde665b314a388a1d48d5b8279ad5d | |
parent | 4547c9887353c6486873876e18f29ae91a5c84b4 (diff) |
-rw-r--r-- | src/Parser.hs | 24 | ||||
-rw-r--r-- | src/Parser/Core.hs | 3 |
2 files changed, 21 insertions, 6 deletions
diff --git a/src/Parser.hs b/src/Parser.hs index e23b277..00f6f3e 100644 --- a/src/Parser.hs +++ b/src/Parser.hs @@ -43,8 +43,8 @@ parseTestDefinition = label "test definition" $ toplevel ToplevelTest $ do wsymbol "test" lexeme $ TL.toStrict <$> takeWhileP (Just "test name") (/=':') -parseDefinition :: TestParser Toplevel -parseDefinition = label "symbol definition" $ toplevel ToplevelDefinition $ do +parseDefinition :: TestParser ( VarName, SomeExpr ) +parseDefinition = label "symbol definition" $ do def <- localState $ L.indentBlock scn $ do wsymbol "def" name <- varName @@ -94,6 +94,19 @@ parseDefinition = label "symbol definition" $ toplevel ToplevelDefinition $ do replaceArgs (SomeExpr e) = SomeExpr (go unif e) e -> e +parseExport :: TestParser [ Toplevel ] +parseExport = label "export declaration" $ toplevel id $ do + wsymbol "export" + choice + [ do + def@( name, _ ) <- parseDefinition + return [ ToplevelDefinition def, ToplevelExport name ] + , do + names <- listOf varName + void eol + return $ map ToplevelExport names + ] + parseTestModule :: FilePath -> TestParser Module parseTestModule absPath = do moduleName <- choice @@ -110,9 +123,10 @@ parseTestModule absPath = do , do return $ [ T.pack $ takeBaseName absPath ] ] - toplevels <- many $ choice - [ parseTestDefinition - , parseDefinition + toplevels <- fmap concat $ many $ choice + [ (: []) <$> parseTestDefinition + , (: []) <$> toplevel ToplevelDefinition parseDefinition + , parseExport ] let moduleTests = catMaybes $ map (\case ToplevelTest x -> Just x; _ -> Nothing) toplevels moduleDefinitions = catMaybes $ map (\case ToplevelDefinition x -> Just x; _ -> Nothing) toplevels diff --git a/src/Parser/Core.hs b/src/Parser/Core.hs index 5fb4c5f..2b8837a 100644 --- a/src/Parser/Core.hs +++ b/src/Parser/Core.hs @@ -40,6 +40,7 @@ runTestParser path content initState (TestParser parser) = runIdentity . flip (f data Toplevel = ToplevelTest Test | ToplevelDefinition ( VarName, SomeExpr ) + | ToplevelExport VarName data TestParserState = TestParserState { testVars :: [ ( VarName, SomeExprType ) ] @@ -204,7 +205,7 @@ localState inner = do put s { testNextTypeVar = testNextTypeVar s', testTypeUnif = testTypeUnif s' } return x -toplevel :: (a -> Toplevel) -> TestParser a -> TestParser Toplevel +toplevel :: (a -> b) -> TestParser a -> TestParser b toplevel f = return . f <=< L.nonIndented scn block :: (a -> [b] -> TestParser c) -> TestParser a -> TestParser b -> TestParser c |