summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoman Smrž <roman.smrz@seznam.cz>2025-01-19 20:01:05 +0100
committerRoman Smrž <roman.smrz@seznam.cz>2025-01-19 22:18:26 +0100
commit340d408024980bddac83971dbef7d6a17c407382 (patch)
tree1413d32097dde665b314a388a1d48d5b8279ad5d
parent4547c9887353c6486873876e18f29ae91a5c84b4 (diff)
Export declarationHEADmaster
-rw-r--r--src/Parser.hs24
-rw-r--r--src/Parser/Core.hs3
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