on master help sign in
Fix parsing bug in `as` patterns that would fully commit if any spaces were seen.
28db384evancz
compiler/Parse/Patterns.hs+10−8
@@ -19,11 +19,13 @@ patternBasic =
19 return $ if isUpper c then PData x [] else PVar x
19 return $ if isUpper c then PData x [] else PVar x
20 ]
20 ]
21
21
22−patternMaybeAsVar :: Pattern -> IParser Pattern
22+asPattern :: IParser Pattern -> IParser Pattern
23−patternMaybeAsVar x =
23+asPattern pattern = do
24− choice [ PAsVar <$>
24+ p <- pattern
25− (optional whitespace *> reserved "as" *> whitespace *> lowVar) <*> pure x,
25+ var <- optionMaybe (try (whitespace >> reserved "as" >> whitespace >> lowVar))
26− pure x ]
26+ return $ case var of
27+ Just v -> PAsVar v p
28+ Nothing -> p
27
29
28patternRecord :: IParser Pattern
30patternRecord :: IParser Pattern
29patternRecord = PRecord <$> brackets (commaSep1 lowVar)
31patternRecord = PRecord <$> brackets (commaSep1 lowVar)
@@ -44,9 +46,9 @@ patternConstructor :: IParser Pattern
44patternConstructor = PData <$> capVar <*> spacePrefix patternTerm
46patternConstructor = PData <$> capVar <*> spacePrefix patternTerm
45
47
46patternExpr :: IParser Pattern
48patternExpr :: IParser Pattern
47−patternExpr = (patternMaybeAsVar =<<
49+patternExpr =
48− (foldr1 pcons <$> consSep1 (patternConstructor <|> patternTerm)))
50+ asPattern (foldr1 pcons <$> consSep1 (patternConstructor <|> patternTerm))
49− <?> "pattern"
51+ <?> "pattern"
50
52
51makeLambda :: [Pattern] -> CExpr -> GuidCounter CExpr
53makeLambda :: [Pattern] -> CExpr -> GuidCounter CExpr
52makeLambda pats body = go (reverse pats) body
54makeLambda pats body = go (reverse pats) body
compiler/Transform/Replace.hs+1−1
@@ -33,7 +33,7 @@ patternVars pattern =
33 case pattern of
33 case pattern of
34 PData _ ps -> unions (map patternVars ps)
34 PData _ ps -> unions (map patternVars ps)
35 PVar x -> singleton x
35 PVar x -> singleton x
36− PAsVar _ p -> patternVars p
36+ PAsVar x p -> insert x (patternVars p)
37 PAnything -> empty
37 PAnything -> empty
38
38
39depth :: Expr -> Integer
39depth :: Expr -> Integer