@@ -58,33 +58,11 @@ impl<'a> Parser<'a> {
58
58
// (1 token), but it fact not a path. Also, we avoid stealing syntax from `parse_item_`.
59
59
if self . token . is_path_start ( ) && !self . token . is_qpath_start ( ) && !self . is_path_start_item ( )
60
60
{
61
- let path = self . parse_path ( PathStyle :: Expr ) ?;
62
-
63
- if self . eat ( & token:: Not ) {
64
- return self . parse_stmt_mac ( lo, attrs. into ( ) , path) ;
65
- }
66
-
67
- let expr = if self . check ( & token:: OpenDelim ( token:: Brace ) ) {
68
- self . parse_struct_expr ( lo, path, AttrVec :: new ( ) ) ?
69
- } else {
70
- let hi = self . prev_span ;
71
- self . mk_expr ( lo. to ( hi) , ExprKind :: Path ( None , path) , AttrVec :: new ( ) )
72
- } ;
73
-
74
- let expr = self . with_res ( Restrictions :: STMT_EXPR , |this| {
75
- let expr = this. parse_dot_or_call_expr_with ( expr, lo, attrs. into ( ) ) ?;
76
- this. parse_assoc_expr_with ( 0 , LhsExpr :: AlreadyParsed ( expr) )
77
- } ) ?;
78
- return Ok ( Some ( self . mk_stmt ( lo. to ( self . prev_span ) , StmtKind :: Expr ( expr) ) ) ) ;
61
+ return self . parse_stmt_path_start ( lo, attrs) . map ( Some ) ;
79
62
}
80
63
81
- // FIXME: Bad copy of attrs
82
- let old_directory_ownership =
83
- mem:: replace ( & mut self . directory . ownership , DirectoryOwnership :: UnownedViaBlock ) ;
84
- let item = self . parse_item_common ( attrs. clone ( ) , false , true , |_| true ) ?;
85
- self . directory . ownership = old_directory_ownership;
86
-
87
- if let Some ( item) = item {
64
+ if let Some ( item) = self . parse_stmt_item ( attrs. clone ( ) ) ? {
65
+ // FIXME: Bad copy of attrs
88
66
return Ok ( Some ( self . mk_stmt ( lo. to ( item. span ) , StmtKind :: Item ( P ( item) ) ) ) ) ;
89
67
}
90
68
@@ -117,14 +95,37 @@ impl<'a> Parser<'a> {
117
95
Ok ( Some ( self . mk_stmt ( lo. to ( e. span ) , StmtKind :: Expr ( e) ) ) )
118
96
}
119
97
98
+ fn parse_stmt_item ( & mut self , attrs : Vec < Attribute > ) -> PResult < ' a , Option < ast:: Item > > {
99
+ let old = mem:: replace ( & mut self . directory . ownership , DirectoryOwnership :: UnownedViaBlock ) ;
100
+ let item = self . parse_item_common ( attrs. clone ( ) , false , true , |_| true ) ?;
101
+ self . directory . ownership = old;
102
+ Ok ( item)
103
+ }
104
+
105
+ fn parse_stmt_path_start ( & mut self , lo : Span , attrs : Vec < Attribute > ) -> PResult < ' a , Stmt > {
106
+ let path = self . parse_path ( PathStyle :: Expr ) ?;
107
+
108
+ if self . eat ( & token:: Not ) {
109
+ return self . parse_stmt_mac ( lo, attrs. into ( ) , path) ;
110
+ }
111
+
112
+ let expr = if self . check ( & token:: OpenDelim ( token:: Brace ) ) {
113
+ self . parse_struct_expr ( lo, path, AttrVec :: new ( ) ) ?
114
+ } else {
115
+ let hi = self . prev_span ;
116
+ self . mk_expr ( lo. to ( hi) , ExprKind :: Path ( None , path) , AttrVec :: new ( ) )
117
+ } ;
118
+
119
+ let expr = self . with_res ( Restrictions :: STMT_EXPR , |this| {
120
+ let expr = this. parse_dot_or_call_expr_with ( expr, lo, attrs. into ( ) ) ?;
121
+ this. parse_assoc_expr_with ( 0 , LhsExpr :: AlreadyParsed ( expr) )
122
+ } ) ?;
123
+ Ok ( self . mk_stmt ( lo. to ( self . prev_span ) , StmtKind :: Expr ( expr) ) )
124
+ }
125
+
120
126
/// Parses a statement macro `mac!(args)` provided a `path` representing `mac`.
121
127
/// At this point, the `!` token after the path has already been eaten.
122
- fn parse_stmt_mac (
123
- & mut self ,
124
- lo : Span ,
125
- attrs : AttrVec ,
126
- path : ast:: Path ,
127
- ) -> PResult < ' a , Option < Stmt > > {
128
+ fn parse_stmt_mac ( & mut self , lo : Span , attrs : AttrVec , path : ast:: Path ) -> PResult < ' a , Stmt > {
128
129
let args = self . parse_mac_args ( ) ?;
129
130
let delim = args. delim ( ) ;
130
131
let hi = self . prev_span ;
@@ -145,7 +146,7 @@ impl<'a> Parser<'a> {
145
146
let e = self . parse_assoc_expr_with ( 0 , LhsExpr :: AlreadyParsed ( e) ) ?;
146
147
StmtKind :: Expr ( e)
147
148
} ;
148
- Ok ( Some ( self . mk_stmt ( lo. to ( hi) , kind) ) )
149
+ Ok ( self . mk_stmt ( lo. to ( hi) , kind) )
149
150
}
150
151
151
152
/// Error on outer attributes in this context.
0 commit comments