@@ -406,7 +406,9 @@ impl Parser {
406
406
// consume token 'tok' if it exists. Returns true if the given
407
407
// token was present, false otherwise.
408
408
pub fn eat ( & self , tok : & token:: Token ) -> bool {
409
- return if * self . token == * tok { self . bump ( ) ; true } else { false } ;
409
+ let is_present = * self . token == * tok;
410
+ if is_present { self . bump ( ) }
411
+ is_present
410
412
}
411
413
412
414
pub fn is_keyword ( & self , kw : keywords:: Keyword ) -> bool {
@@ -458,21 +460,16 @@ impl Parser {
458
460
// with a single > and continue. If a GT is not seen,
459
461
// signal an error.
460
462
pub fn expect_gt ( & self ) {
461
- if * self . token == token:: GT {
462
- self . bump ( ) ;
463
- } else if * self . token == token:: BINOP ( token:: SHR ) {
464
- self . replace_token (
463
+ match * self . token {
464
+ token:: GT => self . bump ( ) ,
465
+ token:: BINOP ( token:: SHR ) => self . replace_token (
465
466
token:: GT ,
466
467
self . span . lo + BytePos ( 1 u) ,
467
468
self . span . hi
468
- ) ;
469
- } else {
470
- let mut s: ~str = ~"expected `";
471
- s. push_str ( self . token_to_str ( & token:: GT ) ) ;
472
- s. push_str ( "`, found `" ) ;
473
- s. push_str ( self . this_token_to_str ( ) ) ;
474
- s. push_str ( "`" ) ;
475
- self . fatal ( s) ;
469
+ ) ,
470
+ _ => self . fatal ( fmt ! ( "expected `%s`, found `%s`" ,
471
+ self . token_to_str( & token:: GT ) ,
472
+ self . this_token_to_str( ) ) )
476
473
}
477
474
}
478
475
@@ -1114,19 +1111,20 @@ impl Parser {
1114
1111
}
1115
1112
1116
1113
pub fn is_named_argument ( & self ) -> bool {
1117
- let offset = if * self . token == token:: BINOP ( token:: AND ) {
1118
- 1
1119
- } else if * self . token == token:: BINOP ( token:: MINUS ) {
1120
- 1
1121
- } else if * self . token == token:: ANDAND {
1122
- 1
1123
- } else if * self . token == token:: BINOP ( token:: PLUS ) {
1124
- if self . look_ahead ( 1 , |t| * t == token:: BINOP ( token:: PLUS ) ) {
1125
- 2
1126
- } else {
1127
- 1
1128
- }
1129
- } else { 0 } ;
1114
+ let offset = match * self . token {
1115
+ token:: BINOP ( token:: AND ) => 1 ,
1116
+ token:: BINOP ( token:: MINUS ) => 1 ,
1117
+ token:: ANDAND => 1 ,
1118
+ token:: BINOP ( token:: PLUS ) => {
1119
+ if self . look_ahead ( 1 , |t| * t == token:: BINOP ( token:: PLUS ) ) {
1120
+ 2
1121
+ } else {
1122
+ 1
1123
+ }
1124
+ } ,
1125
+ _ => 0
1126
+ } ;
1127
+
1130
1128
if offset == 0 {
1131
1129
is_plain_ident ( & * self . token )
1132
1130
&& self . look_ahead ( 1 , |t| * t == token:: COLON )
@@ -1868,21 +1866,26 @@ impl Parser {
1868
1866
// parse an optional separator followed by a kleene-style
1869
1867
// repetition token (+ or *).
1870
1868
pub fn parse_sep_and_zerok ( & self ) -> ( Option < token:: Token > , bool ) {
1871
- if * self . token == token:: BINOP ( token:: STAR )
1872
- || * self . token == token:: BINOP ( token:: PLUS ) {
1873
- let zerok = * self . token == token:: BINOP ( token:: STAR ) ;
1874
- self . bump ( ) ;
1875
- ( None , zerok)
1876
- } else {
1877
- let sep = self . bump_and_get ( ) ;
1878
- if * self . token == token:: BINOP ( token:: STAR )
1879
- || * self . token == token:: BINOP ( token:: PLUS ) {
1880
- let zerok = * self . token == token:: BINOP ( token:: STAR ) ;
1881
- self . bump ( ) ;
1882
- ( Some ( sep) , zerok)
1883
- } else {
1884
- self . fatal ( "expected `*` or `+`" ) ;
1869
+ fn parse_zerok ( parser : & Parser ) -> Option < bool > {
1870
+ match * parser. token {
1871
+ token:: BINOP ( token:: STAR ) | token:: BINOP ( token:: PLUS ) => {
1872
+ let zerok = * parser. token == token:: BINOP ( token:: STAR ) ;
1873
+ parser. bump ( ) ;
1874
+ Some ( zerok)
1875
+ } ,
1876
+ _ => None
1885
1877
}
1878
+ } ;
1879
+
1880
+ match parse_zerok ( self ) {
1881
+ Some ( zerok) => return ( None , zerok) ,
1882
+ None => { }
1883
+ }
1884
+
1885
+ let separator = self . bump_and_get ( ) ;
1886
+ match parse_zerok ( self ) {
1887
+ Some ( zerok) => ( Some ( separator) , zerok) ,
1888
+ None => self . fatal ( "expected `*` or `+`" )
1886
1889
}
1887
1890
}
1888
1891
@@ -2144,39 +2147,45 @@ impl Parser {
2144
2147
// parse an expression of binops of at least min_prec precedence
2145
2148
pub fn parse_more_binops ( & self , lhs: @expr, min_prec : uint ) -> @expr {
2146
2149
if self . expr_is_complete ( lhs) { return lhs; }
2147
- if token:: BINOP ( token:: OR ) == * self . token &&
2148
- ( * self . restriction == RESTRICT_NO_BAR_OP ||
2149
- * self . restriction == RESTRICT_NO_BAR_OR_DOUBLEBAR_OP ) {
2150
- lhs
2151
- } else if token:: OROR == * self . token &&
2152
- * self . restriction == RESTRICT_NO_BAR_OR_DOUBLEBAR_OP {
2153
- lhs
2154
- } else {
2155
- let cur_opt = token_to_binop ( self . token ) ;
2156
- match cur_opt {
2157
- Some ( cur_op) => {
2158
- let cur_prec = operator_prec ( cur_op) ;
2159
- if cur_prec > min_prec {
2160
- self . bump ( ) ;
2161
- let expr = self . parse_prefix_expr ( ) ;
2162
- let rhs = self . parse_more_binops ( expr, cur_prec) ;
2163
- let bin = self . mk_expr ( lhs. span . lo , rhs. span . hi ,
2164
- self . mk_binary ( cur_op, lhs, rhs) ) ;
2165
- self . parse_more_binops ( bin, min_prec)
2166
- } else {
2167
- lhs
2168
- }
2150
+
2151
+ // Prevent dynamic borrow errors later on by limiting the
2152
+ // scope of the borrows.
2153
+ {
2154
+ let token: & token:: Token = self . token ;
2155
+ let restriction: & restriction = self . restriction ;
2156
+ match ( token, restriction) {
2157
+ ( & token:: BINOP ( token:: OR ) , & RESTRICT_NO_BAR_OP ) => return lhs,
2158
+ ( & token:: BINOP ( token:: OR ) ,
2159
+ & RESTRICT_NO_BAR_OR_DOUBLEBAR_OP ) => return lhs,
2160
+ ( & token:: OROR , & RESTRICT_NO_BAR_OR_DOUBLEBAR_OP ) => return lhs,
2161
+ _ => { }
2162
+ }
2163
+ }
2164
+
2165
+ let cur_opt = token_to_binop ( self . token ) ;
2166
+ match cur_opt {
2167
+ Some ( cur_op) => {
2168
+ let cur_prec = operator_prec ( cur_op) ;
2169
+ if cur_prec > min_prec {
2170
+ self . bump ( ) ;
2171
+ let expr = self . parse_prefix_expr ( ) ;
2172
+ let rhs = self . parse_more_binops ( expr, cur_prec) ;
2173
+ let bin = self . mk_expr ( lhs. span . lo , rhs. span . hi ,
2174
+ self . mk_binary ( cur_op, lhs, rhs) ) ;
2175
+ self . parse_more_binops ( bin, min_prec)
2176
+ } else {
2177
+ lhs
2169
2178
}
2170
- None => {
2171
- if as_prec > min_prec && self . eat_keyword ( keywords :: As ) {
2172
- let rhs = self . parse_ty ( true ) ;
2173
- let _as = self . mk_expr ( lhs . span . lo ,
2174
- rhs . span . hi ,
2175
- expr_cast ( lhs , rhs) ) ;
2176
- self . parse_more_binops ( _as , min_prec )
2177
- } else {
2178
- lhs
2179
- }
2179
+ }
2180
+ None => {
2181
+ if as_prec > min_prec && self . eat_keyword ( keywords :: As ) {
2182
+ let rhs = self . parse_ty ( true ) ;
2183
+ let _as = self . mk_expr ( lhs . span . lo ,
2184
+ rhs. span . hi ,
2185
+ expr_cast ( lhs , rhs ) ) ;
2186
+ self . parse_more_binops ( _as , min_prec )
2187
+ } else {
2188
+ lhs
2180
2189
}
2181
2190
}
2182
2191
}
@@ -2197,19 +2206,18 @@ impl Parser {
2197
2206
token:: BINOPEQ ( op) => {
2198
2207
self . bump ( ) ;
2199
2208
let rhs = self . parse_expr ( ) ;
2200
- let aop;
2201
- match op {
2202
- token:: PLUS => aop = add,
2203
- token:: MINUS => aop = subtract,
2204
- token:: STAR => aop = mul,
2205
- token:: SLASH => aop = div,
2206
- token:: PERCENT => aop = rem,
2207
- token:: CARET => aop = bitxor,
2208
- token:: AND => aop = bitand,
2209
- token:: OR => aop = bitor,
2210
- token:: SHL => aop = shl,
2211
- token:: SHR => aop = shr
2212
- }
2209
+ let aop = match op {
2210
+ token:: PLUS => add,
2211
+ token:: MINUS => subtract,
2212
+ token:: STAR => mul,
2213
+ token:: SLASH => div,
2214
+ token:: PERCENT => rem,
2215
+ token:: CARET => bitxor,
2216
+ token:: AND => bitand,
2217
+ token:: OR => bitor,
2218
+ token:: SHL => shl,
2219
+ token:: SHR => shr
2220
+ } ;
2213
2221
self . mk_expr ( lo, rhs. span . hi ,
2214
2222
self . mk_assign_op ( aop, lhs, rhs) )
2215
2223
}
@@ -2758,6 +2766,7 @@ impl Parser {
2758
2766
self . bump ( ) ;
2759
2767
let ( before, slice, after) =
2760
2768
self . parse_pat_vec_elements ( ) ;
2769
+
2761
2770
self . expect ( & token:: RBRACKET ) ;
2762
2771
pat = ast:: pat_vec ( before, slice, after) ;
2763
2772
hi = self . last_span . hi ;
@@ -3349,19 +3358,15 @@ impl Parser {
3349
3358
}
3350
3359
3351
3360
// parse a generic use site
3352
- fn parse_generic_values (
3353
- & self ) -> ( OptVec < ast:: Lifetime > , ~[ Ty ] )
3354
- {
3361
+ fn parse_generic_values ( & self ) -> ( OptVec < ast:: Lifetime > , ~[ Ty ] ) {
3355
3362
if !self . eat ( & token:: LT ) {
3356
3363
( opt_vec:: Empty , ~[ ] )
3357
3364
} else {
3358
3365
self . parse_generic_values_after_lt ( )
3359
3366
}
3360
3367
}
3361
3368
3362
- fn parse_generic_values_after_lt (
3363
- & self ) -> ( OptVec < ast:: Lifetime > , ~[ Ty ] )
3364
- {
3369
+ fn parse_generic_values_after_lt ( & self ) -> ( OptVec < ast:: Lifetime > , ~[ Ty ] ) {
3365
3370
let lifetimes = self . parse_lifetimes ( ) ;
3366
3371
let result = self . parse_seq_to_gt (
3367
3372
Some ( token:: COMMA ) ,
@@ -3390,11 +3395,7 @@ impl Parser {
3390
3395
}
3391
3396
3392
3397
fn is_self_ident ( & self ) -> bool {
3393
- match * self . token {
3394
- token:: IDENT ( id, false ) if id == special_idents:: self_
3395
- => true ,
3396
- _ => false
3397
- }
3398
+ * self . token == token:: IDENT ( special_idents:: self_, false )
3398
3399
}
3399
3400
3400
3401
fn expect_self_ident ( & self ) {
@@ -4649,14 +4650,12 @@ impl Parser {
4649
4650
4650
4651
pub fn parse_item ( & self , attrs : ~[ Attribute ] ) -> Option < @ast:: item > {
4651
4652
match self . parse_item_or_view_item ( attrs, true ) {
4652
- iovi_none( _) =>
4653
- None ,
4653
+ iovi_none( _) => None ,
4654
4654
iovi_view_item( _) =>
4655
4655
self . fatal ( "view items are not allowed here" ) ,
4656
4656
iovi_foreign_item( _) =>
4657
4657
self . fatal ( "foreign items are not allowed here" ) ,
4658
- iovi_item( item) =>
4659
- Some ( item)
4658
+ iovi_item( item) => Some ( item)
4660
4659
}
4661
4660
}
4662
4661
@@ -4819,6 +4818,7 @@ impl Parser {
4819
4818
// First, parse view items.
4820
4819
let mut view_items : ~[ ast:: view_item ] = ~[ ] ;
4821
4820
let mut items = ~[ ] ;
4821
+
4822
4822
// I think this code would probably read better as a single
4823
4823
// loop with a mutable three-state-variable (for extern mods,
4824
4824
// view items, and regular items) ... except that because
0 commit comments