Skip to content

Commit fcb54ab

Browse files
committed
Better diagnostics
1 parent 2b82f1b commit fcb54ab

File tree

2 files changed

+30
-23
lines changed

2 files changed

+30
-23
lines changed

src/fsharp/pars.fsy

Lines changed: 27 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,6 @@ let debugPrint s = ignore s
3636

3737
let exprFromParseError (e:SynExpr) = SynExpr.FromParseError (e, e.Range)
3838

39-
let unitExprFromRange m = SynExpr.Const (SynConst.Unit, m)
40-
let unitExprFromParseError m = unitExprFromRange m |> exprFromParseError
41-
4239
let patFromParseError (e:SynPat) = SynPat.FromParseError(e, e.Range)
4340

4441
// record bindings returned by the recdExprBindings rule has shape:
@@ -319,7 +316,8 @@ let rangeOfLongIdent(lid:LongIdent) =
319316
%type <Ident> ident
320317
%type <SynType> typ typEOF
321318
%type <SynTypeDefnSig list> tyconSpfnList
322-
%type <SynArgPats> atomicPatsOrNamePatPairs
319+
%type <SynArgPats * Range> atomicPatsOrNamePatPairs
320+
%type <SynPat list> atomicPatterns
323321
%type <Range * SynExpr> patternResult
324322
%type <SynExpr> declExpr
325323
%type <SynExpr> minusExpr
@@ -3106,33 +3104,39 @@ constrPattern:
31063104

31073105
| atomicPatternLongIdent explicitValTyparDecls atomicPatsOrNamePatPairs %prec pat_app
31083106
{ let vis, lid = $1
3109-
let m = (rhs2 parseState 1 2, $3.Patterns) ||> unionRangeWithListBy (fun p -> p.Range)
3110-
SynPat.LongIdent (lid, None, Some $2, $3, vis, m) }
3107+
let args, argsM = $3
3108+
let m = unionRanges (rhs2 parseState 1 2) argsM
3109+
SynPat.LongIdent (lid, None, Some $2, args, vis, m) }
31113110

31123111
| atomicPatternLongIdent explicitValTyparDecls HIGH_PRECEDENCE_PAREN_APP atomicPatsOrNamePatPairs
31133112
{ let vis, lid = $1
3114-
let m = (rhs2 parseState 1 2, $4.Patterns) ||> unionRangeWithListBy (fun p -> p.Range)
3115-
SynPat.LongIdent (lid, None, Some $2, $4, vis, m) }
3113+
let args, argsM = $4
3114+
let m = unionRanges (rhs2 parseState 1 2) argsM
3115+
SynPat.LongIdent (lid, None, Some $2, args, vis, m) }
31163116

31173117
| atomicPatternLongIdent explicitValTyparDecls HIGH_PRECEDENCE_BRACK_APP atomicPatsOrNamePatPairs
31183118
{ let vis, lid = $1
3119-
let m = (rhs2 parseState 1 2, $4.Patterns) ||> unionRangeWithListBy (fun p -> p.Range)
3120-
SynPat.LongIdent (lid, None, Some $2, $4, vis, m) }
3119+
let args, argsM = $4
3120+
let m = unionRanges (rhs2 parseState 1 2) argsM
3121+
SynPat.LongIdent (lid, None, Some $2, args, vis, m) }
31213122

31223123
| atomicPatternLongIdent atomicPatsOrNamePatPairs %prec pat_app
31233124
{ let vis, lid = $1
3124-
let m = (rhs parseState 1, $2.Patterns) ||> unionRangeWithListBy (fun p -> p.Range)
3125-
SynPat.LongIdent (lid, None, None, $2, vis, m) }
3125+
let args, argsM = $2
3126+
let m = unionRanges (rhs parseState 1) argsM
3127+
SynPat.LongIdent (lid, None, None, args, vis, m) }
31263128

31273129
| atomicPatternLongIdent HIGH_PRECEDENCE_PAREN_APP atomicPatsOrNamePatPairs
31283130
{ let vis, lid = $1
3129-
let m = (rhs parseState 1, $3.Patterns) ||> unionRangeWithListBy (fun p -> p.Range)
3130-
SynPat.LongIdent (lid, None, None, $3, vis, m) }
3131+
let args, argsM = $3
3132+
let m = unionRanges (rhs parseState 1) argsM
3133+
SynPat.LongIdent (lid, None, None, args, vis, m) }
31313134

