diff options
author | bors[bot] <26634292+bors[bot]@users.noreply.github.com> | 2021-03-27 02:57:02 +0000 |
---|---|---|
committer | GitHub <[email protected]> | 2021-03-27 02:57:02 +0000 |
commit | c8066ebd1781a6f6f536abe3494477bd69df795a (patch) | |
tree | edf5109d9f0629b0910f4f2ac716bd624330bb00 /crates/hir_ty/src | |
parent | 9c9376c4cffdd171375fbb21dd3d0f71a97a335e (diff) | |
parent | 8ce15b02dea7152953775904fd937cced2422bc6 (diff) |
Merge #8201
8201: Fix recursive macro statements expansion r=edwin0cheng a=edwin0cheng
This PR attempts to properly handle macro statement expansion by implementing the following:
1. Merge macro expanded statements to parent scope statements.
2. Add a new hir `Expr::MacroStmts` for handle tail expression infer.
PS : The scope of macro expanded statements are so strange that it took more time than I thought to understand and implement it :(
Fixes #8171
Co-authored-by: Edwin Cheng <[email protected]>
Diffstat (limited to 'crates/hir_ty/src')
-rw-r--r-- | crates/hir_ty/src/infer/expr.rs | 1 | ||||
-rw-r--r-- | crates/hir_ty/src/tests/macros.rs | 40 |
2 files changed, 40 insertions, 1 deletions
diff --git a/crates/hir_ty/src/infer/expr.rs b/crates/hir_ty/src/infer/expr.rs index 3f3187ea2..e6ede05ca 100644 --- a/crates/hir_ty/src/infer/expr.rs +++ b/crates/hir_ty/src/infer/expr.rs | |||
@@ -767,6 +767,7 @@ impl<'a> InferenceContext<'a> { | |||
767 | None => self.table.new_float_var(), | 767 | None => self.table.new_float_var(), |
768 | }, | 768 | }, |
769 | }, | 769 | }, |
770 | Expr::MacroStmts { tail } => self.infer_expr(*tail, expected), | ||
770 | }; | 771 | }; |
771 | // use a new type variable if we got unknown here | 772 | // use a new type variable if we got unknown here |
772 | let ty = self.insert_type_vars_shallow(ty); | 773 | let ty = self.insert_type_vars_shallow(ty); |
diff --git a/crates/hir_ty/src/tests/macros.rs b/crates/hir_ty/src/tests/macros.rs index 7eda51866..01935ec99 100644 --- a/crates/hir_ty/src/tests/macros.rs +++ b/crates/hir_ty/src/tests/macros.rs | |||
@@ -226,12 +226,49 @@ fn expr_macro_expanded_in_stmts() { | |||
226 | "#, | 226 | "#, |
227 | expect![[r#" | 227 | expect![[r#" |
228 | !0..8 'leta=();': () | 228 | !0..8 'leta=();': () |
229 | !0..8 'leta=();': () | ||
230 | !3..4 'a': () | ||
231 | !5..7 '()': () | ||
229 | 57..84 '{ ...); } }': () | 232 | 57..84 '{ ...); } }': () |
230 | "#]], | 233 | "#]], |
231 | ); | 234 | ); |
232 | } | 235 | } |
233 | 236 | ||
234 | #[test] | 237 | #[test] |
238 | fn recurisve_macro_expanded_in_stmts() { | ||
239 | check_infer( | ||
240 | r#" | ||
241 | macro_rules! ng { | ||
242 | ([$($tts:tt)*]) => { | ||
243 | $($tts)*; | ||
244 | }; | ||
245 | ([$($tts:tt)*] $head:tt $($rest:tt)*) => { | ||
246 | ng! { | ||
247 | [$($tts)* $head] $($rest)* | ||
248 | } | ||
249 | }; | ||
250 | } | ||
251 | fn foo() { | ||
252 | ng!([] let a = 3); | ||
253 | let b = a; | ||
254 | } | ||
255 | "#, | ||
256 | expect![[r#" | ||
257 | !0..7 'leta=3;': {unknown} | ||
258 | !0..7 'leta=3;': {unknown} | ||
259 | !0..13 'ng!{[leta=3]}': {unknown} | ||
260 | !0..13 'ng!{[leta=]3}': {unknown} | ||
261 | !0..13 'ng!{[leta]=3}': {unknown} | ||
262 | !3..4 'a': i32 | ||
263 | !5..6 '3': i32 | ||
264 | 196..237 '{ ...= a; }': () | ||
265 | 229..230 'b': i32 | ||
266 | 233..234 'a': i32 | ||
267 | "#]], | ||
268 | ); | ||
269 | } | ||
270 | |||
271 | #[test] | ||
235 | fn recursive_inner_item_macro_rules() { | 272 | fn recursive_inner_item_macro_rules() { |
236 | check_infer( | 273 | check_infer( |
237 | r#" | 274 | r#" |
@@ -246,7 +283,8 @@ fn recursive_inner_item_macro_rules() { | |||
246 | "#, | 283 | "#, |
247 | expect![[r#" | 284 | expect![[r#" |
248 | !0..1 '1': i32 | 285 | !0..1 '1': i32 |
249 | !0..7 'mac!($)': {unknown} | 286 | !0..26 'macro_...>{1};}': {unknown} |
287 | !0..26 'macro_...>{1};}': {unknown} | ||
250 | 107..143 '{ ...!(); }': () | 288 | 107..143 '{ ...!(); }': () |
251 | 129..130 'a': i32 | 289 | 129..130 'a': i32 |
252 | "#]], | 290 | "#]], |