summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoman Smrž <roman.smrz@seznam.cz>2026-08-26 21:50:12 +0200
committerRoman Smrž <roman.smrz@seznam.cz>2026-08-27 23:04:38 +0200
commit74c751399fc7922d51b2ac8e1987c78b5a65cfdc (patch)
tree142737e3f80f074d0d358bbdbba37a122d613fe7
parent4145e966859dccc5bf7fac1f1c74b3efd8b6b7e9 (diff)
Type annotations in arguments of function definition
-rw-r--r--src/Parser.hs27
-rw-r--r--test/asset/parser/type-annotation.et6
2 files changed, 24 insertions, 9 deletions
diff --git a/src/Parser.hs b/src/Parser.hs
index 62549eb..5d545af 100644
--- a/src/Parser.hs
+++ b/src/Parser.hs
@@ -80,11 +80,12 @@ parseDefinition href = label "symbol definition" $ do
def@( name, expr ) <- localState $ do
wsymbol "def"
name <- varName
- argsDecl <- functionArguments (\off _ -> return . ( off, )) varName mzero (\_ -> return . VarName)
- atypes <- forM argsDecl $ \( off, vname :: VarName ) -> do
- tvar <- newTypeVar
- modify $ \s -> s { testVars = ( vname, ( LocalVarName vname, ExprTypeVar tvar )) : testVars s }
- return ( off, vname, tvar )
+ argsDecl <- functionArguments (\off _ -> return . ( off, ))
+ (typeAnnotated varName) mzero (\_ -> return . (, Nothing) . VarName)
+ atypes <- forM argsDecl $ \( off, ( vname :: VarName, mbstype :: Maybe SomeExprType ) ) -> do
+ stype <- maybe (ExprTypeVar <$> newTypeVar) return mbstype
+ modify $ \s -> s { testVars = ( vname, ( LocalVarName vname, stype )) : testVars s }
+ return ( off, vname, stype )
SomeExpr expr <- choice
[ do
osymbol ":"
@@ -102,8 +103,8 @@ parseDefinition href = label "symbol definition" $ do
modify $ \s -> s { testVars = ( name, ( GlobalVarName (testCurrentModuleName s) name, someExprType expr )) : testVars s }
return def
where
- getInferredTypes atypes = forM atypes $ \( _, vname, tvar ) -> do
- ( vname, ) . SomeArgumentType OptionalArgument <$> typeClosure (ExprTypeVar tvar)
+ getInferredTypes atypes = forM atypes $ \( _, vname, stype ) -> do
+ ( vname, ) . SomeArgumentType OptionalArgument <$> typeClosure stype
replaceDynArgs :: forall a. Expr a -> TestParser (Expr a)
replaceDynArgs expr = do
@@ -120,6 +121,18 @@ parseDefinition href = label "symbol definition" $ do
replaceArgs (SomeExpr e) = SomeExpr (go unif e)
e -> e
+ typeAnnotated p = do
+ x <- p
+ choice
+ [ do
+ void $ osymbol ":"
+ stype <- typeExpr
+ return ( x, Just stype )
+
+ , do
+ return ( x, Nothing )
+ ]
+
parseAsset :: Pos -> TestParser ( VarName, SomeExpr )
parseAsset href = label "asset definition" $ do
wsymbol "asset"
diff --git a/test/asset/parser/type-annotation.et b/test/asset/parser/type-annotation.et
index 5fbf323..811b54b 100644
--- a/test/asset/parser/type-annotation.et
+++ b/test/asset/parser/type-annotation.et
@@ -1,6 +1,8 @@
-def fun (a) and b:
- let c = [ a : String, "x" ]
+def fun (a : String) and (b : String):
+ let c = [ a, "x" ]
let d = [ b : String, "y" : String ]
+ guard (c /= d)
test Test:
let x = "" : String
+ fun "a" and "b"