@@ -35,62 +35,12 @@ impl<'a> Parser<'a> {
35
35
}
36
36
}
37
37
38
- /// A wrapper around `parse_pat` with some special error handling for the
39
- /// "top-level" patterns in a match arm, `for` loop, `let`, &c. (in contrast
40
- /// to subpatterns within such).
41
38
pub ( super ) fn parse_top_level_pat ( & mut self ) -> PResult < ' a , P < Pat > > {
42
39
let pat = self . parse_pat ( None ) ?;
43
40
self . maybe_recover_unexpected_comma ( pat. span , true ) ?;
44
41
Ok ( pat)
45
42
}
46
43
47
- fn maybe_recover_unexpected_comma ( & mut self , lo : Span , top_level : bool ) -> PResult < ' a , ( ) > {
48
- if !top_level || self . token != token:: Comma {
49
- return Ok ( ( ) ) ;
50
- }
51
-
52
- // An unexpected comma after a top-level pattern is a clue that the
53
- // user (perhaps more accustomed to some other language) forgot the
54
- // parentheses in what should have been a tuple pattern; return a
55
- // suggestion-enhanced error here rather than choking on the comma later.
56
- let comma_span = self . token . span ;
57
- self . bump ( ) ;
58
- if let Err ( mut err) = self . skip_pat_list ( ) {
59
- // We didn't expect this to work anyway; we just wanted to advance to the
60
- // end of the comma-sequence so we know the span to suggest parenthesizing.
61
- err. cancel ( ) ;
62
- }
63
- let seq_span = lo. to ( self . prev_span ) ;
64
- let mut err = self . struct_span_err ( comma_span, "unexpected `,` in pattern" ) ;
65
- if let Ok ( seq_snippet) = self . span_to_snippet ( seq_span) {
66
- err. span_suggestion (
67
- seq_span,
68
- "try adding parentheses to match on a tuple.." ,
69
- format ! ( "({})" , seq_snippet) ,
70
- Applicability :: MachineApplicable
71
- )
72
- . span_suggestion (
73
- seq_span,
74
- "..or a vertical bar to match on multiple alternatives" ,
75
- format ! ( "{}" , seq_snippet. replace( "," , " |" ) ) ,
76
- Applicability :: MachineApplicable
77
- ) ;
78
- }
79
- Err ( err)
80
- }
81
-
82
- /// Parse and throw away a parentesized comma separated
83
- /// sequence of patterns until `)` is reached.
84
- fn skip_pat_list ( & mut self ) -> PResult < ' a , ( ) > {
85
- while !self . check ( & token:: CloseDelim ( token:: Paren ) ) {
86
- self . parse_pat ( None ) ?;
87
- if !self . eat ( & token:: Comma ) {
88
- return Ok ( ( ) )
89
- }
90
- }
91
- Ok ( ( ) )
92
- }
93
-
94
44
/// Parses a pattern, that may be a or-pattern (e.g. `Foo | Bar` in `Some(Foo | Bar)`).
95
45
/// Corresponds to `pat<allow_top_alt>` in RFC 2535.
96
46
fn parse_pat_with_or (
@@ -151,6 +101,55 @@ impl<'a> Parser<'a> {
151
101
. emit ( ) ;
152
102
}
153
103
104
+ /// Some special error handling for the "top-level" patterns in a match arm,
105
+ /// `for` loop, `let`, &c. (in contrast to subpatterns within such).
106
+ fn maybe_recover_unexpected_comma ( & mut self , lo : Span , top_level : bool ) -> PResult < ' a , ( ) > {
107
+ if !top_level || self . token != token:: Comma {
108
+ return Ok ( ( ) ) ;
109
+ }
110
+
111
+ // An unexpected comma after a top-level pattern is a clue that the
112
+ // user (perhaps more accustomed to some other language) forgot the
113
+ // parentheses in what should have been a tuple pattern; return a
114
+ // suggestion-enhanced error here rather than choking on the comma later.
115
+ let comma_span = self . token . span ;
116
+ self . bump ( ) ;
117
+ if let Err ( mut err) = self . skip_pat_list ( ) {
118
+ // We didn't expect this to work anyway; we just wanted to advance to the
119
+ // end of the comma-sequence so we know the span to suggest parenthesizing.
120
+ err. cancel ( ) ;
121
+ }
122
+ let seq_span = lo. to ( self . prev_span ) ;
123
+ let mut err = self . struct_span_err ( comma_span, "unexpected `,` in pattern" ) ;
124
+ if let Ok ( seq_snippet) = self . span_to_snippet ( seq_span) {
125
+ err. span_suggestion (
126
+ seq_span,
127
+ "try adding parentheses to match on a tuple.." ,
128
+ format ! ( "({})" , seq_snippet) ,
129
+ Applicability :: MachineApplicable
130
+ )
131
+ . span_suggestion (
132
+ seq_span,
133
+ "..or a vertical bar to match on multiple alternatives" ,
134
+ format ! ( "{}" , seq_snippet. replace( "," , " |" ) ) ,
135
+ Applicability :: MachineApplicable
136
+ ) ;
137
+ }
138
+ Err ( err)
139
+ }
140
+
141
+ /// Parse and throw away a parentesized comma separated
142
+ /// sequence of patterns until `)` is reached.
143
+ fn skip_pat_list ( & mut self ) -> PResult < ' a , ( ) > {
144
+ while !self . check ( & token:: CloseDelim ( token:: Paren ) ) {
145
+ self . parse_pat ( None ) ?;
146
+ if !self . eat ( & token:: Comma ) {
147
+ return Ok ( ( ) )
148
+ }
149
+ }
150
+ Ok ( ( ) )
151
+ }
152
+
154
153
/// Parses a pattern, with a setting whether modern range patterns (e.g., `a..=b`, `a..b` are
155
154
/// allowed).
156
155
fn parse_pat_with_range_pat (
0 commit comments