allow "let x : A = e in s" with type annotation
This commit is contained in:
parent
54db7e27ef
commit
aa4ead592a
2 changed files with 15 additions and 7 deletions
|
@ -593,15 +593,21 @@ letIntro fname =
|
|||
<|> withLoc fname (Just . PQ Any <$ res "letω")
|
||||
<|> Nothing <$ resC "let"
|
||||
|
||||
export
|
||||
private
|
||||
letBinder : FileName -> Maybe PQty -> Grammar True (PQty, PatVar, PTerm)
|
||||
letBinder fname mq = do
|
||||
qty <- the (Grammar False PQty) $ case mq of
|
||||
Just q => pure q
|
||||
Nothing => qty fname <* mustWork (resC ".") <|> defLoc fname (PQ One)
|
||||
x <- patVar fname; mustWork (resC "=")
|
||||
rhs <- term fname
|
||||
pure $ (qty, x, rhs)
|
||||
qty <- letQty fname mq
|
||||
x <- patVar fname
|
||||
type <- optional $ resC ":" *> term fname
|
||||
rhs <- resC "=" *> term fname
|
||||
pure (qty, x, makeLetRhs rhs type)
|
||||
where
|
||||
letQty : FileName -> Maybe PQty -> Grammar False PQty
|
||||
letQty fname Nothing = qty fname <* mustWork (resC ".") <|> defLoc fname (PQ One)
|
||||
letQty fname (Just q) = pure q
|
||||
|
||||
makeLetRhs : PTerm -> Maybe PTerm -> PTerm
|
||||
makeLetRhs tm ty = maybe tm (\t => Ann tm t (extendL tm.loc t.loc)) ty
|
||||
|
||||
export
|
||||
letTerm : FileName -> Grammar True PTerm
|
||||
|
|
|
@ -422,6 +422,8 @@ tests = "parser" :- [
|
|||
`(Let (PQ One _, PV "x" {}, V "y" {}) (V "z" {}) _),
|
||||
parseMatch term "letω x = y in z"
|
||||
`(Let (PQ Any _, PV "x" {}, V "y" {}) (V "z" {}) _),
|
||||
parseMatch term "letω x : X = y in z"
|
||||
`(Let (PQ Any _, PV "x" {}, Ann (V "y" {}) (V "X" {}) _) (V "z" {}) _),
|
||||
parseMatch term "let ω.x = y in z"
|
||||
`(Let (PQ Any _, PV "x" {}, V "y" {}) (V "z" {}) _),
|
||||
parseMatch term "let x = y1 y2 in z1 z2"
|
||||
|
|
Loading…
Reference in a new issue