expand: Stop un-interpolating `NtIdent`s before passing them to built-in macros
This was a big hack, and built-in macros should be able to deal with `NtIdents` in the input by themselves like any other parser code.
This commit is contained in:
parent
d62d3f7fa9
commit
85ef265dbe
|
@ -368,7 +368,7 @@ fn parse_reg<'a>(
|
||||||
explicit_reg: &mut bool,
|
explicit_reg: &mut bool,
|
||||||
) -> Result<ast::InlineAsmRegOrRegClass, DiagnosticBuilder<'a>> {
|
) -> Result<ast::InlineAsmRegOrRegClass, DiagnosticBuilder<'a>> {
|
||||||
p.expect(&token::OpenDelim(token::DelimToken::Paren))?;
|
p.expect(&token::OpenDelim(token::DelimToken::Paren))?;
|
||||||
let result = match p.token.kind {
|
let result = match p.token.uninterpolate().kind {
|
||||||
token::Ident(name, false) => ast::InlineAsmRegOrRegClass::RegClass(name),
|
token::Ident(name, false) => ast::InlineAsmRegOrRegClass::RegClass(name),
|
||||||
token::Literal(token::Lit { kind: token::LitKind::Str, symbol, suffix: _ }) => {
|
token::Literal(token::Lit { kind: token::LitKind::Str, symbol, suffix: _ }) => {
|
||||||
*explicit_reg = true;
|
*explicit_reg = true;
|
||||||
|
|
|
@ -27,15 +27,15 @@ pub fn expand_concat_idents<'cx>(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
match e {
|
if let TokenTree::Token(token) = e {
|
||||||
TokenTree::Token(Token { kind: token::Ident(name, _), .. }) => {
|
if let Some((ident, _)) = token.ident() {
|
||||||
res_str.push_str(&name.as_str())
|
res_str.push_str(&ident.name.as_str());
|
||||||
}
|
continue;
|
||||||
_ => {
|
|
||||||
cx.span_err(sp, "concat_idents! requires ident args.");
|
|
||||||
return DummyResult::any(sp);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cx.span_err(sp, "concat_idents! requires ident args.");
|
||||||
|
return DummyResult::any(sp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,10 +1,9 @@
|
||||||
use crate::expand::{self, AstFragment, Invocation};
|
use crate::expand::{self, AstFragment, Invocation};
|
||||||
use crate::module::DirectoryOwnership;
|
use crate::module::DirectoryOwnership;
|
||||||
|
|
||||||
use rustc_ast::mut_visit::{self, MutVisitor};
|
|
||||||
use rustc_ast::ptr::P;
|
use rustc_ast::ptr::P;
|
||||||
use rustc_ast::token;
|
use rustc_ast::token;
|
||||||
use rustc_ast::tokenstream::{self, TokenStream};
|
use rustc_ast::tokenstream::TokenStream;
|
||||||
use rustc_ast::visit::{AssocCtxt, Visitor};
|
use rustc_ast::visit::{AssocCtxt, Visitor};
|
||||||
use rustc_ast::{self as ast, Attribute, NodeId, PatKind};
|
use rustc_ast::{self as ast, Attribute, NodeId, PatKind};
|
||||||
use rustc_attr::{self as attr, Deprecation, HasAttrs, Stability};
|
use rustc_attr::{self as attr, Deprecation, HasAttrs, Stability};
|
||||||
|
@ -364,30 +363,8 @@ where
|
||||||
&self,
|
&self,
|
||||||
ecx: &'cx mut ExtCtxt<'_>,
|
ecx: &'cx mut ExtCtxt<'_>,
|
||||||
span: Span,
|
span: Span,
|
||||||
mut input: TokenStream,
|
input: TokenStream,
|
||||||
) -> Box<dyn MacResult + 'cx> {
|
) -> Box<dyn MacResult + 'cx> {
|
||||||
struct AvoidInterpolatedIdents;
|
|
||||||
|
|
||||||
impl MutVisitor for AvoidInterpolatedIdents {
|
|
||||||
fn visit_tt(&mut self, tt: &mut tokenstream::TokenTree) {
|
|
||||||
if let tokenstream::TokenTree::Token(token) = tt {
|
|
||||||
if let token::Interpolated(nt) = &token.kind {
|
|
||||||
if let token::NtIdent(ident, is_raw) = **nt {
|
|
||||||
*tt = tokenstream::TokenTree::token(
|
|
||||||
token::Ident(ident.name, is_raw),
|
|
||||||
ident.span,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
mut_visit::noop_visit_tt(tt, self)
|
|
||||||
}
|
|
||||||
|
|
||||||
fn visit_mac(&mut self, mac: &mut ast::MacCall) {
|
|
||||||
mut_visit::noop_visit_mac(mac, self)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
AvoidInterpolatedIdents.visit_tts(&mut input);
|
|
||||||
(*self)(ecx, span, input)
|
(*self)(ecx, span, input)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue