From 870b18fb6c0da0d24992a493ac22a8c009df7149 Mon Sep 17 00:00:00 2001 From: Eugene Auduchinok Date: Mon, 24 Oct 2022 19:35:43 +0200 Subject: [PATCH 1/2] Parser: recover unfinished match clause at eof --- src/Compiler/pars.fsy | 6 +++--- tests/service/ParserTests.fs | 13 +++++++++++++ 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/src/Compiler/pars.fsy b/src/Compiler/pars.fsy index a7c98422756..65714a0fc3e 100644 --- a/src/Compiler/pars.fsy +++ b/src/Compiler/pars.fsy @@ -4083,7 +4083,7 @@ patternClauses: fun _mBar -> (SynMatchClause(pat, guard, arbExpr ("patternClauses1", m.EndRange), m, DebugPointAtTarget.Yes, SynMatchClauseTrivia.Zero) :: clauses), mLast } - | patternAndGuard patternResult BAR error + | patternAndGuard patternResult BAR recover { let pat, guard = $1 let mArrow, resultExpr = $2 let mLast = rhs parseState 3 @@ -4091,14 +4091,14 @@ patternClauses: fun mBar -> [SynMatchClause(pat, guard, resultExpr, m, DebugPointAtTarget.Yes, { ArrowRange = Some mArrow; BarRange = mBar })], mLast } - | patternAndGuard patternResult error + | patternAndGuard patternResult recover { let pat, guard = $1 let mArrow, resultExpr = $2 let m = unionRanges resultExpr.Range pat.Range fun mBar -> [SynMatchClause(pat, guard, resultExpr, m, DebugPointAtTarget.Yes, { ArrowRange = Some mArrow; BarRange = mBar })], m } - | patternAndGuard error + | patternAndGuard recover { let pat, guard = $1 let patm = pat.Range let m = guard |> Option.map (fun e -> unionRanges patm e.Range) |> Option.defaultValue patm diff --git a/tests/service/ParserTests.fs b/tests/service/ParserTests.fs index cc4a9923ab7..b0d8e6e3062 100644 --- a/tests/service/ParserTests.fs +++ b/tests/service/ParserTests.fs @@ -468,3 +468,16 @@ let (1,1,1) = () [ p12; p13; p21; p23; p31; p32; p43; p51; p62 ] |> List.iter assertIsEmptyRange | _ -> failwith "Unexpected tree" + + +[] +let ``Match - Clause 01`` () = + let parseResults = getParseResults """ +match () with +| _ -> () +| _, + """ + let exprs = getSingleModuleMemberDecls parseResults |> List.map getSingleParenInnerExpr + match exprs with + | [ SynExpr.Match(_, _, [_; _], _, _) ] -> () + | _ -> failwith "Unexpected tree" From 42a246edf43732da22ed839edec923b24a4a9dc5 Mon Sep 17 00:00:00 2001 From: Eugene Auduchinok Date: Mon, 24 Oct 2022 20:47:47 +0200 Subject: [PATCH 2/2] Update test --- tests/service/ParserTests.fs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/service/ParserTests.fs b/tests/service/ParserTests.fs index b0d8e6e3062..a2e0c04c880 100644 --- a/tests/service/ParserTests.fs +++ b/tests/service/ParserTests.fs @@ -477,7 +477,7 @@ match () with | _ -> () | _, """ - let exprs = getSingleModuleMemberDecls parseResults |> List.map getSingleParenInnerExpr + let exprs = getSingleExprInModule parseResults match exprs with - | [ SynExpr.Match(_, _, [_; _], _, _) ] -> () + | SynExpr.Match(_, _, [_; _], _, _) -> () | _ -> failwith "Unexpected tree"