@@ -1039,7 +1039,28 @@ fn parse_dot_or_call_expr_with(p: parser, e0: pexpr) -> pexpr {
1039
1039
let e = e0;
1040
1040
let lo = e. span . lo ;
1041
1041
let hi = e. span . hi ;
1042
- while !expr_is_complete ( p, e) {
1042
+ while true {
1043
+ // expr.f
1044
+ if eat ( p, token:: DOT ) {
1045
+ alt p. token {
1046
+ token:: IDENT ( i, _) {
1047
+ hi = p. span . hi ;
1048
+ p. bump ( ) ;
1049
+ let tys = if eat ( p, token:: MOD_SEP ) {
1050
+ expect ( p, token:: LT ) ;
1051
+ parse_seq_to_gt ( some ( token:: COMMA ) ,
1052
+ { |p| parse_ty ( p, false ) } , p)
1053
+ } else { [ ] } ;
1054
+ e = mk_pexpr ( p, lo, hi,
1055
+ ast:: expr_field ( to_expr ( e) ,
1056
+ p. get_str ( i) ,
1057
+ tys) ) ;
1058
+ }
1059
+ t { unexpected( p, t) ; }
1060
+ }
1061
+ cont;
1062
+ }
1063
+ if expr_is_complete ( p, e) { break ; }
1043
1064
alt p. token {
1044
1065
// expr(...)
1045
1066
token:: LPAREN if permits_call ( p) {
@@ -1076,27 +1097,6 @@ fn parse_dot_or_call_expr_with(p: parser, e0: pexpr) -> pexpr {
1076
1097
e = mk_pexpr ( p, lo, hi, ast:: expr_index ( to_expr ( e) , ix) ) ;
1077
1098
}
1078
1099
1079
- // expr.f
1080
- token:: DOT {
1081
- p. bump ( ) ;
1082
- alt p. token {
1083
- token:: IDENT ( i, _) {
1084
- hi = p. span . hi ;
1085
- p. bump ( ) ;
1086
- let tys = if eat ( p, token:: MOD_SEP ) {
1087
- expect ( p, token:: LT ) ;
1088
- parse_seq_to_gt ( some ( token:: COMMA ) ,
1089
- { |p| parse_ty ( p, false ) } , p)
1090
- } else { [ ] } ;
1091
- e = mk_pexpr ( p, lo, hi,
1092
- ast:: expr_field ( to_expr ( e) ,
1093
- p. get_str ( i) ,
1094
- tys) ) ;
1095
- }
1096
- t { unexpected( p, t) ; }
1097
- }
1098
- }
1099
-
1100
1100
_ { ret e; }
1101
1101
}
1102
1102
}
0 commit comments