From 8f8c3df023da5da9b29c64e95e876ee8868f26b4 Mon Sep 17 00:00:00 2001 From: Eugene Auduchinok Date: Thu, 7 Mar 2024 17:52:49 -0400 Subject: [PATCH 1/2] Parser: more 'as' pattern recovery --- src/Compiler/pars.fsy | 6 +++++ .../data/SyntaxTree/Pattern/As 02.fs.bsl | 2 +- .../data/SyntaxTree/Pattern/As 05.fs.bsl | 4 +-- .../data/SyntaxTree/Pattern/As 08.fs.bsl | 2 +- .../data/SyntaxTree/Pattern/As 10.fs.bsl | 2 +- .../service/data/SyntaxTree/Pattern/As 12.fs | 6 +++++ .../data/SyntaxTree/Pattern/As 12.fs.bsl | 26 +++++++++++++++++++ 7 files changed, 43 insertions(+), 5 deletions(-) create mode 100644 tests/service/data/SyntaxTree/Pattern/As 12.fs create mode 100644 tests/service/data/SyntaxTree/Pattern/As 12.fs.bsl diff --git a/src/Compiler/pars.fsy b/src/Compiler/pars.fsy index 4080fc7ec8b..f3ddb807aa5 100644 --- a/src/Compiler/pars.fsy +++ b/src/Compiler/pars.fsy @@ -3720,6 +3720,12 @@ parenPattern: let pat2 = SynPat.Wild(mAs.EndRange) SynPat.As($1, pat2, rhs2 parseState 1 2) } + | parenPattern AS + { let mAs = rhs parseState 2 + let pat2 = SynPat.Wild(mAs.EndRange) + reportParseErrorAt mAs (FSComp.SR.parsExpectingPattern ()) + SynPat.As($1, pat2, rhs2 parseState 1 2) } + | parenPattern BAR parenPattern { let mBar = rhs parseState 2 SynPat.Or($1, $3, rhs2 parseState 1 3, { BarRange = mBar }) } diff --git a/tests/service/data/SyntaxTree/Pattern/As 02.fs.bsl b/tests/service/data/SyntaxTree/Pattern/As 02.fs.bsl index a39bda6bb7c..dc9ff5caae9 100644 --- a/tests/service/data/SyntaxTree/Pattern/As 02.fs.bsl +++ b/tests/service/data/SyntaxTree/Pattern/As 02.fs.bsl @@ -21,4 +21,4 @@ ImplFile { ConditionalDirectives = [] CodeComments = [] }, set [])) -(4,7)-(4,9) parse error Unexpected symbol '->' in pattern +(4,4)-(4,6) parse error Expecting pattern diff --git a/tests/service/data/SyntaxTree/Pattern/As 05.fs.bsl b/tests/service/data/SyntaxTree/Pattern/As 05.fs.bsl index 1e26e340c11..07a1aac463e 100644 --- a/tests/service/data/SyntaxTree/Pattern/As 05.fs.bsl +++ b/tests/service/data/SyntaxTree/Pattern/As 05.fs.bsl @@ -21,5 +21,5 @@ ImplFile { ConditionalDirectives = [] CodeComments = [] }, set [])) -(5,0)-(5,0) parse error Incomplete structured construct at or before this point in pattern -(3,13)-(3,17) parse error Unexpected end of input in 'match' or 'try' expression +(4,4)-(4,6) parse error Expecting pattern +(5,0)-(5,0) parse error Incomplete structured construct at or before this point in pattern matching. Expected '->' or other token. diff --git a/tests/service/data/SyntaxTree/Pattern/As 08.fs.bsl b/tests/service/data/SyntaxTree/Pattern/As 08.fs.bsl index 48501827087..bfe069db512 100644 --- a/tests/service/data/SyntaxTree/Pattern/As 08.fs.bsl +++ b/tests/service/data/SyntaxTree/Pattern/As 08.fs.bsl @@ -20,4 +20,4 @@ ImplFile { ConditionalDirectives = [] CodeComments = [] }, set [])) -(5,0)-(5,1) parse error Unexpected symbol '|' in pattern +(4,4)-(4,6) parse error Expecting pattern diff --git a/tests/service/data/SyntaxTree/Pattern/As 10.fs.bsl b/tests/service/data/SyntaxTree/Pattern/As 10.fs.bsl index 2b44d412f46..384bd2c6d06 100644 --- a/tests/service/data/SyntaxTree/Pattern/As 10.fs.bsl +++ b/tests/service/data/SyntaxTree/Pattern/As 10.fs.bsl @@ -22,4 +22,4 @@ ImplFile { ConditionalDirectives = [] CodeComments = [] }, set [])) -(3,10)-(3,11) parse error Unexpected symbol ')' in pattern +(3,7)-(3,9) parse error Expecting pattern diff --git a/tests/service/data/SyntaxTree/Pattern/As 12.fs b/tests/service/data/SyntaxTree/Pattern/As 12.fs new file mode 100644 index 00000000000..be8217acbd0 --- /dev/null +++ b/tests/service/data/SyntaxTree/Pattern/As 12.fs @@ -0,0 +1,6 @@ +module Module + +match a with +| :? T as + +() diff --git a/tests/service/data/SyntaxTree/Pattern/As 12.fs.bsl b/tests/service/data/SyntaxTree/Pattern/As 12.fs.bsl new file mode 100644 index 00000000000..f77b92aba46 --- /dev/null +++ b/tests/service/data/SyntaxTree/Pattern/As 12.fs.bsl @@ -0,0 +1,26 @@ +ImplFile + (ParsedImplFileInput + ("/root/Pattern/As 12.fs", false, QualifiedNameOfFile Module, [], [], + [SynModuleOrNamespace + ([Module], false, NamedModule, + [Expr + (Match + (Yes (3,0--3,12), Ident a, + [SynMatchClause + (As + (IsInst + (LongIdent (SynLongIdent ([T], [], [None])), + (4,2--4,6)), Wild (4,9--4,9), (4,2--4,9)), None, + ArbitraryAfterError ("patternClauses2", (4,9--4,9)), + (4,2--4,9), Yes, { ArrowRange = None + BarRange = Some (4,0--4,1) })], + (3,0--4,9), { MatchKeyword = (3,0--3,5) + WithKeyword = (3,8--3,12) }), (3,0--4,9)); + Expr (Const (Unit, (6,0--6,2)), (6,0--6,2))], + PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None, + (1,0--6,2), { LeadingKeyword = Module (1,0--1,6) })], (true, true), + { ConditionalDirectives = [] + CodeComments = [] }, set [])) + +(4,7)-(4,9) parse error Expecting pattern +(6,0)-(6,1) parse error Incomplete structured construct at or before this point in pattern matching. Expected '->' or other token. From 902bd3dc7a1a4e709b8977a2e5a43eb421c884c8 Mon Sep 17 00:00:00 2001 From: Eugene Auduchinok Date: Fri, 8 Mar 2024 10:01:36 -0400 Subject: [PATCH 2/2] Release notes --- docs/release-notes/.FSharp.Compiler.Service/8.0.300.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/release-notes/.FSharp.Compiler.Service/8.0.300.md b/docs/release-notes/.FSharp.Compiler.Service/8.0.300.md index 148f3734185..642ee80e8cb 100644 --- a/docs/release-notes/.FSharp.Compiler.Service/8.0.300.md +++ b/docs/release-notes/.FSharp.Compiler.Service/8.0.300.md @@ -26,6 +26,7 @@ * Add switch to generate types and members with IL visibility that accurately represents their F# visibility. ([PR #15484](https://github.com/dotnet/fsharp/pull/15484) * Allow returning bool instead of unit option for partial active patterns. ([Language suggestion #1041](https://github.com/fsharp/fslang-suggestions/issues/1041), [PR #16473](https://github.com/dotnet/fsharp/pull/16473)) * Symbols: Add GenericArguments to FSharpEntity ([PR #16470](https://github.com/dotnet/fsharp/pull/16470)) +* Parser: more 'as' pattern recovery ([PR #16837](https://github.com/dotnet/fsharp/pull/16837)) ### Changed