aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_mbe/src
diff options
context:
space:
mode:
authorbors[bot] <bors[bot]@users.noreply.github.com>2019-02-05 07:28:31 +0000
committerbors[bot] <bors[bot]@users.noreply.github.com>2019-02-05 07:28:31 +0000
commitd914ac0069d3382f08a1ebdc3481ed7fc7a74b48 (patch)
tree20fab878520ab3f66d784c8d8c7787a132af676b /crates/ra_mbe/src
parent77a824c6a0db6ac2548841d290d5d61d1d23295c (diff)
parenta4b473226bd185e6a016b175bdee22901fafd7ce (diff)
Merge #744
744: mbe: Ensure repetition separator matches r=matklad a=jrmuizel Co-authored-by: Jeff Muizelaar <[email protected]>
Diffstat (limited to 'crates/ra_mbe/src')
-rw-r--r--crates/ra_mbe/src/lib.rs24
-rw-r--r--crates/ra_mbe/src/mbe_expander.rs8
2 files changed, 30 insertions, 2 deletions
diff --git a/crates/ra_mbe/src/lib.rs b/crates/ra_mbe/src/lib.rs
index 6f719acbf..2c8ad4429 100644
--- a/crates/ra_mbe/src/lib.rs
+++ b/crates/ra_mbe/src/lib.rs
@@ -256,4 +256,28 @@ impl_froms!(TokenTree: Leaf, Subtree);
256 assert_expansion(&rules, "foo! { eggs Baz }", "struct Baz ;"); 256 assert_expansion(&rules, "foo! { eggs Baz }", "struct Baz ;");
257 } 257 }
258 258
259 #[test]
260 fn test_match_group_pattern_by_separator_token() {
261 let rules = create_rules(
262 r#"
263 macro_rules! foo {
264 ($ ($ i:ident),*) => ($ (
265 mod $ i {}
266 )*);
267 ($ ($ i:ident)#*) => ($ (
268 fn $ i() {}
269 )*);
270 ($ i:ident ,# $ j:ident) => (
271 struct $ i;
272 struct $ j;
273 )
274 }
275"#,
276 );
277
278 assert_expansion(&rules, "foo! { foo, bar }", "mod foo {} mod bar {}");
279 assert_expansion(&rules, "foo! { foo# bar }", "fn foo () {} fn bar () {}");
280 assert_expansion(&rules, "foo! { Foo,# Bar }", "struct Foo ; struct Bar ;");
281 }
282
259} 283}
diff --git a/crates/ra_mbe/src/mbe_expander.rs b/crates/ra_mbe/src/mbe_expander.rs
index 212e2ea92..04b5a4035 100644
--- a/crates/ra_mbe/src/mbe_expander.rs
+++ b/crates/ra_mbe/src/mbe_expander.rs
@@ -140,8 +140,12 @@ fn match_lhs(pattern: &crate::Subtree, input: &mut TtCursor) -> Option<Bindings>
140 }) => { 140 }) => {
141 while let Some(nested) = match_lhs(subtree, input) { 141 while let Some(nested) = match_lhs(subtree, input) {
142 res.push_nested(nested)?; 142 res.push_nested(nested)?;
143 if separator.is_some() && !input.is_eof() { 143 if let Some(separator) = *separator {
144 input.eat_punct()?; 144 if !input.is_eof() {
145 if input.eat_punct()?.char != separator {
146 return None;
147 }
148 }
145 } 149 }
146 } 150 }
147 } 151 }