1
1
use crate :: ast;
2
- use crate :: { OptionSpanned as _ , Parse , ParseError , ParseErrorKind , Parser , Spanned , ToTokens } ;
2
+ use crate :: { Parse , ParseError , Parser , Spanned , ToTokens } ;
3
3
4
4
/// A block of expressions.
5
5
#[ derive( Debug , Clone , PartialEq , Eq , ToTokens , Spanned ) ]
@@ -13,15 +13,15 @@ pub struct Block {
13
13
}
14
14
15
15
impl Block {
16
- /// Test if the block expression doesn't produce a value .
16
+ /// Test if the block produces nothing .
17
17
pub fn produces_nothing ( & self ) -> bool {
18
18
let mut it = self . statements . iter ( ) ;
19
19
20
20
while let Some ( stmt) = it. next_back ( ) {
21
21
match stmt {
22
+ ast:: Stmt :: Item ( ..) => ( ) ,
22
23
ast:: Stmt :: Expr ( ..) => return false ,
23
24
ast:: Stmt :: Semi ( ..) => return true ,
24
- _ => ( ) ,
25
25
}
26
26
}
27
27
@@ -63,55 +63,9 @@ impl Parse for Block {
63
63
let mut statements = Vec :: new ( ) ;
64
64
65
65
let open = parser. parse ( ) ?;
66
- let mut must_be_last = None ;
67
66
68
67
while !parser. peek :: < ast:: CloseBrace > ( ) ? {
69
- let attributes = parser. parse ( ) ?;
70
- let visibility = parser. parse ( ) ?;
71
-
72
- if ast:: Item :: peek_as_stmt ( parser) ? {
73
- let decl: ast:: Item = ast:: Item :: parse_with_meta ( parser, attributes, visibility) ?;
74
-
75
- if let Some ( span) = must_be_last {
76
- return Err ( ParseError :: new (
77
- span,
78
- ParseErrorKind :: ExpectedBlockSemiColon {
79
- followed_span : decl. span ( ) ,
80
- } ,
81
- ) ) ;
82
- }
83
-
84
- statements. push ( ast:: Stmt :: Item ( decl) ) ;
85
- continue ;
86
- }
87
-
88
- if let Some ( span) = visibility. option_span ( ) {
89
- return Err ( ParseError :: new (
90
- span,
91
- ParseErrorKind :: UnsupportedExprVisibility ,
92
- ) ) ;
93
- }
94
-
95
- let expr: ast:: Expr = ast:: Expr :: parse_primary_with_attributes ( parser, attributes) ?;
96
-
97
- if let Some ( span) = must_be_last {
98
- return Err ( ParseError :: new (
99
- span,
100
- ParseErrorKind :: ExpectedBlockSemiColon {
101
- followed_span : expr. span ( ) ,
102
- } ,
103
- ) ) ;
104
- }
105
-
106
- if parser. peek :: < ast:: SemiColon > ( ) ? {
107
- statements. push ( ast:: Stmt :: Semi ( expr, parser. parse ( ) ?) ) ;
108
- } else {
109
- if expr. needs_semi ( ) {
110
- must_be_last = Some ( expr. span ( ) ) ;
111
- }
112
-
113
- statements. push ( ast:: Stmt :: Expr ( expr) ) ;
114
- }
68
+ statements. push ( parser. parse ( ) ?) ;
115
69
}
116
70
117
71
let close = parser. parse ( ) ?;
0 commit comments