Use expand_mac_invoc in expand_pat
This commit is contained in:
@@ -750,77 +750,10 @@ fn expand_pat(p: P<ast::Pat>, fld: &mut MacroExpander) -> P<ast::Pat> {
|
|||||||
PatKind::Mac(_) => {}
|
PatKind::Mac(_) => {}
|
||||||
_ => return noop_fold_pat(p, fld)
|
_ => return noop_fold_pat(p, fld)
|
||||||
}
|
}
|
||||||
p.map(|ast::Pat {node, span, ..}| {
|
p.and_then(|ast::Pat {node, span, ..}| {
|
||||||
let (pth, tts) = match node {
|
match node {
|
||||||
PatKind::Mac(mac) => (mac.node.path, mac.node.tts),
|
PatKind::Mac(mac) => expand_mac_invoc(mac, span, fld),
|
||||||
_ => unreachable!()
|
_ => unreachable!()
|
||||||
};
|
|
||||||
|
|
||||||
if pth.segments.len() > 1 {
|
|
||||||
fld.cx.span_err(pth.span, "expected macro name without module separators");
|
|
||||||
return DummyResult::raw_pat(span);
|
|
||||||
}
|
|
||||||
let extname = pth.segments[0].identifier.name;
|
|
||||||
let marked_after = match fld.cx.syntax_env.find(extname) {
|
|
||||||
None => {
|
|
||||||
fld.cx.span_err(pth.span,
|
|
||||||
&format!("macro undefined: '{}!'",
|
|
||||||
extname));
|
|
||||||
// let compilation continue
|
|
||||||
return DummyResult::raw_pat(span);
|
|
||||||
}
|
|
||||||
|
|
||||||
Some(rc) => match *rc {
|
|
||||||
NormalTT(ref expander, tt_span, allow_internal_unstable) => {
|
|
||||||
fld.cx.bt_push(ExpnInfo {
|
|
||||||
call_site: span,
|
|
||||||
callee: NameAndSpan {
|
|
||||||
format: MacroBang(extname),
|
|
||||||
span: tt_span,
|
|
||||||
allow_internal_unstable: allow_internal_unstable,
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
let fm = fresh_mark();
|
|
||||||
let marked_before = mark_tts(&tts[..], fm);
|
|
||||||
let mac_span = fld.cx.original_span();
|
|
||||||
let pat = expander.expand(fld.cx,
|
|
||||||
mac_span,
|
|
||||||
&marked_before[..]).make_pat();
|
|
||||||
let expanded = match pat {
|
|
||||||
Some(e) => e,
|
|
||||||
None => {
|
|
||||||
fld.cx.span_err(
|
|
||||||
pth.span,
|
|
||||||
&format!(
|
|
||||||
"non-pattern macro in pattern position: {}",
|
|
||||||
extname
|
|
||||||
)
|
|
||||||
);
|
|
||||||
return DummyResult::raw_pat(span);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// mark after:
|
|
||||||
mark_pat(expanded,fm)
|
|
||||||
}
|
|
||||||
_ => {
|
|
||||||
fld.cx.span_err(span,
|
|
||||||
&format!("{}! is not legal in pattern position",
|
|
||||||
extname));
|
|
||||||
return DummyResult::raw_pat(span);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
let fully_expanded =
|
|
||||||
fld.fold_pat(marked_after).node.clone();
|
|
||||||
fld.cx.bt_pop();
|
|
||||||
|
|
||||||
ast::Pat {
|
|
||||||
id: ast::DUMMY_NODE_ID,
|
|
||||||
node: fully_expanded,
|
|
||||||
span: span
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@@ -1388,11 +1321,6 @@ fn mark_tts(tts: &[TokenTree], m: Mrk) -> Vec<TokenTree> {
|
|||||||
noop_fold_tts(tts, &mut Marker{mark:m})
|
noop_fold_tts(tts, &mut Marker{mark:m})
|
||||||
}
|
}
|
||||||
|
|
||||||
// apply a given mark to the given pattern. Used following the expansion of a macro.
|
|
||||||
fn mark_pat(pat: P<ast::Pat>, m: Mrk) -> P<ast::Pat> {
|
|
||||||
Marker{mark:m}.fold_pat(pat)
|
|
||||||
}
|
|
||||||
|
|
||||||
// apply a given mark to the given item. Used following the expansion of a macro.
|
// apply a given mark to the given item. Used following the expansion of a macro.
|
||||||
fn mark_item(expr: P<ast::Item>, m: Mrk) -> P<ast::Item> {
|
fn mark_item(expr: P<ast::Item>, m: Mrk) -> P<ast::Item> {
|
||||||
Marker{mark:m}.fold_item(expr)
|
Marker{mark:m}.fold_item(expr)
|
||||||
|
|||||||
Reference in New Issue
Block a user