Skip to content

Commit 2d86dbd

Browse files
authored
Add SynPat.ListCons. (#14010)
1 parent d1bf297 commit 2d86dbd

File tree

11 files changed

+71
-9
lines changed

11 files changed

+71
-9
lines changed

src/Compiler/Checking/CheckPatterns.fs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -289,6 +289,11 @@ and TcPat warnOnUpper (cenv: cenv) env valReprInfo vFlags (patEnv: TcPatLinearEn
289289
| SynPat.Or (pat1, pat2, m, _) ->
290290
TcPatOr warnOnUpper cenv env vFlags patEnv ty pat1 pat2 m
291291

292+
| SynPat.ListCons(pat1, pat2, m, trivia) ->
293+
let longDotId = SynLongIdent((mkSynCaseName trivia.ColonColonRange opNameCons), [], [Some (FSharp.Compiler.SyntaxTrivia.IdentTrivia.OriginalNotation "::")])
294+
let args = SynArgPats.Pats [ SynPat.Tuple(false, [ pat1; pat2 ], m) ]
295+
TcPatLongIdent warnOnUpper cenv env ad valReprInfo vFlags patEnv ty (longDotId, None, args, None, m)
296+
292297
| SynPat.Ands (pats, m) ->
293298
TcPatAnds warnOnUpper cenv env vFlags patEnv ty pats m
294299

src/Compiler/Service/ServiceParseTreeWalk.fs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -789,7 +789,8 @@ module SyntaxTraversal =
789789
match p with
790790
| SynPat.Paren (p, _) -> traversePat path p
791791
| SynPat.As (p1, p2, _)
792-
| SynPat.Or (p1, p2, _, _) -> [ p1; p2 ] |> List.tryPick (traversePat path)
792+
| SynPat.Or (p1, p2, _, _)
793+
| SynPat.ListCons (p1, p2, _, _) -> [ p1; p2 ] |> List.tryPick (traversePat path)
793794
| SynPat.Ands (ps, _)
794795
| SynPat.Tuple (_, ps, _)
795796
| SynPat.ArrayOrList (_, ps, _) -> ps |> List.tryPick (traversePat path)

src/Compiler/Service/ServiceParsedInputOps.fs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -619,7 +619,8 @@ module ParsedInput =
619619
| SynPat.As (pat1, pat2, _) -> List.tryPick walkPat [ pat1; pat2 ]
620620
| SynPat.Typed (pat, t, _) -> walkPat pat |> Option.orElseWith (fun () -> walkType t)
621621
| SynPat.Attrib (pat, Attributes attrs, _) -> walkPat pat |> Option.orElseWith (fun () -> List.tryPick walkAttribute attrs)
622-
| SynPat.Or (pat1, pat2, _, _) -> List.tryPick walkPat [ pat1; pat2 ]
622+
| SynPat.Or (pat1, pat2, _, _)
623+
| SynPat.ListCons (pat1, pat2, _, _) -> List.tryPick walkPat [ pat1; pat2 ]
623624
| SynPat.LongIdent (typarDecls = typars; argPats = ConstructorPats pats; range = r) ->
624625
ifPosInRange r (fun _ -> kind)
625626
|> Option.orElseWith (fun () ->
@@ -1638,7 +1639,8 @@ module ParsedInput =
16381639
walkPat pat
16391640
List.iter walkAttribute attrs
16401641
| SynPat.As (pat1, pat2, _)
1641-
| SynPat.Or (pat1, pat2, _, _) -> List.iter walkPat [ pat1; pat2 ]
1642+
| SynPat.Or (pat1, pat2, _, _)
1643+
| SynPat.ListCons (pat1, pat2, _, _) -> List.iter walkPat [ pat1; pat2 ]
16421644
| SynPat.LongIdent (longDotId = ident; typarDecls = typars; argPats = ConstructorPats pats) ->
16431645
addLongIdentWithDots ident
16441646

src/Compiler/Service/ServiceXmlDocParser.fs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ module XmlDocParsing =
2525
| SynPat.Typed (pat, _type, _range) -> digNamesFrom pat
2626
| SynPat.Attrib (pat, _attrs, _range) -> digNamesFrom pat
2727
| SynPat.LongIdent(argPats = ConstructorPats pats) -> pats |> List.collect digNamesFrom
28+
| SynPat.ListCons (p1, p2, _, _) -> List.collect digNamesFrom [ p1; p2 ]
2829
| SynPat.Tuple (_, pats, _range) -> pats |> List.collect digNamesFrom
2930
| SynPat.Paren (pat, _range) -> digNamesFrom pat
3031
| SynPat.OptionalVal (id, _) -> [ id.idText ]

src/Compiler/SyntaxTree/SyntaxTree.fs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -908,6 +908,8 @@ type SynPat =
908908

909909
| Or of lhsPat: SynPat * rhsPat: SynPat * range: range * trivia: SynPatOrTrivia
910910

911+
| ListCons of lhsPat: SynPat * rhsPat: SynPat * range: range * trivia: SynPatListConsTrivia
912+
911913
| Ands of pats: SynPat list * range: range
912914

913915
| As of lhsPat: SynPat * rhsPat: SynPat * range: range
@@ -953,6 +955,7 @@ type SynPat =
953955
| SynPat.Wild (range = m)
954956
| SynPat.Named (range = m)
955957
| SynPat.Or (range = m)
958+
| SynPat.ListCons (range = m)
956959
| SynPat.Ands (range = m)
957960
| SynPat.As (range = m)
958961
| SynPat.LongIdent (range = m)

src/Compiler/SyntaxTree/SyntaxTree.fsi

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1050,6 +1050,9 @@ type SynPat =
10501050
/// A disjunctive pattern 'pat1 | pat2'
10511051
| Or of lhsPat: SynPat * rhsPat: SynPat * range: range * trivia: SynPatOrTrivia
10521052

1053+
/// A conjunctive pattern 'pat1 :: pat2'
1054+
| ListCons of lhsPat: SynPat * rhsPat: SynPat * range: range * trivia: SynPatListConsTrivia
1055+
10531056
/// A conjunctive pattern 'pat1 & pat2'
10541057
| Ands of pats: SynPat list * range: range
10551058

src/Compiler/SyntaxTree/SyntaxTrivia.fs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,9 @@ type SynUnionCaseTrivia = { BarRange: range option }
122122
[<NoEquality; NoComparison>]
123123
type SynPatOrTrivia = { BarRange: range }
124124

125+
[<NoEquality; NoComparison>]
126+
type SynPatListConsTrivia = { ColonColonRange: range }
127+
125128
[<NoEquality; NoComparison>]
126129
type SynTypeDefnTrivia =
127130
{

src/Compiler/SyntaxTree/SyntaxTrivia.fsi

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,14 @@ type SynPatOrTrivia =
199199
BarRange: range
200200
}
201201

202+
/// Represents additional information for SynPat.Cons
203+
[<NoEquality; NoComparison>]
204+
type SynPatListConsTrivia =
205+
{
206+
/// The syntax range of the `::` token.
207+
ColonColonRange: range
208+
}
209+
202210
/// Represents additional information for SynTypeDefn
203211
[<NoEquality; NoComparison>]
204212
type SynTypeDefnTrivia =

src/Compiler/pars.fsy

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3124,7 +3124,8 @@ headBindingPattern:
31243124
SynPat.Or($1, $3, rhs2 parseState 1 3, { BarRange = mBar }) }
31253125

31263126
| headBindingPattern COLON_COLON headBindingPattern
3127-
{ SynPat.LongIdent (SynLongIdent(mkSynCaseName (rhs parseState 2) opNameCons, [], [ Some (IdentTrivia.OriginalNotation "::") ]), None, None, SynArgPats.Pats [SynPat.Tuple (false, [$1;$3], rhs2 parseState 1 3)], None, lhs parseState) }
3127+
{ let mColonColon = rhs parseState 2
3128+
SynPat.ListCons($1, $3, rhs2 parseState 1 3, { ColonColonRange = mColonColon }) }
31283129

31293130
| tuplePatternElements %prec pat_tuple
31303131
{ let pats = normalizeTuplePat $1
@@ -3398,7 +3399,8 @@ parenPattern:
33983399
SynPat.Attrib($2, $1, mLhs) }
33993400

34003401
| parenPattern COLON_COLON parenPattern
3401-
{ SynPat.LongIdent (SynLongIdent(mkSynCaseName (rhs parseState 2) opNameCons, [], [ Some (IdentTrivia.OriginalNotation "::") ]), None, None, SynArgPats.Pats [ SynPat.Tuple (false, [$1;$3], rhs2 parseState 1 3) ], None, lhs parseState) }
3402+
{ let mColonColon = rhs parseState 2
3403+
SynPat.ListCons($1, $3, rhs2 parseState 1 3, { ColonColonRange = mColonColon }) }
34023404

34033405
| constrPattern { $1 }
34043406

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

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8004,6 +8004,14 @@ FSharp.Compiler.Syntax.SynPat+IsInst: FSharp.Compiler.Syntax.SynType get_pat()
80048004
FSharp.Compiler.Syntax.SynPat+IsInst: FSharp.Compiler.Syntax.SynType pat
80058005
FSharp.Compiler.Syntax.SynPat+IsInst: FSharp.Compiler.Text.Range get_range()
80068006
FSharp.Compiler.Syntax.SynPat+IsInst: FSharp.Compiler.Text.Range range
8007+
FSharp.Compiler.Syntax.SynPat+ListCons: FSharp.Compiler.Syntax.SynPat get_lhsPat()
8008+
FSharp.Compiler.Syntax.SynPat+ListCons: FSharp.Compiler.Syntax.SynPat get_rhsPat()
8009+
FSharp.Compiler.Syntax.SynPat+ListCons: FSharp.Compiler.Syntax.SynPat lhsPat
8010+
FSharp.Compiler.Syntax.SynPat+ListCons: FSharp.Compiler.Syntax.SynPat rhsPat
8011+
FSharp.Compiler.Syntax.SynPat+ListCons: FSharp.Compiler.SyntaxTrivia.SynPatListConsTrivia get_trivia()
8012+
FSharp.Compiler.Syntax.SynPat+ListCons: FSharp.Compiler.SyntaxTrivia.SynPatListConsTrivia trivia
8013+
FSharp.Compiler.Syntax.SynPat+ListCons: FSharp.Compiler.Text.Range get_range()
8014+
FSharp.Compiler.Syntax.SynPat+ListCons: FSharp.Compiler.Text.Range range
80078015
FSharp.Compiler.Syntax.SynPat+LongIdent: FSharp.Compiler.Syntax.SynArgPats argPats
80088016
FSharp.Compiler.Syntax.SynPat+LongIdent: FSharp.Compiler.Syntax.SynArgPats get_argPats()
80098017
FSharp.Compiler.Syntax.SynPat+LongIdent: FSharp.Compiler.Syntax.SynLongIdent get_longDotId()
@@ -8059,6 +8067,7 @@ FSharp.Compiler.Syntax.SynPat+Tags: Int32 DeprecatedCharRange
80598067
FSharp.Compiler.Syntax.SynPat+Tags: Int32 FromParseError
80608068
FSharp.Compiler.Syntax.SynPat+Tags: Int32 InstanceMember
80618069
FSharp.Compiler.Syntax.SynPat+Tags: Int32 IsInst
8070+
FSharp.Compiler.Syntax.SynPat+Tags: Int32 ListCons
80628071
FSharp.Compiler.Syntax.SynPat+Tags: Int32 LongIdent
80638072
FSharp.Compiler.Syntax.SynPat+Tags: Int32 Named
80648073
FSharp.Compiler.Syntax.SynPat+Tags: Int32 Null
@@ -8093,6 +8102,7 @@ FSharp.Compiler.Syntax.SynPat: Boolean IsDeprecatedCharRange
80938102
FSharp.Compiler.Syntax.SynPat: Boolean IsFromParseError
80948103
FSharp.Compiler.Syntax.SynPat: Boolean IsInstanceMember
80958104
FSharp.Compiler.Syntax.SynPat: Boolean IsIsInst
8105+
FSharp.Compiler.Syntax.SynPat: Boolean IsListCons
80968106
FSharp.Compiler.Syntax.SynPat: Boolean IsLongIdent
80978107
FSharp.Compiler.Syntax.SynPat: Boolean IsNamed
80988108
FSharp.Compiler.Syntax.SynPat: Boolean IsNull
@@ -8113,6 +8123,7 @@ FSharp.Compiler.Syntax.SynPat: Boolean get_IsDeprecatedCharRange()
81138123
FSharp.Compiler.Syntax.SynPat: Boolean get_IsFromParseError()
81148124
FSharp.Compiler.Syntax.SynPat: Boolean get_IsInstanceMember()
81158125
FSharp.Compiler.Syntax.SynPat: Boolean get_IsIsInst()
8126+
FSharp.Compiler.Syntax.SynPat: Boolean get_IsListCons()
81168127
FSharp.Compiler.Syntax.SynPat: Boolean get_IsLongIdent()
81178128
FSharp.Compiler.Syntax.SynPat: Boolean get_IsNamed()
81188129
FSharp.Compiler.Syntax.SynPat: Boolean get_IsNull()
@@ -8133,6 +8144,7 @@ FSharp.Compiler.Syntax.SynPat: FSharp.Compiler.Syntax.SynPat NewDeprecatedCharRa
81338144
FSharp.Compiler.Syntax.SynPat: FSharp.Compiler.Syntax.SynPat NewFromParseError(FSharp.Compiler.Syntax.SynPat, FSharp.Compiler.Text.Range)
81348145
FSharp.Compiler.Syntax.SynPat: FSharp.Compiler.Syntax.SynPat NewInstanceMember(FSharp.Compiler.Syntax.Ident, FSharp.Compiler.Syntax.Ident, Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.Ident], Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.SynAccess], FSharp.Compiler.Text.Range)
81358146
FSharp.Compiler.Syntax.SynPat: FSharp.Compiler.Syntax.SynPat NewIsInst(FSharp.Compiler.Syntax.SynType, FSharp.Compiler.Text.Range)
8147+
FSharp.Compiler.Syntax.SynPat: FSharp.Compiler.Syntax.SynPat NewListCons(FSharp.Compiler.Syntax.SynPat, FSharp.Compiler.Syntax.SynPat, FSharp.Compiler.Text.Range, FSharp.Compiler.SyntaxTrivia.SynPatListConsTrivia)
81368148
FSharp.Compiler.Syntax.SynPat: FSharp.Compiler.Syntax.SynPat NewLongIdent(FSharp.Compiler.Syntax.SynLongIdent, Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.Ident], Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.SynValTyparDecls], FSharp.Compiler.Syntax.SynArgPats, Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.SynAccess], FSharp.Compiler.Text.Range)
81378149
FSharp.Compiler.Syntax.SynPat: FSharp.Compiler.Syntax.SynPat NewNamed(FSharp.Compiler.Syntax.SynIdent, Boolean, Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.SynAccess], FSharp.Compiler.Text.Range)
81388150
FSharp.Compiler.Syntax.SynPat: FSharp.Compiler.Syntax.SynPat NewNull(FSharp.Compiler.Text.Range)
@@ -8153,6 +8165,7 @@ FSharp.Compiler.Syntax.SynPat: FSharp.Compiler.Syntax.SynPat+DeprecatedCharRange
81538165
FSharp.Compiler.Syntax.SynPat: FSharp.Compiler.Syntax.SynPat+FromParseError
81548166
FSharp.Compiler.Syntax.SynPat: FSharp.Compiler.Syntax.SynPat+InstanceMember
81558167
FSharp.Compiler.Syntax.SynPat: FSharp.Compiler.Syntax.SynPat+IsInst
8168+
FSharp.Compiler.Syntax.SynPat: FSharp.Compiler.Syntax.SynPat+ListCons
81568169
FSharp.Compiler.Syntax.SynPat: FSharp.Compiler.Syntax.SynPat+LongIdent
81578170
FSharp.Compiler.Syntax.SynPat: FSharp.Compiler.Syntax.SynPat+Named
81588171
FSharp.Compiler.Syntax.SynPat: FSharp.Compiler.Syntax.SynPat+Null
@@ -9556,6 +9569,11 @@ FSharp.Compiler.SyntaxTrivia.SynModuleSigDeclNestedModuleTrivia: Microsoft.FShar
95569569
FSharp.Compiler.SyntaxTrivia.SynModuleSigDeclNestedModuleTrivia: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range] get_ModuleKeyword()
95579570
FSharp.Compiler.SyntaxTrivia.SynModuleSigDeclNestedModuleTrivia: System.String ToString()
95589571
FSharp.Compiler.SyntaxTrivia.SynModuleSigDeclNestedModuleTrivia: Void .ctor(Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range], Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range])
9572+
FSharp.Compiler.SyntaxTrivia.SynPatListConsTrivia
9573+
FSharp.Compiler.SyntaxTrivia.SynPatListConsTrivia: FSharp.Compiler.Text.Range ColonColonRange
9574+
FSharp.Compiler.SyntaxTrivia.SynPatListConsTrivia: FSharp.Compiler.Text.Range get_ColonColonRange()
9575+
FSharp.Compiler.SyntaxTrivia.SynPatListConsTrivia: System.String ToString()
9576+
FSharp.Compiler.SyntaxTrivia.SynPatListConsTrivia: Void .ctor(FSharp.Compiler.Text.Range)
95599577
FSharp.Compiler.SyntaxTrivia.SynPatOrTrivia
95609578
FSharp.Compiler.SyntaxTrivia.SynPatOrTrivia: FSharp.Compiler.Text.Range BarRange
95619579
FSharp.Compiler.SyntaxTrivia.SynPatOrTrivia: FSharp.Compiler.Text.Range get_BarRange()

0 commit comments

Comments
 (0)