@@ -93,46 +93,51 @@ pub(crate) fn handle_nested_loops<'a>(
9393#[ cfg( test) ]
9494mod tests {
9595 use super :: * ;
96+ use crate :: mapping:: { Mapping , MappingElse } ;
9697 use syn:: Expr ;
9798 use syn:: parse_quote;
98-
99+ # [ allow ( unused_variables ) ]
99100 #[ test]
100101 fn test_comprehension_parse ( ) {
101102 // 测试基本的列表推导式解析
102103 let comprehension: VecComprehension = parse_quote ! {
103104 x * 2 for x in vec![ 1 , 2 , 3 ]
104105 } ;
105- assert ! ( matches!( comprehension. mapping. left_key, Expr :: Binary ( _) ) ) ;
106- assert ! ( comprehension. mapping. right_expr. is_none( ) ) ;
106+ let Mapping {
107+ left_key,
108+ left_value,
109+ right_expr,
110+ } = & comprehension. mapping ;
111+ assert ! ( matches!( left_key, Expr :: Binary ( _) ) ) ;
112+ assert ! ( right_expr. is_none( ) ) ;
107113 assert_eq ! ( comprehension. iter_clauses. len( ) , 1 ) ;
108- assert ! ( matches!(
109- comprehension. iter_clauses[ 0 ] . for_in_clause. pat,
110- syn:: Pat :: Ident ( _)
111- ) ) ;
112- assert ! ( matches!(
113- comprehension. iter_clauses[ 0 ] . for_in_clause. iterable,
114- Expr :: Macro ( _)
115- ) ) ;
116- assert ! ( comprehension. iter_clauses[ 0 ] . if_clause. is_none( ) ) ;
114+ let iter_clause = & comprehension. iter_clauses [ 0 ] ;
115+ let pat = & iter_clause. for_in_clause . pat ;
116+ let iterable = & iter_clause. for_in_clause . iterable ;
117+ assert ! ( matches!( pat, syn:: Pat :: Ident ( _) ) ) ;
118+ assert ! ( matches!( iterable, Expr :: Macro ( _) ) ) ;
119+ assert ! ( iter_clause. if_clause. is_none( ) ) ;
117120 eprintln ! ( "Comprehension基本列表推导式测试通过" ) ;
118121
119122 // 测试带if条件的列表推导式解析
120123 let comprehension: VecComprehension = parse_quote ! {
121124 x * 2 for x in 1 ..10 if x > 0
122125 } ;
123- assert ! ( matches!( comprehension. mapping. left_key, Expr :: Binary ( _) ) ) ;
124- assert ! ( comprehension. mapping. right_expr. is_none( ) ) ;
126+ let Mapping {
127+ left_key,
128+ left_value,
129+ right_expr,
130+ } = & comprehension. mapping ;
131+ assert ! ( matches!( left_key, Expr :: Binary ( _) ) ) ;
132+ assert ! ( right_expr. is_none( ) ) ;
125133 assert_eq ! ( comprehension. iter_clauses. len( ) , 1 ) ;
126- assert ! ( matches!(
127- comprehension. iter_clauses[ 0 ] . for_in_clause. pat,
128- syn:: Pat :: Ident ( _)
129- ) ) ;
130- assert ! ( matches!(
131- comprehension. iter_clauses[ 0 ] . for_in_clause. iterable,
132- Expr :: Range ( _)
133- ) ) ;
134- assert ! ( comprehension. iter_clauses[ 0 ] . if_clause. is_some( ) ) ;
135- if let Some ( if_clause) = & comprehension. iter_clauses [ 0 ] . if_clause {
134+ let iter_clause = & comprehension. iter_clauses [ 0 ] ;
135+ let pat = & iter_clause. for_in_clause . pat ;
136+ let iterable = & iter_clause. for_in_clause . iterable ;
137+ assert ! ( matches!( pat, syn:: Pat :: Ident ( _) ) ) ;
138+ assert ! ( matches!( iterable, Expr :: Range ( _) ) ) ;
139+ assert ! ( iter_clause. if_clause. is_some( ) ) ;
140+ if let Some ( if_clause) = & iter_clause. if_clause {
136141 assert ! ( matches!( if_clause. conditions, syn:: Expr :: Binary ( _) ) ) ;
137142 }
138143 eprintln ! ( "Comprehension带if条件的列表推导式测试通过" ) ;
@@ -141,11 +146,21 @@ mod tests {
141146 let comprehension: VecComprehension = parse_quote ! {
142147 x * 2 if x > 0 || x < 10 && x % 2 == 0 else 0 for x in items
143148 } ;
144- assert ! ( matches!( comprehension. mapping. left_key, Expr :: Binary ( _) ) ) ;
145- assert ! ( comprehension. mapping. right_expr. is_some( ) ) ;
146- if let Some ( mapping_else) = & comprehension. mapping . right_expr {
147- assert ! ( matches!( mapping_else. conditions, Expr :: Binary ( _) ) ) ;
148- assert ! ( matches!( mapping_else. else_key, Expr :: Lit ( _) ) ) ;
149+ let Mapping {
150+ left_key,
151+ left_value,
152+ right_expr,
153+ } = & comprehension. mapping ;
154+ assert ! ( matches!( left_key, Expr :: Binary ( _) ) ) ;
155+ assert ! ( right_expr. is_some( ) ) ;
156+ if let Some ( mapping_else) = right_expr {
157+ let MappingElse {
158+ conditions,
159+ else_key,
160+ else_value,
161+ } = mapping_else;
162+ assert ! ( matches!( conditions, Expr :: Binary ( _) ) ) ;
163+ assert ! ( matches!( else_key, Expr :: Lit ( _) ) ) ;
149164 }
150165 assert_eq ! ( comprehension. iter_clauses. len( ) , 1 ) ;
151166 eprintln ! ( "Comprehension带条件表达式的列表推导式测试通过" ) ;
@@ -154,23 +169,27 @@ mod tests {
154169 let comprehension: VecComprehension = parse_quote ! {
155170 x + y for x in outer for y in inner
156171 } ;
157- assert ! ( matches!( comprehension. mapping. left_key, Expr :: Binary ( _) ) ) ;
158- assert ! ( comprehension. mapping. right_expr. is_none( ) ) ;
172+ let Mapping {
173+ left_key,
174+ left_value,
175+ right_expr,
176+ } = & comprehension. mapping ;
177+ assert ! ( matches!( left_key, Expr :: Binary ( _) ) ) ;
178+ assert ! ( right_expr. is_none( ) ) ;
159179 assert_eq ! ( comprehension. iter_clauses. len( ) , 2 ) ;
180+ let first_clause = & comprehension. iter_clauses [ 0 ] ;
181+ let second_clause = & comprehension. iter_clauses [ 1 ] ;
182+ assert ! ( matches!( first_clause. for_in_clause. pat, syn:: Pat :: Ident ( _) ) ) ;
160183 assert ! ( matches!(
161- comprehension. iter_clauses[ 0 ] . for_in_clause. pat,
162- syn:: Pat :: Ident ( _)
163- ) ) ;
164- assert ! ( matches!(
165- comprehension. iter_clauses[ 0 ] . for_in_clause. iterable,
184+ first_clause. for_in_clause. iterable,
166185 syn:: Expr :: Path ( _)
167186 ) ) ;
168187 assert ! ( matches!(
169- comprehension . iter_clauses [ 1 ] . for_in_clause. pat,
188+ second_clause . for_in_clause. pat,
170189 syn:: Pat :: Ident ( _)
171190 ) ) ;
172191 assert ! ( matches!(
173- comprehension . iter_clauses [ 1 ] . for_in_clause. iterable,
192+ second_clause . for_in_clause. iterable,
174193 syn:: Expr :: Path ( _)
175194 ) ) ;
176195 eprintln ! ( "Comprehension多层嵌套的列表推导式测试通过" ) ;
@@ -181,39 +200,54 @@ mod tests {
181200 for x in ( 0 ..10 ) if x % 2 == 0
182201 for y in ( 0 ..x) if y % 3 == 0
183202 } ;
184- assert ! ( matches!( comprehension. mapping. left_key, Expr :: Array ( _) ) ) ;
185- assert ! ( comprehension. mapping. right_expr. is_some( ) ) ;
186- if let Some ( mapping_else) = & comprehension. mapping . right_expr {
187- assert ! ( matches!( mapping_else. conditions, Expr :: Binary ( _) ) ) ;
188- assert ! ( matches!( mapping_else. else_key, Expr :: Tuple ( _) ) ) ;
203+ let Mapping {
204+ left_key,
205+ left_value,
206+ right_expr,
207+ } = & comprehension. mapping ;
208+ assert ! ( matches!( left_key, Expr :: Array ( _) ) ) ;
209+ assert ! ( right_expr. is_some( ) ) ;
210+ if let Some ( mapping_else) = right_expr {
211+ let MappingElse {
212+ conditions,
213+ else_key,
214+ else_value,
215+ } = mapping_else;
216+ assert ! ( matches!( conditions, Expr :: Binary ( _) ) ) ;
217+ assert ! ( matches!( else_key, Expr :: Tuple ( _) ) ) ;
189218 }
190219
191220 assert_eq ! ( comprehension. iter_clauses. len( ) , 2 ) ;
221+ let first_clause = & comprehension. iter_clauses [ 0 ] ;
222+ let second_clause = & comprehension. iter_clauses [ 1 ] ;
192223 assert ! ( matches!(
193- comprehension . iter_clauses [ 1 ] . for_in_clause. iterable,
224+ second_clause . for_in_clause. iterable,
194225 Expr :: Paren ( _)
195226 ) ) ;
196227 // eprintln!(
197228 // "{:#?}",
198229 // comprehension.iter_clauses[1].for_in_clause.iterable
199230 // );
200- assert ! ( comprehension . iter_clauses [ 0 ] . if_clause. is_some( ) ) ;
201- assert ! ( comprehension . iter_clauses [ 1 ] . if_clause. is_some( ) ) ;
231+ assert ! ( first_clause . if_clause. is_some( ) ) ;
232+ assert ! ( second_clause . if_clause. is_some( ) ) ;
202233
203234 eprintln ! ( "Comprehension复杂的多层嵌套带条件的列表推导式测试通过" ) ;
204235
205236 // 测试使用复杂表达式的列表推导式解析
206237 let comprehension: VecComprehension = parse_quote ! {
207238 x. method( ) . call( ) for x in items. iter( ) . filter( |i| i. is_valid( ) )
208239 } ;
209- assert ! ( matches!(
210- comprehension. mapping. left_key,
211- Expr :: MethodCall ( _)
212- ) ) ;
213- assert ! ( comprehension. mapping. right_expr. is_none( ) ) ;
240+ let Mapping {
241+ left_key,
242+ left_value,
243+ right_expr,
244+ } = & comprehension. mapping ;
245+ assert ! ( matches!( left_key, Expr :: MethodCall ( _) ) ) ;
246+ assert ! ( right_expr. is_none( ) ) ;
214247 assert_eq ! ( comprehension. iter_clauses. len( ) , 1 ) ;
248+ let iter_clause = & comprehension. iter_clauses [ 0 ] ;
215249 assert ! ( matches!(
216- comprehension . iter_clauses [ 0 ] . for_in_clause. iterable,
250+ iter_clause . for_in_clause. iterable,
217251 Expr :: MethodCall ( _)
218252 ) ) ;
219253 eprintln ! ( "Comprehension使用复杂表达式的列表推导式测试通过" ) ;
0 commit comments