From d8c89142e2caf89687543cf71542e6372429cb6f Mon Sep 17 00:00:00 2001 From: nojaf Date: Sun, 2 Oct 2022 16:27:34 +0200 Subject: [PATCH 1/2] Add SynArgPatsNamePatPairsTrivia to SynArgPats.NamePatPairs. --- src/Compiler/Checking/CheckPatterns.fs | 6 ++--- src/Compiler/Service/ServiceParseTreeWalk.fs | 2 +- src/Compiler/Service/ServiceParsedInputOps.fs | 4 +-- src/Compiler/SyntaxTree/SyntaxTree.fs | 4 +-- src/Compiler/SyntaxTree/SyntaxTree.fsi | 2 +- src/Compiler/SyntaxTree/SyntaxTrivia.fs | 7 +++++ src/Compiler/SyntaxTree/SyntaxTrivia.fsi | 10 +++++++ src/Compiler/pars.fsy | 6 ++++- ...erService.SurfaceArea.netstandard.expected | 11 +++++++- tests/service/SyntaxTreeTests/PatternTests.fs | 27 ++++++++++++++++++- 10 files changed, 67 insertions(+), 12 deletions(-) diff --git a/src/Compiler/Checking/CheckPatterns.fs b/src/Compiler/Checking/CheckPatterns.fs index 1e9c0418a18..238e3668de7 100644 --- a/src/Compiler/Checking/CheckPatterns.fs +++ b/src/Compiler/Checking/CheckPatterns.fs @@ -471,13 +471,13 @@ and TcNullPat cenv env patEnv ty m = and CheckNoArgsForLiteral args m = match args with | SynArgPats.Pats [] - | SynArgPats.NamePatPairs ([], _) -> () + | SynArgPats.NamePatPairs (pats = []) -> () | _ -> errorR (Error (FSComp.SR.tcLiteralDoesNotTakeArguments (), m)) and GetSynArgPatterns args = match args with | SynArgPats.Pats args -> args - | SynArgPats.NamePatPairs (pairs, _) -> List.map (fun (_, _, pat) -> pat) pairs + | SynArgPats.NamePatPairs (pats = pairs) -> List.map (fun (_, _, pat) -> pat) pairs and TcArgPats warnOnUpper (cenv: cenv) env vFlags patEnv args = let g = cenv.g @@ -600,7 +600,7 @@ and TcPatLongIdentUnionCaseOrExnCase warnOnUpper cenv env ad vFlags patEnv ty (m let args, extraPatternsFromNames = match args with | SynArgPats.Pats args -> args, [] - | SynArgPats.NamePatPairs (pairs, m) -> + | SynArgPats.NamePatPairs (pairs, m, _) -> // rewrite patterns from the form (name-N = pat-N; ...) to (..._, pat-N, _...) // so type T = Case of name: int * value: int // | Case(value = v) diff --git a/src/Compiler/Service/ServiceParseTreeWalk.fs b/src/Compiler/Service/ServiceParseTreeWalk.fs index 08c89d969f9..c75b133a371 100755 --- a/src/Compiler/Service/ServiceParseTreeWalk.fs +++ b/src/Compiler/Service/ServiceParseTreeWalk.fs @@ -797,7 +797,7 @@ module SyntaxTraversal = | SynPat.LongIdent (argPats = args) -> match args with | SynArgPats.Pats ps -> ps |> List.tryPick (traversePat path) - | SynArgPats.NamePatPairs (ps, _) -> ps |> List.map (fun (_, _, pat) -> pat) |> List.tryPick (traversePat path) + | SynArgPats.NamePatPairs (pats = ps) -> ps |> List.map (fun (_, _, pat) -> pat) |> List.tryPick (traversePat path) | SynPat.Typed (p, ty, _) -> match traversePat path p with | None -> traverseSynType path ty diff --git a/src/Compiler/Service/ServiceParsedInputOps.fs b/src/Compiler/Service/ServiceParsedInputOps.fs index 6b6a1c906f0..ab24bcb5a44 100644 --- a/src/Compiler/Service/ServiceParsedInputOps.fs +++ b/src/Compiler/Service/ServiceParsedInputOps.fs @@ -556,7 +556,7 @@ module ParsedInput = let (|ConstructorPats|) pats = match pats with | SynArgPats.Pats ps -> ps - | SynArgPats.NamePatPairs (xs, _) -> List.map (fun (_, _, pat) -> pat) xs + | SynArgPats.NamePatPairs (pats = xs) -> List.map (fun (_, _, pat) -> pat) xs /// A recursive pattern that collect all sequential expressions to avoid StackOverflowException let rec (|Sequentials|_|) expr = @@ -1566,7 +1566,7 @@ module ParsedInput = let (|ConstructorPats|) pats = match pats with | SynArgPats.Pats ps -> ps - | SynArgPats.NamePatPairs (xs, _) -> List.map (fun (_, _, pat) -> pat) xs + | SynArgPats.NamePatPairs (pats = xs) -> List.map (fun (_, _, pat) -> pat) xs /// Returns all `Ident`s and `LongIdent`s found in an untyped AST. let getLongIdents (parsedInput: ParsedInput) : IDictionary = diff --git a/src/Compiler/SyntaxTree/SyntaxTree.fs b/src/Compiler/SyntaxTree/SyntaxTree.fs index 1845f463540..11c0c28375b 100644 --- a/src/Compiler/SyntaxTree/SyntaxTree.fs +++ b/src/Compiler/SyntaxTree/SyntaxTree.fs @@ -886,12 +886,12 @@ type SynSimplePats = type SynArgPats = | Pats of pats: SynPat list - | NamePatPairs of pats: (Ident * range * SynPat) list * range: range + | NamePatPairs of pats: (Ident * range * SynPat) list * range: range * trivia: SynArgPatsNamePatPairsTrivia member x.Patterns = match x with | Pats pats -> pats - | NamePatPairs (pats, _) -> pats |> List.map (fun (_, _, pat) -> pat) + | NamePatPairs (pats = pats) -> pats |> List.map (fun (_, _, pat) -> pat) [] type SynPat = diff --git a/src/Compiler/SyntaxTree/SyntaxTree.fsi b/src/Compiler/SyntaxTree/SyntaxTree.fsi index b1538eaa489..2a34ba55c46 100644 --- a/src/Compiler/SyntaxTree/SyntaxTree.fsi +++ b/src/Compiler/SyntaxTree/SyntaxTree.fsi @@ -1024,7 +1024,7 @@ type SynSimplePats = type SynArgPats = | Pats of pats: SynPat list - | NamePatPairs of pats: (Ident * range * SynPat) list * range: range + | NamePatPairs of pats: (Ident * range * SynPat) list * range: range * trivia: SynArgPatsNamePatPairsTrivia member Patterns: SynPat list diff --git a/src/Compiler/SyntaxTree/SyntaxTrivia.fs b/src/Compiler/SyntaxTree/SyntaxTrivia.fs index 1b03d20b615..bcb1f00b728 100644 --- a/src/Compiler/SyntaxTree/SyntaxTrivia.fs +++ b/src/Compiler/SyntaxTree/SyntaxTrivia.fs @@ -257,3 +257,10 @@ type SynMemberGetSetTrivia = AndKeyword: range option SetKeyword: range option } + +[] +type SynArgPatsNamePatPairsTrivia = + { + LeftParenRange: range + RightParenRange: range + } diff --git a/src/Compiler/SyntaxTree/SyntaxTrivia.fsi b/src/Compiler/SyntaxTree/SyntaxTrivia.fsi index fbdf8ecf30e..f25a7ba4c89 100644 --- a/src/Compiler/SyntaxTree/SyntaxTrivia.fsi +++ b/src/Compiler/SyntaxTree/SyntaxTrivia.fsi @@ -365,3 +365,13 @@ type SynMemberGetSetTrivia = /// The syntax range of the `set` keyword SetKeyword: range option } + +/// Represents additional information for SynArgPats.NamePatPairs +[] +type SynArgPatsNamePatPairsTrivia = + { + /// The syntax range of the `(` token. + LeftParenRange: range + /// The syntax range of the `)` token. + RightParenRange: range + } diff --git a/src/Compiler/pars.fsy b/src/Compiler/pars.fsy index 6e194678018..8c5f4024047 100644 --- a/src/Compiler/pars.fsy +++ b/src/Compiler/pars.fsy @@ -3237,7 +3237,11 @@ constrPattern: atomicPatsOrNamePatPairs: | LPAREN namePatPairs rparen - { SynArgPats.NamePatPairs $2, snd $2 } + { let mLParen = rhs parseState 1 + let mRParen = rhs parseState 3 + let pats, m = $2 + let trivia = { LeftParenRange = mLParen; RightParenRange = mRParen } + SynArgPats.NamePatPairs(pats, m, trivia), snd $2 } | atomicPatterns { let mParsed = rhs parseState 1 diff --git a/tests/FSharp.Compiler.Service.Tests/FSharp.CompilerService.SurfaceArea.netstandard.expected b/tests/FSharp.Compiler.Service.Tests/FSharp.CompilerService.SurfaceArea.netstandard.expected index 736193358e7..e1b7f055109 100644 --- a/tests/FSharp.Compiler.Service.Tests/FSharp.CompilerService.SurfaceArea.netstandard.expected +++ b/tests/FSharp.Compiler.Service.Tests/FSharp.CompilerService.SurfaceArea.netstandard.expected @@ -5830,6 +5830,8 @@ FSharp.Compiler.Syntax.SynArgInfo: Microsoft.FSharp.Core.FSharpOption`1[FSharp.C FSharp.Compiler.Syntax.SynArgInfo: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.Ident] ident FSharp.Compiler.Syntax.SynArgInfo: System.String ToString() FSharp.Compiler.Syntax.SynArgPats +FSharp.Compiler.Syntax.SynArgPats+NamePatPairs: FSharp.Compiler.SyntaxTrivia.SynArgPatsNamePatPairsTrivia get_trivia() +FSharp.Compiler.Syntax.SynArgPats+NamePatPairs: FSharp.Compiler.SyntaxTrivia.SynArgPatsNamePatPairsTrivia trivia FSharp.Compiler.Syntax.SynArgPats+NamePatPairs: FSharp.Compiler.Text.Range get_range() FSharp.Compiler.Syntax.SynArgPats+NamePatPairs: FSharp.Compiler.Text.Range range 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() @@ -5842,7 +5844,7 @@ FSharp.Compiler.Syntax.SynArgPats: Boolean IsNamePatPairs FSharp.Compiler.Syntax.SynArgPats: Boolean IsPats FSharp.Compiler.Syntax.SynArgPats: Boolean get_IsNamePatPairs() FSharp.Compiler.Syntax.SynArgPats: Boolean get_IsPats() -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.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) FSharp.Compiler.Syntax.SynArgPats: FSharp.Compiler.Syntax.SynArgPats NewPats(Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynPat]) FSharp.Compiler.Syntax.SynArgPats: FSharp.Compiler.Syntax.SynArgPats+NamePatPairs FSharp.Compiler.Syntax.SynArgPats: FSharp.Compiler.Syntax.SynArgPats+Pats @@ -9396,6 +9398,13 @@ FSharp.Compiler.SyntaxTrivia.ParsedSigFileInputTrivia: Microsoft.FSharp.Collecti FSharp.Compiler.SyntaxTrivia.ParsedSigFileInputTrivia: Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.SyntaxTrivia.ConditionalDirectiveTrivia] get_ConditionalDirectives() FSharp.Compiler.SyntaxTrivia.ParsedSigFileInputTrivia: System.String ToString() FSharp.Compiler.SyntaxTrivia.ParsedSigFileInputTrivia: Void .ctor(Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.SyntaxTrivia.ConditionalDirectiveTrivia], Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.SyntaxTrivia.CommentTrivia]) +FSharp.Compiler.SyntaxTrivia.SynArgPatsNamePatPairsTrivia +FSharp.Compiler.SyntaxTrivia.SynArgPatsNamePatPairsTrivia: FSharp.Compiler.Text.Range LeftParenRange +FSharp.Compiler.SyntaxTrivia.SynArgPatsNamePatPairsTrivia: FSharp.Compiler.Text.Range RightParenRange +FSharp.Compiler.SyntaxTrivia.SynArgPatsNamePatPairsTrivia: FSharp.Compiler.Text.Range get_LeftParenRange() +FSharp.Compiler.SyntaxTrivia.SynArgPatsNamePatPairsTrivia: FSharp.Compiler.Text.Range get_RightParenRange() +FSharp.Compiler.SyntaxTrivia.SynArgPatsNamePatPairsTrivia: System.String ToString() +FSharp.Compiler.SyntaxTrivia.SynArgPatsNamePatPairsTrivia: Void .ctor(FSharp.Compiler.Text.Range, FSharp.Compiler.Text.Range) FSharp.Compiler.SyntaxTrivia.SynBindingTrivia FSharp.Compiler.SyntaxTrivia.SynBindingTrivia: FSharp.Compiler.SyntaxTrivia.SynBindingTrivia Zero FSharp.Compiler.SyntaxTrivia.SynBindingTrivia: FSharp.Compiler.SyntaxTrivia.SynBindingTrivia get_Zero() diff --git a/tests/service/SyntaxTreeTests/PatternTests.fs b/tests/service/SyntaxTreeTests/PatternTests.fs index 61a511dc88a..b9b8674faa5 100644 --- a/tests/service/SyntaxTreeTests/PatternTests.fs +++ b/tests/service/SyntaxTreeTests/PatternTests.fs @@ -97,4 +97,29 @@ match x with ) ]) ])) -> Assert.AreEqual("op_ColonColon", opColonColonIdent.idText) - | _ -> Assert.Fail $"Could not get valid AST, got {parseResults}" \ No newline at end of file + | _ -> Assert.Fail $"Could not get valid AST, got {parseResults}" + +[] +let ``Parentheses of SynArgPats.NamePatPairs`` () = + let parseResults = + getParseResults + """ +match data with +| OnePartData( // foo + part1 = p1 + (* bar *) ) -> p1 +| _ -> failwith "todo" +""" + + match parseResults with + | ParsedInput.ImplFile (ParsedImplFileInput (contents = [ SynModuleOrNamespace.SynModuleOrNamespace(decls = [ + SynModuleDecl.Expr( + expr = SynExpr.Match(clauses = [ + SynMatchClause(pat = SynPat.LongIdent(argPats = SynArgPats.NamePatPairs(trivia = trivia))) + _ + ]) + ) + ]) ])) -> + assertRange (3, 13) (3, 14) trivia.LeftParenRange + assertRange (5, 12) (5, 13) trivia.RightParenRange + | _ -> Assert.Fail $"Could not get valid AST, got {parseResults}" From 20a9028892b606ed54f1738fdb7a985b286cf0b8 Mon Sep 17 00:00:00 2001 From: nojaf Date: Mon, 3 Oct 2022 11:09:37 +0200 Subject: [PATCH 2/2] Store the parentheses range as a single range in SynArgPatsNamePatPairsTrivia. --- src/Compiler/SyntaxTree/SyntaxTrivia.fs | 6 +----- src/Compiler/SyntaxTree/SyntaxTrivia.fsi | 6 ++---- src/Compiler/pars.fsy | 5 ++--- ...Sharp.CompilerService.SurfaceArea.netstandard.expected | 8 +++----- tests/service/SyntaxTreeTests/PatternTests.fs | 3 +-- 5 files changed, 9 insertions(+), 19 deletions(-) diff --git a/src/Compiler/SyntaxTree/SyntaxTrivia.fs b/src/Compiler/SyntaxTree/SyntaxTrivia.fs index bcb1f00b728..5f500caec88 100644 --- a/src/Compiler/SyntaxTree/SyntaxTrivia.fs +++ b/src/Compiler/SyntaxTree/SyntaxTrivia.fs @@ -259,8 +259,4 @@ type SynMemberGetSetTrivia = } [] -type SynArgPatsNamePatPairsTrivia = - { - LeftParenRange: range - RightParenRange: range - } +type SynArgPatsNamePatPairsTrivia = { ParenRange: range } diff --git a/src/Compiler/SyntaxTree/SyntaxTrivia.fsi b/src/Compiler/SyntaxTree/SyntaxTrivia.fsi index f25a7ba4c89..3cac74f9026 100644 --- a/src/Compiler/SyntaxTree/SyntaxTrivia.fsi +++ b/src/Compiler/SyntaxTree/SyntaxTrivia.fsi @@ -370,8 +370,6 @@ type SynMemberGetSetTrivia = [] type SynArgPatsNamePatPairsTrivia = { - /// The syntax range of the `(` token. - LeftParenRange: range - /// The syntax range of the `)` token. - RightParenRange: range + /// The syntax range from the beginning of the `(` token till the end of the `)` token. + ParenRange: range } diff --git a/src/Compiler/pars.fsy b/src/Compiler/pars.fsy index 8c5f4024047..63dba4eb2cb 100644 --- a/src/Compiler/pars.fsy +++ b/src/Compiler/pars.fsy @@ -3237,10 +3237,9 @@ constrPattern: atomicPatsOrNamePatPairs: | LPAREN namePatPairs rparen - { let mLParen = rhs parseState 1 - let mRParen = rhs parseState 3 + { let mParen = rhs2 parseState 1 3 let pats, m = $2 - let trivia = { LeftParenRange = mLParen; RightParenRange = mRParen } + let trivia = { ParenRange = mParen } SynArgPats.NamePatPairs(pats, m, trivia), snd $2 } | atomicPatterns diff --git a/tests/FSharp.Compiler.Service.Tests/FSharp.CompilerService.SurfaceArea.netstandard.expected b/tests/FSharp.Compiler.Service.Tests/FSharp.CompilerService.SurfaceArea.netstandard.expected index e1b7f055109..1eeb9b8bc95 100644 --- a/tests/FSharp.Compiler.Service.Tests/FSharp.CompilerService.SurfaceArea.netstandard.expected +++ b/tests/FSharp.Compiler.Service.Tests/FSharp.CompilerService.SurfaceArea.netstandard.expected @@ -9399,12 +9399,10 @@ FSharp.Compiler.SyntaxTrivia.ParsedSigFileInputTrivia: Microsoft.FSharp.Collecti FSharp.Compiler.SyntaxTrivia.ParsedSigFileInputTrivia: System.String ToString() FSharp.Compiler.SyntaxTrivia.ParsedSigFileInputTrivia: Void .ctor(Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.SyntaxTrivia.ConditionalDirectiveTrivia], Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.SyntaxTrivia.CommentTrivia]) FSharp.Compiler.SyntaxTrivia.SynArgPatsNamePatPairsTrivia -FSharp.Compiler.SyntaxTrivia.SynArgPatsNamePatPairsTrivia: FSharp.Compiler.Text.Range LeftParenRange -FSharp.Compiler.SyntaxTrivia.SynArgPatsNamePatPairsTrivia: FSharp.Compiler.Text.Range RightParenRange -FSharp.Compiler.SyntaxTrivia.SynArgPatsNamePatPairsTrivia: FSharp.Compiler.Text.Range get_LeftParenRange() -FSharp.Compiler.SyntaxTrivia.SynArgPatsNamePatPairsTrivia: FSharp.Compiler.Text.Range get_RightParenRange() +FSharp.Compiler.SyntaxTrivia.SynArgPatsNamePatPairsTrivia: FSharp.Compiler.Text.Range ParenRange +FSharp.Compiler.SyntaxTrivia.SynArgPatsNamePatPairsTrivia: FSharp.Compiler.Text.Range get_ParenRange() FSharp.Compiler.SyntaxTrivia.SynArgPatsNamePatPairsTrivia: System.String ToString() -FSharp.Compiler.SyntaxTrivia.SynArgPatsNamePatPairsTrivia: Void .ctor(FSharp.Compiler.Text.Range, FSharp.Compiler.Text.Range) +FSharp.Compiler.SyntaxTrivia.SynArgPatsNamePatPairsTrivia: Void .ctor(FSharp.Compiler.Text.Range) FSharp.Compiler.SyntaxTrivia.SynBindingTrivia FSharp.Compiler.SyntaxTrivia.SynBindingTrivia: FSharp.Compiler.SyntaxTrivia.SynBindingTrivia Zero FSharp.Compiler.SyntaxTrivia.SynBindingTrivia: FSharp.Compiler.SyntaxTrivia.SynBindingTrivia get_Zero() diff --git a/tests/service/SyntaxTreeTests/PatternTests.fs b/tests/service/SyntaxTreeTests/PatternTests.fs index b9b8674faa5..72b10da7790 100644 --- a/tests/service/SyntaxTreeTests/PatternTests.fs +++ b/tests/service/SyntaxTreeTests/PatternTests.fs @@ -120,6 +120,5 @@ match data with ]) ) ]) ])) -> - assertRange (3, 13) (3, 14) trivia.LeftParenRange - assertRange (5, 12) (5, 13) trivia.RightParenRange + assertRange (3, 13) (5, 13) trivia.ParenRange | _ -> Assert.Fail $"Could not get valid AST, got {parseResults}"