Skip to content

Commit c208e5c

Browse files
authored
Add SynArgPatsNamePatPairsTrivia to SynArgPats.NamePatPairs. (#14009)
1 parent ca85fd8 commit c208e5c

File tree

10 files changed

+57
-12
lines changed

10 files changed

+57
-12
lines changed

src/Compiler/Checking/CheckPatterns.fs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -471,13 +471,13 @@ and TcNullPat cenv env patEnv ty m =
471471
and CheckNoArgsForLiteral args m =
472472
match args with
473473
| SynArgPats.Pats []
474-
| SynArgPats.NamePatPairs ([], _) -> ()
474+
| SynArgPats.NamePatPairs (pats = []) -> ()
475475
| _ -> errorR (Error (FSComp.SR.tcLiteralDoesNotTakeArguments (), m))
476476

477477
and GetSynArgPatterns args =
478478
match args with
479479
| SynArgPats.Pats args -> args
480-
| SynArgPats.NamePatPairs (pairs, _) -> List.map (fun (_, _, pat) -> pat) pairs
480+
| SynArgPats.NamePatPairs (pats = pairs) -> List.map (fun (_, _, pat) -> pat) pairs
481481

482482
and TcArgPats warnOnUpper (cenv: cenv) env vFlags patEnv args =
483483
let g = cenv.g
@@ -600,7 +600,7 @@ and TcPatLongIdentUnionCaseOrExnCase warnOnUpper cenv env ad vFlags patEnv ty (m
600600
let args, extraPatternsFromNames =
601601
match args with
602602
| SynArgPats.Pats args -> args, []
603-
| SynArgPats.NamePatPairs (pairs, m) ->
603+
| SynArgPats.NamePatPairs (pairs, m, _) ->
604604
// rewrite patterns from the form (name-N = pat-N; ...) to (..._, pat-N, _...)
605605
// so type T = Case of name: int * value: int
606606
// | Case(value = v)

src/Compiler/Service/ServiceParseTreeWalk.fs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -797,7 +797,7 @@ module SyntaxTraversal =
797797
| SynPat.LongIdent (argPats = args) ->
798798
match args with
799799
| SynArgPats.Pats ps -> ps |> List.tryPick (traversePat path)
800-
| SynArgPats.NamePatPairs (ps, _) -> ps |> List.map (fun (_, _, pat) -> pat) |> List.tryPick (traversePat path)
800+
| SynArgPats.NamePatPairs (pats = ps) -> ps |> List.map (fun (_, _, pat) -> pat) |> List.tryPick (traversePat path)
801801
| SynPat.Typed (p, ty, _) ->
802802
match traversePat path p with
803803
| None -> traverseSynType path ty

src/Compiler/Service/ServiceParsedInputOps.fs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -556,7 +556,7 @@ module ParsedInput =
556556
let (|ConstructorPats|) pats =
557557
match pats with
558558
| SynArgPats.Pats ps -> ps
559-
| SynArgPats.NamePatPairs (xs, _) -> List.map (fun (_, _, pat) -> pat) xs
559+
| SynArgPats.NamePatPairs (pats = xs) -> List.map (fun (_, _, pat) -> pat) xs
560560

561561
/// A recursive pattern that collect all sequential expressions to avoid StackOverflowException
562562
let rec (|Sequentials|_|) expr =
@@ -1566,7 +1566,7 @@ module ParsedInput =
15661566
let (|ConstructorPats|) pats =
15671567
match pats with
15681568
| SynArgPats.Pats ps -> ps
1569-
| SynArgPats.NamePatPairs (xs, _) -> List.map (fun (_, _, pat) -> pat) xs
1569+
| SynArgPats.NamePatPairs (pats = xs) -> List.map (fun (_, _, pat) -> pat) xs
15701570

15711571
/// Returns all `Ident`s and `LongIdent`s found in an untyped AST.
15721572
let getLongIdents (parsedInput: ParsedInput) : IDictionary<pos, LongIdent> =

src/Compiler/SyntaxTree/SyntaxTree.fs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -886,12 +886,12 @@ type SynSimplePats =
886886
type SynArgPats =
887887
| Pats of pats: SynPat list
888888

889-
| NamePatPairs of pats: (Ident * range * SynPat) list * range: range
889+
| NamePatPairs of pats: (Ident * range * SynPat) list * range: range * trivia: SynArgPatsNamePatPairsTrivia
890890

891891
member x.Patterns =
892892
match x with
893893
| Pats pats -> pats
894-
| NamePatPairs (pats, _) -> pats |> List.map (fun (_, _, pat) -> pat)
894+
| NamePatPairs (pats = pats) -> pats |> List.map (fun (_, _, pat) -> pat)
895895

896896
[<NoEquality; NoComparison; RequireQualifiedAccess>]
897897
type SynPat =

src/Compiler/SyntaxTree/SyntaxTree.fsi

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1024,7 +1024,7 @@ type SynSimplePats =
10241024
type SynArgPats =
10251025
| Pats of pats: SynPat list
10261026

1027-
| NamePatPairs of pats: (Ident * range * SynPat) list * range: range
1027+
| NamePatPairs of pats: (Ident * range * SynPat) list * range: range * trivia: SynArgPatsNamePatPairsTrivia
10281028

10291029
member Patterns: SynPat list
10301030

src/Compiler/SyntaxTree/SyntaxTrivia.fs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -257,3 +257,6 @@ type SynMemberGetSetTrivia =
257257
AndKeyword: range option
258258
SetKeyword: range option
259259
}
260+
261+
[<NoEquality; NoComparison>]
262+
type SynArgPatsNamePatPairsTrivia = { ParenRange: range }

src/Compiler/SyntaxTree/SyntaxTrivia.fsi

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -365,3 +365,11 @@ type SynMemberGetSetTrivia =
365365
/// The syntax range of the `set` keyword
366366
SetKeyword: range option
367367
}
368+
369+
/// Represents additional information for SynArgPats.NamePatPairs
370+
[<NoEquality; NoComparison>]
371+
type SynArgPatsNamePatPairsTrivia =
372+
{
373+
/// The syntax range from the beginning of the `(` token till the end of the `)` token.
374+
ParenRange: range
375+
}

