From 340d408024980bddac83971dbef7d6a17c407382 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Roman=20Smr=C5=BE?= Date: Sun, 19 Jan 2025 20:01:05 +0100 Subject: Export declaration --- src/Parser.hs | 24 +++++++++++++++++++----- 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 -- cgit v1.2.3