31323135
| atomicPatternLongIdent HIGH_PRECEDENCE_BRACK_APP atomicPatsOrNamePatPairs
31333136
{ let vis, lid = $1
3134-
let m = (rhs parseState 1, $3.Patterns) ||> unionRangeWithListBy (fun p -> p.Range)
3135-
SynPat.LongIdent (lid, None, None, $3, vis, m) }
3137+
let args, argsM = $3
3138+
let m = unionRanges (rhs parseState 1) argsM
3139+
SynPat.LongIdent (lid, None, None, args, vis, m) }
31363140

31373141
| COLON_QMARK atomTypeOrAnonRecdType %prec pat_isinst
31383142
{ SynPat.IsInst($2, lhs parseState) }
@@ -3142,10 +3146,13 @@ constrPattern:
31423146

31433147
atomicPatsOrNamePatPairs:
31443148
| LPAREN namePatPairs rparen
3145-
{ SynArgPats.NamePatPairs $2 }
3149+
{ let m = rhs2 parseState 1 3
3150+
SynArgPats.NamePatPairs $2, m }
31463151

31473152
| atomicPatterns
3148-
{ SynArgPats.Pats $1 }
3153+
{ let mWhole = rhs parseState 1
3154+
let m = (mWhole.StartRange, $1) ||> unionRangeWithListBy (fun p -> p.Range)
3155+
SynArgPats.Pats $1, m }
31493156

31503157
atomicPatterns:
31513158
| atomicPattern atomicPatterns %prec pat_args
@@ -3993,7 +4000,7 @@ patternClauses:
39934000
{ let pat, guard, patm = $1
39944001
let clauses, mLast = $4
39954002
let m = guard |> Option.map (fun e -> unionRanges patm e.Range) |> Option.defaultValue patm
3996-
(SynMatchClause(pat, guard, None, unitExprFromParseError m.EndRange, m, DebugPointAtTarget.Yes) :: clauses), mLast }
4003+
(SynMatchClause(pat, guard, None, arbExpr ("patternClauses1", m.EndRange), m, DebugPointAtTarget.Yes) :: clauses), mLast }
39974004

39984005
| patternAndGuard patternResult BAR error
39994006
{ let pat, guard, patm = $1
@@ -4016,7 +4023,7 @@ patternClauses:
40164023
let mLast = rhs parseState 2
40174024
let m = guard |> Option.map (fun e -> unionRanges patm e.Range) |> Option.defaultValue patm
40184025
// silent recovery
4019-
[SynMatchClause(pat, guard, None, unitExprFromParseError m.EndRange, m, DebugPointAtTarget.Yes)], mLast }
4026+
[SynMatchClause(pat, guard, None, arbExpr ("patternClauses2", m.EndRange), m, DebugPointAtTarget.Yes)], mLast }
40204027

40214028
patternGuard:
40224029
| WHEN declExpr

tests/service/ParserTests.fs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ match () with
5151
| x
5252
"""
5353
match getSingleExprInModule parseResults with
54-
| SynExpr.Match (_, _, [ SynMatchClause (_, _, _, SynExpr.FromParseError _, _, _) ], _) -> ()
54+
| SynExpr.Match (_, _, [ SynMatchClause (_, _, _, SynExpr.ArbitraryAfterError _, _, _) ], _) -> ()
5555
| _ -> failwith "Unexpected tree"
5656

5757

@@ -63,7 +63,7 @@ match () with
6363
"""
6464

6565
match getSingleExprInModule parseResults with
66-
| SynExpr.Match (_, _, [ SynMatchClause (_, _, _, SynExpr.FromParseError _, _, _) ], _) -> ()
66+
| SynExpr.Match (_, _, [ SynMatchClause (_, _, _, SynExpr.ArbitraryAfterError _, _, _) ], _) -> ()
6767
| _ -> failwith "Unexpected tree"
6868

6969
[<Test>]
@@ -75,5 +75,5 @@ match () with
7575
"""
7676

7777
match getSingleExprInModule parseResults with
78-
| SynExpr.Match (_, _, [ SynMatchClause (_, _, _, SynExpr.FromParseError _, _, _); _ ], _) -> ()
78+
| SynExpr.Match (_, _, [ SynMatchClause (_, _, _, SynExpr.ArbitraryAfterError _, _, _); _ ], _) -> ()
7979
| _ -> failwith "Unexpected tree"

0 commit comments

Comments
 (0)