src/Compiler/pars.fsy

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3237,7 +3237,10 @@ constrPattern:
32373237

32383238
atomicPatsOrNamePatPairs:
32393239
| LPAREN namePatPairs rparen
3240-
{ SynArgPats.NamePatPairs $2, snd $2 }
3240+
{ let mParen = rhs2 parseState 1 3
3241+
let pats, m = $2
3242+
let trivia = { ParenRange = mParen }
3243+
SynArgPats.NamePatPairs(pats, m, trivia), snd $2 }
32413244

32423245
| atomicPatterns
32433246
{ let mParsed = rhs parseState 1

tests/FSharp.Compiler.Service.Tests/FSharp.CompilerService.SurfaceArea.netstandard.expected

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5829,6 +5829,8 @@ FSharp.Compiler.Syntax.SynArgInfo: Microsoft.FSharp.Core.FSharpOption`1[FSharp.C
58295829
FSharp.Compiler.Syntax.SynArgInfo: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.Ident] ident
58305830
FSharp.Compiler.Syntax.SynArgInfo: System.String ToString()
58315831
FSharp.Compiler.Syntax.SynArgPats
5832+
FSharp.Compiler.Syntax.SynArgPats+NamePatPairs: FSharp.Compiler.SyntaxTrivia.SynArgPatsNamePatPairsTrivia get_trivia()
5833+
FSharp.Compiler.Syntax.SynArgPats+NamePatPairs: FSharp.Compiler.SyntaxTrivia.SynArgPatsNamePatPairsTrivia trivia
58325834
FSharp.Compiler.Syntax.SynArgPats+NamePatPairs: FSharp.Compiler.Text.Range get_range()
58335835
FSharp.Compiler.Syntax.SynArgPats+NamePatPairs: FSharp.Compiler.Text.Range range
58345836
FSharp.Compiler.Syntax.SynArgPats+NamePatPairs: Microsoft.FSharp.Collections.FSharpList`1[System.Tuple`3[FSharp.Compiler.Syntax.Ident,FSharp.Compiler.Text.Range,FSharp.Compiler.Syntax.SynPat]] get_pats()
@@ -5841,7 +5843,7 @@ FSharp.Compiler.Syntax.SynArgPats: Boolean IsNamePatPairs
58415843
FSharp.Compiler.Syntax.SynArgPats: Boolean IsPats
58425844
FSharp.Compiler.Syntax.SynArgPats: Boolean get_IsNamePatPairs()
58435845
FSharp.Compiler.Syntax.SynArgPats: Boolean get_IsPats()
5844-
FSharp.Compiler.Syntax.SynArgPats: FSharp.Compiler.Syntax.SynArgPats NewNamePatPairs(Microsoft.FSharp.Collections.FSharpList`1[System.Tuple`3[FSharp.Compiler.Syntax.Ident,FSharp.Compiler.Text.Range,FSharp.Compiler.Syntax.SynPat]], FSharp.Compiler.Text.Range)
5846+
FSharp.Compiler.Syntax.SynArgPats: FSharp.Compiler.Syntax.SynArgPats NewNamePatPairs(Microsoft.FSharp.Collections.FSharpList`1[System.Tuple`3[FSharp.Compiler.Syntax.Ident,FSharp.Compiler.Text.Range,FSharp.Compiler.Syntax.SynPat]], FSharp.Compiler.Text.Range, FSharp.Compiler.SyntaxTrivia.SynArgPatsNamePatPairsTrivia)
58455847
FSharp.Compiler.Syntax.SynArgPats: FSharp.Compiler.Syntax.SynArgPats NewPats(Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynPat])
58465848
FSharp.Compiler.Syntax.SynArgPats: FSharp.Compiler.Syntax.SynArgPats+NamePatPairs
58475849
FSharp.Compiler.Syntax.SynArgPats: FSharp.Compiler.Syntax.SynArgPats+Pats
@@ -9395,6 +9397,11 @@ FSharp.Compiler.SyntaxTrivia.ParsedSigFileInputTrivia: Microsoft.FSharp.Collecti
93959397
FSharp.Compiler.SyntaxTrivia.ParsedSigFileInputTrivia: Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.SyntaxTrivia.ConditionalDirectiveTrivia] get_ConditionalDirectives()
93969398
FSharp.Compiler.SyntaxTrivia.ParsedSigFileInputTrivia: System.String ToString()
93979399
FSharp.Compiler.SyntaxTrivia.ParsedSigFileInputTrivia: Void .ctor(Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.SyntaxTrivia.ConditionalDirectiveTrivia], Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.SyntaxTrivia.CommentTrivia])
9400+
FSharp.Compiler.SyntaxTrivia.SynArgPatsNamePatPairsTrivia
9401+
FSharp.Compiler.SyntaxTrivia.SynArgPatsNamePatPairsTrivia: FSharp.Compiler.Text.Range ParenRange
9402+
FSharp.Compiler.SyntaxTrivia.SynArgPatsNamePatPairsTrivia: FSharp.Compiler.Text.Range get_ParenRange()
9403+
FSharp.Compiler.SyntaxTrivia.SynArgPatsNamePatPairsTrivia: System.String ToString()
9404+
FSharp.Compiler.SyntaxTrivia.SynArgPatsNamePatPairsTrivia: Void .ctor(FSharp.Compiler.Text.Range)
93989405
FSharp.Compiler.SyntaxTrivia.SynBindingTrivia
93999406
FSharp.Compiler.SyntaxTrivia.SynBindingTrivia: FSharp.Compiler.SyntaxTrivia.SynBindingTrivia Zero
94009407
FSharp.Compiler.SyntaxTrivia.SynBindingTrivia: FSharp.Compiler.SyntaxTrivia.SynBindingTrivia get_Zero()

tests/service/SyntaxTreeTests/PatternTests.fs

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,4 +97,28 @@ match x with
9797
)
9898
]) ])) ->
9999
Assert.AreEqual("op_ColonColon", opColonColonIdent.idText)
100-
| _ -> Assert.Fail $"Could not get valid AST, got {parseResults}"
100+
| _ -> Assert.Fail $"Could not get valid AST, got {parseResults}"
101+
102+
[<Test>]
103+
let ``Parentheses of SynArgPats.NamePatPairs`` () =
104+
let parseResults =
105+
getParseResults
106+
"""
107+
match data with
108+
| OnePartData( // foo
109+
part1 = p1
110+
(* bar *) ) -> p1
111+
| _ -> failwith "todo"
112+
"""
113+
114+
match parseResults with
115+
| ParsedInput.ImplFile (ParsedImplFileInput (contents = [ SynModuleOrNamespace.SynModuleOrNamespace(decls = [
116+
SynModuleDecl.Expr(
117+
expr = SynExpr.Match(clauses = [
118+
SynMatchClause(pat = SynPat.LongIdent(argPats = SynArgPats.NamePatPairs(trivia = trivia)))
119+
_
120+
])
121+
)
122+
]) ])) ->
123+
assertRange (3, 13) (5, 13) trivia.ParenRange
124+
| _ -> Assert.Fail $"Could not get valid AST, got {parseResults}"

0 commit comments

Comments
 (0)