Attach TokenStream
to ast::Ty
A `Ty` does not have outer attributes, so we only capture tokens when parsing a `macro_rules!` matcher
This commit is contained in:
parent
de4bd9f0f8
commit
1823dea7df
12 changed files with 42 additions and 15 deletions
|
@ -270,6 +270,7 @@ pub fn nt_to_tokenstream(nt: &Nonterminal, sess: &ParseSess, span: Span) -> Toke
|
|||
}
|
||||
Nonterminal::NtBlock(ref block) => block.tokens.clone(),
|
||||
Nonterminal::NtPat(ref pat) => pat.tokens.clone(),
|
||||
Nonterminal::NtTy(ref ty) => ty.tokens.clone(),
|
||||
Nonterminal::NtIdent(ident, is_raw) => {
|
||||
Some(tokenstream::TokenTree::token(token::Ident(ident.name, is_raw), ident.span).into())
|
||||
}
|
||||
|
|
|
@ -28,7 +28,7 @@ pub(super) fn dummy_arg(ident: Ident) -> Param {
|
|||
span: ident.span,
|
||||
tokens: None,
|
||||
});
|
||||
let ty = Ty { kind: TyKind::Err, span: ident.span, id: ast::DUMMY_NODE_ID };
|
||||
let ty = Ty { kind: TyKind::Err, span: ident.span, id: ast::DUMMY_NODE_ID, tokens: None };
|
||||
Param {
|
||||
attrs: AttrVec::default(),
|
||||
id: ast::DUMMY_NODE_ID,
|
||||
|
@ -75,7 +75,12 @@ impl RecoverQPath for Ty {
|
|||
Some(P(self.clone()))
|
||||
}
|
||||
fn recovered(qself: Option<QSelf>, path: ast::Path) -> Self {
|
||||
Self { span: path.span, kind: TyKind::Path(qself, path), id: ast::DUMMY_NODE_ID }
|
||||
Self {
|
||||
span: path.span,
|
||||
kind: TyKind::Path(qself, path),
|
||||
id: ast::DUMMY_NODE_ID,
|
||||
tokens: None,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -510,7 +510,12 @@ impl<'a> Parser<'a> {
|
|||
{
|
||||
let span = self.prev_token.span.between(self.token.span);
|
||||
self.struct_span_err(span, "missing trait in a trait impl").emit();
|
||||
P(Ty { kind: TyKind::Path(None, err_path(span)), span, id: DUMMY_NODE_ID })
|
||||
P(Ty {
|
||||
kind: TyKind::Path(None, err_path(span)),
|
||||
span,
|
||||
id: DUMMY_NODE_ID,
|
||||
tokens: None,
|
||||
})
|
||||
} else {
|
||||
self.parse_ty()?
|
||||
};
|
||||
|
@ -1046,7 +1051,7 @@ impl<'a> Parser<'a> {
|
|||
|
||||
// The user intended that the type be inferred,
|
||||
// so treat this as if the user wrote e.g. `const A: _ = expr;`.
|
||||
P(Ty { kind: TyKind::Infer, span: id.span, id: ast::DUMMY_NODE_ID })
|
||||
P(Ty { kind: TyKind::Infer, span: id.span, id: ast::DUMMY_NODE_ID, tokens: None })
|
||||
}
|
||||
|
||||
/// Parses an enum declaration.
|
||||
|
|
|
@ -141,7 +141,14 @@ impl<'a> Parser<'a> {
|
|||
token::NtExpr(expr)
|
||||
}
|
||||
NonterminalKind::Literal => token::NtLiteral(self.parse_literal_maybe_minus()?),
|
||||
NonterminalKind::Ty => token::NtTy(self.parse_ty()?),
|
||||
NonterminalKind::Ty => {
|
||||
let (mut ty, tokens) = self.collect_tokens(|this| this.parse_ty())?;
|
||||
// We have an eaten an NtTy, which could already have tokens
|
||||
if ty.tokens.is_none() {
|
||||
ty.tokens = Some(tokens);
|
||||
}
|
||||
token::NtTy(ty)
|
||||
}
|
||||
// this could be handled like a token, since it is one
|
||||
NonterminalKind::Ident => {
|
||||
if let Some((ident, is_raw)) = get_macro_ident(&self.token) {
|
||||
|
|
|
@ -626,6 +626,6 @@ impl<'a> Parser<'a> {
|
|||
}
|
||||
|
||||
pub(super) fn mk_ty(&self, span: Span, kind: TyKind) -> P<Ty> {
|
||||
P(Ty { kind, span, id: ast::DUMMY_NODE_ID })
|
||||
P(Ty { kind, span, id: ast::DUMMY_NODE_ID, tokens: None })
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue