mirror of
https://github.com/rust-lang/rust.git
synced 2025-04-28 02:57:37 +00:00
Auto merge of #75800 - Aaron1011:feature/full-nt-tokens, r=petrochenkov
Attach tokens to all AST types used in `Nonterminal` We perform token capturing when we have outer attributes (for nonterminals that support attributes - e.g. `Stmt`), or when we parse a `Nonterminal` for a `macro_rules!` argument. The full list of `Nonterminals` affected by this PR is: * `NtBlock` * `NtStmt` * `NtTy` * `NtMeta` * `NtPath` * `NtVis` * `NtLiteral` Of these nonterminals, only `NtStmt` and `NtLiteral` (which is actually just an `Expr`), support outer attributes - the rest only ever have token capturing perform when they match a `macro_rules!` argument. This makes progress towards solving https://github.com/rust-lang/rust/issues/43081 - we now collect tokens for everything that might need them. However, we still need to handle `#[cfg]`, inner attributes, and misc pretty-printing issues (e.g. #75734) I've separated the changes into (mostly) independent commits, which could be split into individual PRs for each `Nonterminal` variant. The purpose of having them all in one PR is to do a single Crater run for all of them. Most of the changes in this PR are trivial (adding `tokens: None` everywhere we construct the various AST structs). The significant changes are: * `ast::Visibility` is changed from `type Visibility = Spanned<VisibilityKind>` to a `struct Visibility { kind, span, tokens }`. * `maybe_collect_tokens` is made generic, and used for both `ast::Expr` and `ast::Stmt`. * Some of the statement-parsing functions are refactored so that we can capture the trailing semicolon. * `Nonterminal` and `Expr` both grew by 8 bytes, as some of the structs which are stored inline (rather than behind a `P`) now have an `Option<TokenStream>` field. Hopefully the performance impact of doing this is negligible.
This commit is contained in:
commit
94b4de0e07
@ -96,6 +96,7 @@ pub struct Path {
|
||||
/// The segments in the path: the things separated by `::`.
|
||||
/// Global paths begin with `kw::PathRoot`.
|
||||
pub segments: Vec<PathSegment>,
|
||||
pub tokens: Option<TokenStream>,
|
||||
}
|
||||
|
||||
impl PartialEq<Symbol> for Path {
|
||||
@ -117,7 +118,7 @@ impl Path {
|
||||
// Convert a span and an identifier to the corresponding
|
||||
// one-segment path.
|
||||
pub fn from_ident(ident: Ident) -> Path {
|
||||
Path { segments: vec![PathSegment::from_ident(ident)], span: ident.span }
|
||||
Path { segments: vec![PathSegment::from_ident(ident)], span: ident.span, tokens: None }
|
||||
}
|
||||
|
||||
pub fn is_global(&self) -> bool {
|
||||
@ -540,6 +541,7 @@ pub struct Block {
|
||||
/// Distinguishes between `unsafe { ... }` and `{ ... }`.
|
||||
pub rules: BlockCheckMode,
|
||||
pub span: Span,
|
||||
pub tokens: Option<TokenStream>,
|
||||
}
|
||||
|
||||
/// A match pattern.
|
||||
@ -586,7 +588,7 @@ impl Pat {
|
||||
_ => return None,
|
||||
};
|
||||
|
||||
Some(P(Ty { kind, id: self.id, span: self.span }))
|
||||
Some(P(Ty { kind, id: self.id, span: self.span, tokens: None }))
|
||||
}
|
||||
|
||||
/// Walk top-down and call `it` in each place where a pattern occurs
|
||||
@ -916,6 +918,7 @@ pub struct Stmt {
|
||||
pub id: NodeId,
|
||||
pub kind: StmtKind,
|
||||
pub span: Span,
|
||||
pub tokens: Option<TokenStream>,
|
||||
}
|
||||
|
||||
impl Stmt {
|
||||
@ -1068,7 +1071,7 @@ pub struct Expr {
|
||||
|
||||
// `Expr` is used a lot. Make sure it doesn't unintentionally get bigger.
|
||||
#[cfg(target_arch = "x86_64")]
|
||||
rustc_data_structures::static_assert_size!(Expr, 104);
|
||||
rustc_data_structures::static_assert_size!(Expr, 112);
|
||||
|
||||
impl Expr {
|
||||
/// Returns `true` if this expression would be valid somewhere that expects a value;
|
||||
@ -1168,7 +1171,7 @@ impl Expr {
|
||||
_ => return None,
|
||||
};
|
||||
|
||||
Some(P(Ty { kind, id: self.id, span: self.span }))
|
||||
Some(P(Ty { kind, id: self.id, span: self.span, tokens: None }))
|
||||
}
|
||||
|
||||
pub fn precedence(&self) -> ExprPrecedence {
|
||||
@ -1866,6 +1869,7 @@ pub struct Ty {
|
||||
pub id: NodeId,
|
||||
pub kind: TyKind,
|
||||
pub span: Span,
|
||||
pub tokens: Option<TokenStream>,
|
||||
}
|
||||
|
||||
#[derive(Clone, Encodable, Decodable, Debug)]
|
||||
@ -2144,7 +2148,7 @@ impl Param {
|
||||
/// Builds a `Param` object from `ExplicitSelf`.
|
||||
pub fn from_self(attrs: AttrVec, eself: ExplicitSelf, eself_ident: Ident) -> Param {
|
||||
let span = eself.span.to(eself_ident.span);
|
||||
let infer_ty = P(Ty { id: DUMMY_NODE_ID, kind: TyKind::ImplicitSelf, span });
|
||||
let infer_ty = P(Ty { id: DUMMY_NODE_ID, kind: TyKind::ImplicitSelf, span, tokens: None });
|
||||
let param = |mutbl, ty| Param {
|
||||
attrs,
|
||||
pat: P(Pat {
|
||||
@ -2167,6 +2171,7 @@ impl Param {
|
||||
id: DUMMY_NODE_ID,
|
||||
kind: TyKind::Rptr(lt, MutTy { ty: infer_ty, mutbl }),
|
||||
span,
|
||||
tokens: None,
|
||||
}),
|
||||
),
|
||||
}
|
||||
@ -2416,6 +2421,7 @@ impl<D: Decoder> rustc_serialize::Decodable<D> for AttrId {
|
||||
pub struct AttrItem {
|
||||
pub path: Path,
|
||||
pub args: MacArgs,
|
||||
pub tokens: Option<TokenStream>,
|
||||
}
|
||||
|
||||
/// A list of attributes.
|
||||
@ -2485,7 +2491,12 @@ pub enum CrateSugar {
|
||||
JustCrate,
|
||||
}
|
||||
|
||||
pub type Visibility = Spanned<VisibilityKind>;
|
||||
#[derive(Clone, Encodable, Decodable, Debug)]
|
||||
pub struct Visibility {
|
||||
pub kind: VisibilityKind,
|
||||
pub span: Span,
|
||||
pub tokens: Option<TokenStream>,
|
||||
}
|
||||
|
||||
#[derive(Clone, Encodable, Decodable, Debug)]
|
||||
pub enum VisibilityKind {
|
||||
|
@ -330,7 +330,7 @@ crate fn mk_attr_id() -> AttrId {
|
||||
}
|
||||
|
||||
pub fn mk_attr(style: AttrStyle, path: Path, args: MacArgs, span: Span) -> Attribute {
|
||||
mk_attr_from_item(style, AttrItem { path, args }, span)
|
||||
mk_attr_from_item(style, AttrItem { path, args, tokens: None }, span)
|
||||
}
|
||||
|
||||
pub fn mk_attr_from_item(style: AttrStyle, item: AttrItem, span: Span) -> Attribute {
|
||||
@ -415,7 +415,7 @@ impl MetaItem {
|
||||
}
|
||||
}
|
||||
let span = span.with_hi(segments.last().unwrap().ident.span.hi());
|
||||
Path { span, segments }
|
||||
Path { span, segments, tokens: None }
|
||||
}
|
||||
Some(TokenTree::Token(Token { kind: token::Interpolated(nt), .. })) => match *nt {
|
||||
token::Nonterminal::NtMeta(ref item) => return item.meta(item.path.span),
|
||||
|
@ -14,7 +14,7 @@ use crate::tokenstream::*;
|
||||
|
||||
use rustc_data_structures::map_in_place::MapInPlace;
|
||||
use rustc_data_structures::sync::Lrc;
|
||||
use rustc_span::source_map::{respan, Spanned};
|
||||
use rustc_span::source_map::Spanned;
|
||||
use rustc_span::symbol::Ident;
|
||||
use rustc_span::Span;
|
||||
|
||||
@ -451,7 +451,7 @@ pub fn noop_visit_ty_constraint<T: MutVisitor>(
|
||||
}
|
||||
|
||||
pub fn noop_visit_ty<T: MutVisitor>(ty: &mut P<Ty>, vis: &mut T) {
|
||||
let Ty { id, kind, span } = ty.deref_mut();
|
||||
let Ty { id, kind, span, tokens: _ } = ty.deref_mut();
|
||||
vis.visit_id(id);
|
||||
match kind {
|
||||
TyKind::Infer | TyKind::ImplicitSelf | TyKind::Err | TyKind::Never | TyKind::CVarArgs => {}
|
||||
@ -513,7 +513,7 @@ pub fn noop_visit_ident<T: MutVisitor>(Ident { name: _, span }: &mut Ident, vis:
|
||||
vis.visit_span(span);
|
||||
}
|
||||
|
||||
pub fn noop_visit_path<T: MutVisitor>(Path { segments, span }: &mut Path, vis: &mut T) {
|
||||
pub fn noop_visit_path<T: MutVisitor>(Path { segments, span, tokens: _ }: &mut Path, vis: &mut T) {
|
||||
vis.visit_span(span);
|
||||
for PathSegment { ident, id, args } in segments {
|
||||
vis.visit_ident(ident);
|
||||
@ -579,7 +579,7 @@ pub fn noop_visit_local<T: MutVisitor>(local: &mut P<Local>, vis: &mut T) {
|
||||
pub fn noop_visit_attribute<T: MutVisitor>(attr: &mut Attribute, vis: &mut T) {
|
||||
let Attribute { kind, id: _, style: _, span } = attr;
|
||||
match kind {
|
||||
AttrKind::Normal(AttrItem { path, args }) => {
|
||||
AttrKind::Normal(AttrItem { path, args, tokens: _ }) => {
|
||||
vis.visit_path(path);
|
||||
visit_mac_args(args, vis);
|
||||
}
|
||||
@ -709,7 +709,7 @@ pub fn noop_visit_interpolated<T: MutVisitor>(nt: &mut token::Nonterminal, vis:
|
||||
token::NtLifetime(ident) => vis.visit_ident(ident),
|
||||
token::NtLiteral(expr) => vis.visit_expr(expr),
|
||||
token::NtMeta(item) => {
|
||||
let AttrItem { path, args } = item.deref_mut();
|
||||
let AttrItem { path, args, tokens: _ } = item.deref_mut();
|
||||
vis.visit_path(path);
|
||||
visit_mac_args(args, vis);
|
||||
}
|
||||
@ -871,7 +871,7 @@ pub fn noop_visit_mt<T: MutVisitor>(MutTy { ty, mutbl: _ }: &mut MutTy, vis: &mu
|
||||
}
|
||||
|
||||
pub fn noop_visit_block<T: MutVisitor>(block: &mut P<Block>, vis: &mut T) {
|
||||
let Block { id, stmts, rules: _, span } = block.deref_mut();
|
||||
let Block { id, stmts, rules: _, span, tokens: _ } = block.deref_mut();
|
||||
vis.visit_id(id);
|
||||
stmts.flat_map_in_place(|stmt| vis.flat_map_stmt(stmt));
|
||||
vis.visit_span(span);
|
||||
@ -978,11 +978,13 @@ pub fn noop_visit_mod<T: MutVisitor>(module: &mut Mod, vis: &mut T) {
|
||||
|
||||
pub fn noop_visit_crate<T: MutVisitor>(krate: &mut Crate, vis: &mut T) {
|
||||
visit_clobber(krate, |Crate { module, attrs, span, proc_macros }| {
|
||||
let item_vis =
|
||||
Visibility { kind: VisibilityKind::Public, span: span.shrink_to_lo(), tokens: None };
|
||||
let item = P(Item {
|
||||
ident: Ident::invalid(),
|
||||
attrs,
|
||||
id: DUMMY_NODE_ID,
|
||||
vis: respan(span.shrink_to_lo(), VisibilityKind::Public),
|
||||
vis: item_vis,
|
||||
span,
|
||||
kind: ItemKind::Mod(module),
|
||||
tokens: None,
|
||||
@ -1284,12 +1286,15 @@ pub fn noop_filter_map_expr<T: MutVisitor>(mut e: P<Expr>, vis: &mut T) -> Optio
|
||||
}
|
||||
|
||||
pub fn noop_flat_map_stmt<T: MutVisitor>(
|
||||
Stmt { kind, mut span, mut id }: Stmt,
|
||||
Stmt { kind, mut span, mut id, tokens }: Stmt,
|
||||
vis: &mut T,
|
||||
) -> SmallVec<[Stmt; 1]> {
|
||||
vis.visit_id(&mut id);
|
||||
vis.visit_span(&mut span);
|
||||
noop_flat_map_stmt_kind(kind, vis).into_iter().map(|kind| Stmt { id, kind, span }).collect()
|
||||
noop_flat_map_stmt_kind(kind, vis)
|
||||
.into_iter()
|
||||
.map(|kind| Stmt { id, kind, span, tokens: tokens.clone() })
|
||||
.collect()
|
||||
}
|
||||
|
||||
pub fn noop_flat_map_stmt_kind<T: MutVisitor>(
|
||||
@ -1314,13 +1319,13 @@ pub fn noop_flat_map_stmt_kind<T: MutVisitor>(
|
||||
}
|
||||
}
|
||||
|
||||
pub fn noop_visit_vis<T: MutVisitor>(Spanned { node, span }: &mut Visibility, vis: &mut T) {
|
||||
match node {
|
||||
pub fn noop_visit_vis<T: MutVisitor>(visibility: &mut Visibility, vis: &mut T) {
|
||||
match &mut visibility.kind {
|
||||
VisibilityKind::Public | VisibilityKind::Crate(_) | VisibilityKind::Inherited => {}
|
||||
VisibilityKind::Restricted { path, id } => {
|
||||
vis.visit_path(path);
|
||||
vis.visit_id(id);
|
||||
}
|
||||
}
|
||||
vis.visit_span(span);
|
||||
vis.visit_span(&mut visibility.span);
|
||||
}
|
||||
|
@ -700,7 +700,7 @@ pub enum Nonterminal {
|
||||
|
||||
// `Nonterminal` is used a lot. Make sure it doesn't unintentionally get bigger.
|
||||
#[cfg(target_arch = "x86_64")]
|
||||
rustc_data_structures::static_assert_size!(Nonterminal, 40);
|
||||
rustc_data_structures::static_assert_size!(Nonterminal, 48);
|
||||
|
||||
#[derive(Debug, Copy, Clone, PartialEq, Encodable, Decodable)]
|
||||
pub enum NonterminalKind {
|
||||
|
@ -879,7 +879,7 @@ pub fn walk_arm<'a, V: Visitor<'a>>(visitor: &mut V, arm: &'a Arm) {
|
||||
}
|
||||
|
||||
pub fn walk_vis<'a, V: Visitor<'a>>(visitor: &mut V, vis: &'a Visibility) {
|
||||
if let VisibilityKind::Restricted { ref path, id } = vis.node {
|
||||
if let VisibilityKind::Restricted { ref path, id } = vis.kind {
|
||||
visitor.visit_path(path, id);
|
||||
}
|
||||
}
|
||||
|
@ -251,7 +251,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
|
||||
ItemKind::ExternCrate(orig_name) => hir::ItemKind::ExternCrate(orig_name),
|
||||
ItemKind::Use(ref use_tree) => {
|
||||
// Start with an empty prefix.
|
||||
let prefix = Path { segments: vec![], span: use_tree.span };
|
||||
let prefix = Path { segments: vec![], span: use_tree.span, tokens: None };
|
||||
|
||||
self.lower_use_tree(use_tree, &prefix, id, vis, ident, attrs)
|
||||
}
|
||||
@ -488,7 +488,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
|
||||
*ident = tree.ident();
|
||||
|
||||
// First, apply the prefix to the path.
|
||||
let mut path = Path { segments, span: path.span };
|
||||
let mut path = Path { segments, span: path.span, tokens: None };
|
||||
|
||||
// Correctly resolve `self` imports.
|
||||
if path.segments.len() > 1
|
||||
@ -540,8 +540,11 @@ impl<'hir> LoweringContext<'_, 'hir> {
|
||||
hir::ItemKind::Use(path, hir::UseKind::Single)
|
||||
}
|
||||
UseTreeKind::Glob => {
|
||||
let path =
|
||||
self.lower_path(id, &Path { segments, span: path.span }, ParamMode::Explicit);
|
||||
let path = self.lower_path(
|
||||
id,
|
||||
&Path { segments, span: path.span, tokens: None },
|
||||
ParamMode::Explicit,
|
||||
);
|
||||
hir::ItemKind::Use(path, hir::UseKind::Glob)
|
||||
}
|
||||
UseTreeKind::Nested(ref trees) => {
|
||||
@ -569,7 +572,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
|
||||
// for that we return the `{}` import (called the
|
||||
// `ListStem`).
|
||||
|
||||
let prefix = Path { segments, span: prefix.span.to(path.span) };
|
||||
let prefix = Path { segments, span: prefix.span.to(path.span), tokens: None };
|
||||
|
||||
// Add all the nested `PathListItem`s to the HIR.
|
||||
for &(ref use_tree, id) in trees {
|
||||
@ -927,7 +930,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
|
||||
v: &Visibility,
|
||||
explicit_owner: Option<NodeId>,
|
||||
) -> hir::Visibility<'hir> {
|
||||
let node = match v.node {
|
||||
let node = match v.kind {
|
||||
VisibilityKind::Public => hir::VisibilityKind::Public,
|
||||
VisibilityKind::Crate(sugar) => hir::VisibilityKind::Crate(sugar),
|
||||
VisibilityKind::Restricted { ref path, id } => {
|
||||
|
@ -967,6 +967,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
|
||||
AttrKind::Normal(ref item) => AttrKind::Normal(AttrItem {
|
||||
path: item.path.clone(),
|
||||
args: self.lower_mac_args(&item.args),
|
||||
tokens: None,
|
||||
}),
|
||||
AttrKind::DocComment(comment_kind, data) => AttrKind::DocComment(comment_kind, data),
|
||||
};
|
||||
@ -1106,6 +1107,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
|
||||
id: node_id,
|
||||
kind: TyKind::ImplTrait(impl_trait_node_id, bounds.clone()),
|
||||
span: constraint.span,
|
||||
tokens: None,
|
||||
},
|
||||
itctx,
|
||||
);
|
||||
|
@ -198,13 +198,13 @@ impl<'a> AstValidator<'a> {
|
||||
}
|
||||
|
||||
fn invalid_visibility(&self, vis: &Visibility, note: Option<&str>) {
|
||||
if let VisibilityKind::Inherited = vis.node {
|
||||
if let VisibilityKind::Inherited = vis.kind {
|
||||
return;
|
||||
}
|
||||
|
||||
let mut err =
|
||||
struct_span_err!(self.session, vis.span, E0449, "unnecessary visibility qualifier");
|
||||
if vis.node.is_pub() {
|
||||
if vis.kind.is_pub() {
|
||||
err.span_label(vis.span, "`pub` not permitted here because it's implied");
|
||||
}
|
||||
if let Some(note) = note {
|
||||
|
@ -594,7 +594,7 @@ impl<'a> Visitor<'a> for PostExpansionVisitor<'a> {
|
||||
}
|
||||
|
||||
fn visit_vis(&mut self, vis: &'a ast::Visibility) {
|
||||
if let ast::VisibilityKind::Crate(ast::CrateSugar::JustCrate) = vis.node {
|
||||
if let ast::VisibilityKind::Crate(ast::CrateSugar::JustCrate) = vis.kind {
|
||||
gate_feature_post!(
|
||||
&self,
|
||||
crate_visibility_modifier,
|
||||
|
@ -1359,7 +1359,7 @@ impl<'a> State<'a> {
|
||||
}
|
||||
|
||||
crate fn print_visibility(&mut self, vis: &ast::Visibility) {
|
||||
match vis.node {
|
||||
match vis.kind {
|
||||
ast::VisibilityKind::Public => self.word_nbsp("pub"),
|
||||
ast::VisibilityKind::Crate(sugar) => match sugar {
|
||||
ast::CrateSugar::PubCrate => self.word_nbsp("pub(crate)"),
|
||||
|
@ -1,7 +1,6 @@
|
||||
use super::*;
|
||||
|
||||
use rustc_ast as ast;
|
||||
use rustc_span::source_map::respan;
|
||||
use rustc_span::symbol::Ident;
|
||||
use rustc_span::with_default_session_globals;
|
||||
|
||||
@ -45,7 +44,11 @@ fn test_variant_to_string() {
|
||||
|
||||
let var = ast::Variant {
|
||||
ident,
|
||||
vis: respan(rustc_span::DUMMY_SP, ast::VisibilityKind::Inherited),
|
||||
vis: ast::Visibility {
|
||||
span: rustc_span::DUMMY_SP,
|
||||
kind: ast::VisibilityKind::Inherited,
|
||||
tokens: None,
|
||||
},
|
||||
attrs: Vec::new(),
|
||||
id: ast::DUMMY_NODE_ID,
|
||||
data: ast::VariantData::Unit(ast::DUMMY_NODE_ID),
|
||||
|
@ -15,7 +15,7 @@ pub fn inject(mut krate: ast::Crate, parse_sess: &ParseSess, attrs: &[String]) -
|
||||
);
|
||||
|
||||
let start_span = parser.token.span;
|
||||
let AttrItem { path, args } = match parser.parse_attr_item() {
|
||||
let AttrItem { path, args, tokens: _ } = match parser.parse_attr_item() {
|
||||
Ok(ai) => ai,
|
||||
Err(mut err) => {
|
||||
err.emit();
|
||||
|
@ -61,6 +61,7 @@ pub fn expand_concat_idents<'cx>(
|
||||
id: ast::DUMMY_NODE_ID,
|
||||
kind: ast::TyKind::Path(None, ast::Path::from_ident(self.ident)),
|
||||
span: self.ident.span,
|
||||
tokens: None,
|
||||
}))
|
||||
}
|
||||
}
|
||||
|
@ -133,5 +133,5 @@ fn stmt_let_underscore(cx: &mut ExtCtxt<'_>, sp: Span, expr: P<ast::Expr>) -> as
|
||||
span: sp,
|
||||
attrs: ast::AttrVec::new(),
|
||||
});
|
||||
ast::Stmt { id: ast::DUMMY_NODE_ID, kind: ast::StmtKind::Local(local), span: sp }
|
||||
ast::Stmt { id: ast::DUMMY_NODE_ID, kind: ast::StmtKind::Local(local), span: sp, tokens: None }
|
||||
}
|
||||
|
@ -187,7 +187,6 @@ use rustc_ast::{GenericArg, GenericParamKind, VariantData};
|
||||
use rustc_attr as attr;
|
||||
use rustc_data_structures::map_in_place::MapInPlace;
|
||||
use rustc_expand::base::{Annotatable, ExtCtxt};
|
||||
use rustc_span::source_map::respan;
|
||||
use rustc_span::symbol::{kw, sym, Ident, Symbol};
|
||||
use rustc_span::Span;
|
||||
|
||||
@ -532,7 +531,11 @@ impl<'a> TraitDef<'a> {
|
||||
id: ast::DUMMY_NODE_ID,
|
||||
span: self.span,
|
||||
ident,
|
||||
vis: respan(self.span.shrink_to_lo(), ast::VisibilityKind::Inherited),
|
||||
vis: ast::Visibility {
|
||||
span: self.span.shrink_to_lo(),
|
||||
kind: ast::VisibilityKind::Inherited,
|
||||
tokens: None,
|
||||
},
|
||||
attrs: Vec::new(),
|
||||
kind: ast::AssocItemKind::TyAlias(
|
||||
ast::Defaultness::Final,
|
||||
@ -933,7 +936,11 @@ impl<'a> MethodDef<'a> {
|
||||
id: ast::DUMMY_NODE_ID,
|
||||
attrs: self.attributes.clone(),
|
||||
span: trait_.span,
|
||||
vis: respan(trait_lo_sp, ast::VisibilityKind::Inherited),
|
||||
vis: ast::Visibility {
|
||||
span: trait_lo_sp,
|
||||
kind: ast::VisibilityKind::Inherited,
|
||||
tokens: None,
|
||||
},
|
||||
ident: method_ident,
|
||||
kind: ast::AssocItemKind::Fn(def, sig, fn_generics, Some(body_block)),
|
||||
tokens: None,
|
||||
|
@ -75,6 +75,7 @@ fn call_intrinsic(
|
||||
id: ast::DUMMY_NODE_ID,
|
||||
rules: ast::BlockCheckMode::Unsafe(ast::CompilerGenerated),
|
||||
span,
|
||||
tokens: None,
|
||||
}))
|
||||
}
|
||||
|
||||
|
@ -14,7 +14,6 @@ use rustc_ast::token;
|
||||
use rustc_ast::tokenstream::TokenStream;
|
||||
use rustc_errors::DiagnosticBuilder;
|
||||
use rustc_expand::base::{self, *};
|
||||
use rustc_span::source_map::respan;
|
||||
use rustc_span::symbol::Ident;
|
||||
use rustc_span::Span;
|
||||
use smallvec::smallvec;
|
||||
@ -30,7 +29,11 @@ pub fn expand_global_asm<'cx>(
|
||||
attrs: Vec::new(),
|
||||
id: ast::DUMMY_NODE_ID,
|
||||
kind: ast::ItemKind::GlobalAsm(P(global_asm)),
|
||||
vis: respan(sp.shrink_to_lo(), ast::VisibilityKind::Inherited),
|
||||
vis: ast::Visibility {
|
||||
span: sp.shrink_to_lo(),
|
||||
kind: ast::VisibilityKind::Inherited,
|
||||
tokens: None,
|
||||
},
|
||||
span: cx.with_def_site_ctxt(sp),
|
||||
tokens: None,
|
||||
})]),
|
||||
|
@ -98,7 +98,7 @@ pub fn inject(
|
||||
|
||||
impl<'a> CollectProcMacros<'a> {
|
||||
fn check_not_pub_in_root(&self, vis: &ast::Visibility, sp: Span) {
|
||||
if self.is_proc_macro_crate && self.in_root && vis.node.is_pub() {
|
||||
if self.is_proc_macro_crate && self.in_root && vis.kind.is_pub() {
|
||||
self.handler.span_err(
|
||||
sp,
|
||||
"`proc-macro` crate types currently cannot export any items other \
|
||||
@ -184,7 +184,7 @@ impl<'a> CollectProcMacros<'a> {
|
||||
Vec::new()
|
||||
};
|
||||
|
||||
if self.in_root && item.vis.node.is_pub() {
|
||||
if self.in_root && item.vis.kind.is_pub() {
|
||||
self.macros.push(ProcMacro::Derive(ProcMacroDerive {
|
||||
id: item.id,
|
||||
span: item.span,
|
||||
@ -204,7 +204,7 @@ impl<'a> CollectProcMacros<'a> {
|
||||
}
|
||||
|
||||
fn collect_attr_proc_macro(&mut self, item: &'a ast::Item) {
|
||||
if self.in_root && item.vis.node.is_pub() {
|
||||
if self.in_root && item.vis.kind.is_pub() {
|
||||
self.macros.push(ProcMacro::Def(ProcMacroDef {
|
||||
id: item.id,
|
||||
span: item.span,
|
||||
@ -223,7 +223,7 @@ impl<'a> CollectProcMacros<'a> {
|
||||
}
|
||||
|
||||
fn collect_bang_proc_macro(&mut self, item: &'a ast::Item) {
|
||||
if self.in_root && item.vis.node.is_pub() {
|
||||
if self.in_root && item.vis.kind.is_pub() {
|
||||
self.macros.push(ProcMacro::Def(ProcMacroDef {
|
||||
id: item.id,
|
||||
span: item.span,
|
||||
|
@ -7,7 +7,6 @@ use rustc_ast::attr;
|
||||
use rustc_ast_pretty::pprust;
|
||||
use rustc_expand::base::*;
|
||||
use rustc_session::Session;
|
||||
use rustc_span::source_map::respan;
|
||||
use rustc_span::symbol::{sym, Ident, Symbol};
|
||||
use rustc_span::Span;
|
||||
|
||||
@ -35,7 +34,11 @@ pub fn expand_test_case(
|
||||
let sp = ecx.with_def_site_ctxt(attr_sp);
|
||||
let mut item = anno_item.expect_item();
|
||||
item = item.map(|mut item| {
|
||||
item.vis = respan(item.vis.span, ast::VisibilityKind::Public);
|
||||
item.vis = ast::Visibility {
|
||||
span: item.vis.span,
|
||||
kind: ast::VisibilityKind::Public,
|
||||
tokens: None,
|
||||
};
|
||||
item.ident.span = item.ident.span.with_ctxt(sp.ctxt());
|
||||
item.attrs.push(ecx.attribute(ecx.meta_word(sp, sym::rustc_test_marker)));
|
||||
item
|
||||
@ -292,7 +295,7 @@ pub fn expand_test_or_bench(
|
||||
),
|
||||
);
|
||||
test_const = test_const.map(|mut tc| {
|
||||
tc.vis.node = ast::VisibilityKind::Public;
|
||||
tc.vis.kind = ast::VisibilityKind::Public;
|
||||
tc
|
||||
});
|
||||
|
||||
|
@ -10,7 +10,6 @@ use rustc_expand::expand::{AstFragment, ExpansionConfig};
|
||||
use rustc_feature::Features;
|
||||
use rustc_session::Session;
|
||||
use rustc_span::hygiene::{AstPass, SyntaxContext, Transparency};
|
||||
use rustc_span::source_map::respan;
|
||||
use rustc_span::symbol::{sym, Ident, Symbol};
|
||||
use rustc_span::{Span, DUMMY_SP};
|
||||
use rustc_target::spec::PanicStrategy;
|
||||
@ -333,7 +332,7 @@ fn mk_main(cx: &mut TestCtxt<'_>) -> P<ast::Item> {
|
||||
attrs: vec![main_attr],
|
||||
id: ast::DUMMY_NODE_ID,
|
||||
kind: main,
|
||||
vis: respan(sp, ast::VisibilityKind::Public),
|
||||
vis: ast::Visibility { span: sp, kind: ast::VisibilityKind::Public, tokens: None },
|
||||
span: sp,
|
||||
tokens: None,
|
||||
});
|
||||
|
@ -400,6 +400,7 @@ macro_rules! make_stmts_default {
|
||||
id: ast::DUMMY_NODE_ID,
|
||||
span: e.span,
|
||||
kind: ast::StmtKind::Expr(e),
|
||||
tokens: None
|
||||
}]
|
||||
})
|
||||
};
|
||||
@ -607,6 +608,7 @@ impl DummyResult {
|
||||
id: ast::DUMMY_NODE_ID,
|
||||
kind: if is_error { ast::TyKind::Err } else { ast::TyKind::Tup(Vec::new()) },
|
||||
span: sp,
|
||||
tokens: None,
|
||||
})
|
||||
}
|
||||
}
|
||||
@ -641,6 +643,7 @@ impl MacResult for DummyResult {
|
||||
id: ast::DUMMY_NODE_ID,
|
||||
kind: ast::StmtKind::Expr(DummyResult::raw_expr(self.span, self.is_error)),
|
||||
span: self.span,
|
||||
tokens: None
|
||||
}])
|
||||
}
|
||||
|
||||
|
@ -3,7 +3,7 @@ use crate::base::ExtCtxt;
|
||||
use rustc_ast::attr;
|
||||
use rustc_ast::ptr::P;
|
||||
use rustc_ast::{self as ast, AttrVec, BlockCheckMode, Expr, PatKind, UnOp};
|
||||
use rustc_span::source_map::{respan, Spanned};
|
||||
use rustc_span::source_map::Spanned;
|
||||
use rustc_span::symbol::{kw, sym, Ident, Symbol};
|
||||
|
||||
use rustc_span::Span;
|
||||
@ -46,7 +46,7 @@ impl<'a> ExtCtxt<'a> {
|
||||
id: ast::DUMMY_NODE_ID,
|
||||
args,
|
||||
});
|
||||
ast::Path { span, segments }
|
||||
ast::Path { span, segments, tokens: None }
|
||||
}
|
||||
|
||||
pub fn ty_mt(&self, ty: P<ast::Ty>, mutbl: ast::Mutability) -> ast::MutTy {
|
||||
@ -54,7 +54,7 @@ impl<'a> ExtCtxt<'a> {
|
||||
}
|
||||
|
||||
pub fn ty(&self, span: Span, kind: ast::TyKind) -> P<ast::Ty> {
|
||||
P(ast::Ty { id: ast::DUMMY_NODE_ID, span, kind })
|
||||
P(ast::Ty { id: ast::DUMMY_NODE_ID, span, kind, tokens: None })
|
||||
}
|
||||
|
||||
pub fn ty_path(&self, path: ast::Path) -> P<ast::Ty> {
|
||||
@ -158,7 +158,12 @@ impl<'a> ExtCtxt<'a> {
|
||||
}
|
||||
|
||||
pub fn stmt_expr(&self, expr: P<ast::Expr>) -> ast::Stmt {
|
||||
ast::Stmt { id: ast::DUMMY_NODE_ID, span: expr.span, kind: ast::StmtKind::Expr(expr) }
|
||||
ast::Stmt {
|
||||
id: ast::DUMMY_NODE_ID,
|
||||
span: expr.span,
|
||||
kind: ast::StmtKind::Expr(expr),
|
||||
tokens: None,
|
||||
}
|
||||
}
|
||||
|
||||
pub fn stmt_let(&self, sp: Span, mutbl: bool, ident: Ident, ex: P<ast::Expr>) -> ast::Stmt {
|
||||
@ -176,7 +181,12 @@ impl<'a> ExtCtxt<'a> {
|
||||
span: sp,
|
||||
attrs: AttrVec::new(),
|
||||
});
|
||||
ast::Stmt { id: ast::DUMMY_NODE_ID, kind: ast::StmtKind::Local(local), span: sp }
|
||||
ast::Stmt {
|
||||
id: ast::DUMMY_NODE_ID,
|
||||
kind: ast::StmtKind::Local(local),
|
||||
span: sp,
|
||||
tokens: None,
|
||||
}
|
||||
}
|
||||
|
||||
// Generates `let _: Type;`, which is usually used for type assertions.
|
||||
@ -189,11 +199,16 @@ impl<'a> ExtCtxt<'a> {
|
||||
span,
|
||||
attrs: AttrVec::new(),
|
||||
});
|
||||
ast::Stmt { id: ast::DUMMY_NODE_ID, kind: ast::StmtKind::Local(local), span }
|
||||
ast::Stmt { id: ast::DUMMY_NODE_ID, kind: ast::StmtKind::Local(local), span, tokens: None }
|
||||
}
|
||||
|
||||
pub fn stmt_item(&self, sp: Span, item: P<ast::Item>) -> ast::Stmt {
|
||||
ast::Stmt { id: ast::DUMMY_NODE_ID, kind: ast::StmtKind::Item(item), span: sp }
|
||||
ast::Stmt {
|
||||
id: ast::DUMMY_NODE_ID,
|
||||
kind: ast::StmtKind::Item(item),
|
||||
span: sp,
|
||||
tokens: None,
|
||||
}
|
||||
}
|
||||
|
||||
pub fn block_expr(&self, expr: P<ast::Expr>) -> P<ast::Block> {
|
||||
@ -203,11 +218,18 @@ impl<'a> ExtCtxt<'a> {
|
||||
id: ast::DUMMY_NODE_ID,
|
||||
span: expr.span,
|
||||
kind: ast::StmtKind::Expr(expr),
|
||||
tokens: None,
|
||||
}],
|
||||
)
|
||||
}
|
||||
pub fn block(&self, span: Span, stmts: Vec<ast::Stmt>) -> P<ast::Block> {
|
||||
P(ast::Block { stmts, id: ast::DUMMY_NODE_ID, rules: BlockCheckMode::Default, span })
|
||||
P(ast::Block {
|
||||
stmts,
|
||||
id: ast::DUMMY_NODE_ID,
|
||||
rules: BlockCheckMode::Default,
|
||||
span,
|
||||
tokens: None,
|
||||
})
|
||||
}
|
||||
|
||||
pub fn expr(&self, span: Span, kind: ast::ExprKind) -> P<ast::Expr> {
|
||||
@ -578,7 +600,11 @@ impl<'a> ExtCtxt<'a> {
|
||||
attrs,
|
||||
id: ast::DUMMY_NODE_ID,
|
||||
kind,
|
||||
vis: respan(span.shrink_to_lo(), ast::VisibilityKind::Inherited),
|
||||
vis: ast::Visibility {
|
||||
span: span.shrink_to_lo(),
|
||||
kind: ast::VisibilityKind::Inherited,
|
||||
tokens: None,
|
||||
},
|
||||
span,
|
||||
tokens: None,
|
||||
})
|
||||
@ -592,7 +618,11 @@ impl<'a> ExtCtxt<'a> {
|
||||
span: ty.span,
|
||||
ty,
|
||||
ident: None,
|
||||
vis: respan(vis_span, ast::VisibilityKind::Inherited),
|
||||
vis: ast::Visibility {
|
||||
span: vis_span,
|
||||
kind: ast::VisibilityKind::Inherited,
|
||||
tokens: None,
|
||||
},
|
||||
attrs: Vec::new(),
|
||||
id: ast::DUMMY_NODE_ID,
|
||||
is_placeholder: false,
|
||||
@ -611,7 +641,11 @@ impl<'a> ExtCtxt<'a> {
|
||||
disr_expr: None,
|
||||
id: ast::DUMMY_NODE_ID,
|
||||
ident,
|
||||
vis: respan(vis_span, ast::VisibilityKind::Inherited),
|
||||
vis: ast::Visibility {
|
||||
span: vis_span,
|
||||
kind: ast::VisibilityKind::Inherited,
|
||||
tokens: None,
|
||||
},
|
||||
span,
|
||||
is_placeholder: false,
|
||||
}
|
||||
|
@ -26,7 +26,6 @@ use rustc_session::lint::builtin::UNUSED_DOC_COMMENTS;
|
||||
use rustc_session::lint::BuiltinLintDiagnostics;
|
||||
use rustc_session::parse::{feature_err, ParseSess};
|
||||
use rustc_session::Limit;
|
||||
use rustc_span::source_map::respan;
|
||||
use rustc_span::symbol::{sym, Ident, Symbol};
|
||||
use rustc_span::{ExpnId, FileName, Span, DUMMY_SP};
|
||||
|
||||
@ -358,7 +357,11 @@ impl<'a, 'b> MacroExpander<'a, 'b> {
|
||||
kind: ast::ItemKind::Mod(krate.module),
|
||||
ident: Ident::invalid(),
|
||||
id: ast::DUMMY_NODE_ID,
|
||||
vis: respan(krate.span.shrink_to_lo(), ast::VisibilityKind::Public),
|
||||
vis: ast::Visibility {
|
||||
span: krate.span.shrink_to_lo(),
|
||||
kind: ast::VisibilityKind::Public,
|
||||
tokens: None,
|
||||
},
|
||||
tokens: None,
|
||||
})]);
|
||||
|
||||
@ -1393,10 +1396,10 @@ impl<'a, 'b> MutVisitor for InvocationCollector<'a, 'b> {
|
||||
}
|
||||
|
||||
// The placeholder expander gives ids to statements, so we avoid folding the id here.
|
||||
let ast::Stmt { id, kind, span } = stmt;
|
||||
let ast::Stmt { id, kind, span, tokens } = stmt;
|
||||
noop_flat_map_stmt_kind(kind, self)
|
||||
.into_iter()
|
||||
.map(|kind| ast::Stmt { id, kind, span })
|
||||
.map(|kind| ast::Stmt { id, kind, span, tokens: tokens.clone() })
|
||||
.collect()
|
||||
}
|
||||
|
||||
@ -1777,6 +1780,7 @@ impl<'a, 'b> MutVisitor for InvocationCollector<'a, 'b> {
|
||||
kind: ast::AttrKind::Normal(AttrItem {
|
||||
path: meta.path,
|
||||
args: meta.kind.mac_args(meta.span),
|
||||
tokens: None,
|
||||
}),
|
||||
span: at.span,
|
||||
id: at.id,
|
||||
|
@ -4,7 +4,7 @@ use crate::expand::{AstFragment, AstFragmentKind};
|
||||
use rustc_ast as ast;
|
||||
use rustc_ast::mut_visit::*;
|
||||
use rustc_ast::ptr::P;
|
||||
use rustc_span::source_map::{dummy_spanned, DUMMY_SP};
|
||||
use rustc_span::source_map::DUMMY_SP;
|
||||
use rustc_span::symbol::Ident;
|
||||
|
||||
use smallvec::{smallvec, SmallVec};
|
||||
@ -18,7 +18,7 @@ pub fn placeholder(
|
||||
) -> AstFragment {
|
||||
fn mac_placeholder() -> ast::MacCall {
|
||||
ast::MacCall {
|
||||
path: ast::Path { span: DUMMY_SP, segments: Vec::new() },
|
||||
path: ast::Path { span: DUMMY_SP, segments: Vec::new(), tokens: None },
|
||||
args: P(ast::MacArgs::Empty),
|
||||
prior_type_ascription: None,
|
||||
}
|
||||
@ -26,7 +26,11 @@ pub fn placeholder(
|
||||
|
||||
let ident = Ident::invalid();
|
||||
let attrs = Vec::new();
|
||||
let vis = vis.unwrap_or_else(|| dummy_spanned(ast::VisibilityKind::Inherited));
|
||||
let vis = vis.unwrap_or(ast::Visibility {
|
||||
span: DUMMY_SP,
|
||||
kind: ast::VisibilityKind::Inherited,
|
||||
tokens: None,
|
||||
});
|
||||
let span = DUMMY_SP;
|
||||
let expr_placeholder = || {
|
||||
P(ast::Expr {
|
||||
@ -37,7 +41,8 @@ pub fn placeholder(
|
||||
tokens: None,
|
||||
})
|
||||
};
|
||||
let ty = || P(ast::Ty { id, kind: ast::TyKind::MacCall(mac_placeholder()), span });
|
||||
let ty =
|
||||
|| P(ast::Ty { id, kind: ast::TyKind::MacCall(mac_placeholder()), span, tokens: None });
|
||||
let pat =
|
||||
|| P(ast::Pat { id, kind: ast::PatKind::MacCall(mac_placeholder()), span, tokens: None });
|
||||
|
||||
@ -88,16 +93,19 @@ pub fn placeholder(
|
||||
kind: ast::PatKind::MacCall(mac_placeholder()),
|
||||
tokens: None,
|
||||
})),
|
||||
AstFragmentKind::Ty => {
|
||||
AstFragment::Ty(P(ast::Ty { id, span, kind: ast::TyKind::MacCall(mac_placeholder()) }))
|
||||
}
|
||||
AstFragmentKind::Ty => AstFragment::Ty(P(ast::Ty {
|
||||
id,
|
||||
span,
|
||||
kind: ast::TyKind::MacCall(mac_placeholder()),
|
||||
tokens: None,
|
||||
})),
|
||||
AstFragmentKind::Stmts => AstFragment::Stmts(smallvec![{
|
||||
let mac = P(ast::MacCallStmt {
|
||||
mac: mac_placeholder(),
|
||||
style: ast::MacStmtStyle::Braces,
|
||||
attrs: ast::AttrVec::new(),
|
||||
});
|
||||
ast::Stmt { id, span, kind: ast::StmtKind::MacCall(mac) }
|
||||
ast::Stmt { id, span, kind: ast::StmtKind::MacCall(mac), tokens: None }
|
||||
}]),
|
||||
AstFragmentKind::Arms => AstFragment::Arms(smallvec![ast::Arm {
|
||||
attrs: Default::default(),
|
||||
|
@ -693,6 +693,7 @@ impl<'a> MutVisitor for ReplaceBodyWithLoop<'a, '_> {
|
||||
rules,
|
||||
id: resolver.next_node_id(),
|
||||
span: rustc_span::DUMMY_SP,
|
||||
tokens: None,
|
||||
}
|
||||
}
|
||||
|
||||
@ -709,6 +710,7 @@ impl<'a> MutVisitor for ReplaceBodyWithLoop<'a, '_> {
|
||||
id: resolver.next_node_id(),
|
||||
kind: ast::StmtKind::Expr(expr),
|
||||
span: rustc_span::DUMMY_SP,
|
||||
tokens: None,
|
||||
}
|
||||
}
|
||||
|
||||
@ -725,6 +727,7 @@ impl<'a> MutVisitor for ReplaceBodyWithLoop<'a, '_> {
|
||||
id: self.resolver.next_node_id(),
|
||||
span: rustc_span::DUMMY_SP,
|
||||
kind: ast::StmtKind::Expr(loop_expr),
|
||||
tokens: None,
|
||||
};
|
||||
|
||||
if self.within_static_or_const {
|
||||
|
@ -18,7 +18,7 @@ use rustc_middle::ty::query::Providers;
|
||||
use rustc_middle::ty::{self, TyCtxt};
|
||||
use rustc_session::utils::NativeLibKind;
|
||||
use rustc_session::{CrateDisambiguator, Session};
|
||||
use rustc_span::source_map::{self, Span, Spanned};
|
||||
use rustc_span::source_map::{Span, Spanned};
|
||||
use rustc_span::symbol::Symbol;
|
||||
|
||||
use rustc_data_structures::sync::Lrc;
|
||||
@ -421,7 +421,11 @@ impl CStore {
|
||||
span,
|
||||
attrs: attrs.to_vec(),
|
||||
kind: ast::ItemKind::MacroDef(data.get_macro(id.index, sess)),
|
||||
vis: source_map::respan(span.shrink_to_lo(), ast::VisibilityKind::Inherited),
|
||||
vis: ast::Visibility {
|
||||
span: span.shrink_to_lo(),
|
||||
kind: ast::VisibilityKind::Inherited,
|
||||
tokens: None,
|
||||
},
|
||||
tokens: None,
|
||||
},
|
||||
data.root.edition,
|
||||
|
@ -268,21 +268,32 @@ pub fn nt_to_tokenstream(nt: &Nonterminal, sess: &ParseSess, span: Span) -> Toke
|
||||
Nonterminal::NtItem(ref item) => {
|
||||
prepend_attrs(sess, &item.attrs, item.tokens.as_ref(), span)
|
||||
}
|
||||
Nonterminal::NtBlock(ref block) => block.tokens.clone(),
|
||||
Nonterminal::NtStmt(ref stmt) => {
|
||||
// FIXME: We currently only collect tokens for `:stmt`
|
||||
// matchers in `macro_rules!` macros. When we start collecting
|
||||
// tokens for attributes on statements, we will need to prepend
|
||||
// attributes here
|
||||
stmt.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())
|
||||
}
|
||||
Nonterminal::NtLifetime(ident) => {
|
||||
Some(tokenstream::TokenTree::token(token::Lifetime(ident.name), ident.span).into())
|
||||
}
|
||||
Nonterminal::NtMeta(ref attr) => attr.tokens.clone(),
|
||||
Nonterminal::NtPath(ref path) => path.tokens.clone(),
|
||||
Nonterminal::NtVis(ref vis) => vis.tokens.clone(),
|
||||
Nonterminal::NtTT(ref tt) => Some(tt.clone().into()),
|
||||
Nonterminal::NtExpr(ref expr) => {
|
||||
Nonterminal::NtExpr(ref expr) | Nonterminal::NtLiteral(ref expr) => {
|
||||
if expr.tokens.is_none() {
|
||||
debug!("missing tokens for expr {:?}", expr);
|
||||
}
|
||||
prepend_attrs(sess, &expr.attrs, expr.tokens.as_ref(), span)
|
||||
}
|
||||
_ => None,
|
||||
};
|
||||
|
||||
// FIXME(#43081): Avoid this pretty-print + reparse hack
|
||||
|
@ -162,7 +162,7 @@ impl<'a> Parser<'a> {
|
||||
} else {
|
||||
let path = self.parse_path(PathStyle::Mod)?;
|
||||
let args = self.parse_attr_args()?;
|
||||
ast::AttrItem { path, args }
|
||||
ast::AttrItem { path, args, tokens: None }
|
||||
})
|
||||
}
|
||||
|
||||
|
@ -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,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -896,7 +901,7 @@ impl<'a> Parser<'a> {
|
||||
) -> PResult<'a, P<T>> {
|
||||
self.expect(&token::ModSep)?;
|
||||
|
||||
let mut path = ast::Path { segments: Vec::new(), span: DUMMY_SP };
|
||||
let mut path = ast::Path { segments: Vec::new(), span: DUMMY_SP, tokens: None };
|
||||
self.parse_path_segments(&mut path.segments, T::PATH_STYLE)?;
|
||||
path.span = ty_span.to(self.prev_token.span);
|
||||
|
||||
|
@ -187,7 +187,7 @@ impl<'a> Parser<'a> {
|
||||
|
||||
/// Error in-case a non-inherited visibility was parsed but no item followed.
|
||||
fn error_on_unmatched_vis(&self, vis: &Visibility) {
|
||||
if let VisibilityKind::Inherited = vis.node {
|
||||
if let VisibilityKind::Inherited = vis.kind {
|
||||
return;
|
||||
}
|
||||
let vs = pprust::vis_to_string(&vis);
|
||||
@ -296,7 +296,7 @@ impl<'a> Parser<'a> {
|
||||
} else if self.is_macro_rules_item() {
|
||||
// MACRO_RULES ITEM
|
||||
self.parse_item_macro_rules(vis)?
|
||||
} else if vis.node.is_pub() && self.isnt_macro_invocation() {
|
||||
} else if vis.kind.is_pub() && self.isnt_macro_invocation() {
|
||||
self.recover_missing_kw_before_item()?;
|
||||
return Ok(None);
|
||||
} else if macros_allowed && self.check_path() {
|
||||
@ -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()?
|
||||
};
|
||||
@ -782,7 +787,7 @@ impl<'a> Parser<'a> {
|
||||
fn parse_use_tree(&mut self) -> PResult<'a, UseTree> {
|
||||
let lo = self.token.span;
|
||||
|
||||
let mut prefix = ast::Path { segments: Vec::new(), span: lo.shrink_to_lo() };
|
||||
let mut prefix = ast::Path { segments: Vec::new(), span: lo.shrink_to_lo(), tokens: None };
|
||||
let kind = if self.check(&token::OpenDelim(token::Brace))
|
||||
|| self.check(&token::BinOp(token::Star))
|
||||
|| self.is_import_coupler()
|
||||
@ -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.
|
||||
@ -1413,7 +1418,7 @@ impl<'a> Parser<'a> {
|
||||
/// Item macro invocations or `macro_rules!` definitions need inherited visibility.
|
||||
/// If that's not the case, emit an error.
|
||||
fn complain_if_pub_macro(&self, vis: &Visibility, macro_rules: bool) {
|
||||
if let VisibilityKind::Inherited = vis.node {
|
||||
if let VisibilityKind::Inherited = vis.kind {
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -22,7 +22,7 @@ use rustc_ast::{Async, MacArgs, MacDelimiter, Mutability, StrLit, Visibility, Vi
|
||||
use rustc_ast_pretty::pprust;
|
||||
use rustc_errors::{struct_span_err, Applicability, DiagnosticBuilder, FatalError, PResult};
|
||||
use rustc_session::parse::ParseSess;
|
||||
use rustc_span::source_map::{respan, Span, DUMMY_SP};
|
||||
use rustc_span::source_map::{Span, DUMMY_SP};
|
||||
use rustc_span::symbol::{kw, sym, Ident, Symbol};
|
||||
use tracing::debug;
|
||||
|
||||
@ -1022,14 +1022,22 @@ impl<'a> Parser<'a> {
|
||||
if self.is_crate_vis() {
|
||||
self.bump(); // `crate`
|
||||
self.sess.gated_spans.gate(sym::crate_visibility_modifier, self.prev_token.span);
|
||||
return Ok(respan(self.prev_token.span, VisibilityKind::Crate(CrateSugar::JustCrate)));
|
||||
return Ok(Visibility {
|
||||
span: self.prev_token.span,
|
||||
kind: VisibilityKind::Crate(CrateSugar::JustCrate),
|
||||
tokens: None,
|
||||
});
|
||||
}
|
||||
|
||||
if !self.eat_keyword(kw::Pub) {
|
||||
// We need a span for our `Spanned<VisibilityKind>`, but there's inherently no
|
||||
// keyword to grab a span from for inherited visibility; an empty span at the
|
||||
// beginning of the current token would seem to be the "Schelling span".
|
||||
return Ok(respan(self.token.span.shrink_to_lo(), VisibilityKind::Inherited));
|
||||
return Ok(Visibility {
|
||||
span: self.token.span.shrink_to_lo(),
|
||||
kind: VisibilityKind::Inherited,
|
||||
tokens: None,
|
||||
});
|
||||
}
|
||||
let lo = self.prev_token.span;
|
||||
|
||||
@ -1046,7 +1054,11 @@ impl<'a> Parser<'a> {
|
||||
self.bump(); // `crate`
|
||||
self.expect(&token::CloseDelim(token::Paren))?; // `)`
|
||||
let vis = VisibilityKind::Crate(CrateSugar::PubCrate);
|
||||
return Ok(respan(lo.to(self.prev_token.span), vis));
|
||||
return Ok(Visibility {
|
||||
span: lo.to(self.prev_token.span),
|
||||
kind: vis,
|
||||
tokens: None,
|
||||
});
|
||||
} else if self.is_keyword_ahead(1, &[kw::In]) {
|
||||
// Parse `pub(in path)`.
|
||||
self.bump(); // `(`
|
||||
@ -1054,7 +1066,11 @@ impl<'a> Parser<'a> {
|
||||
let path = self.parse_path(PathStyle::Mod)?; // `path`
|
||||
self.expect(&token::CloseDelim(token::Paren))?; // `)`
|
||||
let vis = VisibilityKind::Restricted { path: P(path), id: ast::DUMMY_NODE_ID };
|
||||
return Ok(respan(lo.to(self.prev_token.span), vis));
|
||||
return Ok(Visibility {
|
||||
span: lo.to(self.prev_token.span),
|
||||
kind: vis,
|
||||
tokens: None,
|
||||
});
|
||||
} else if self.look_ahead(2, |t| t == &token::CloseDelim(token::Paren))
|
||||
&& self.is_keyword_ahead(1, &[kw::Super, kw::SelfLower])
|
||||
{
|
||||
@ -1063,7 +1079,11 @@ impl<'a> Parser<'a> {
|
||||
let path = self.parse_path(PathStyle::Mod)?; // `super`/`self`
|
||||
self.expect(&token::CloseDelim(token::Paren))?; // `)`
|
||||
let vis = VisibilityKind::Restricted { path: P(path), id: ast::DUMMY_NODE_ID };
|
||||
return Ok(respan(lo.to(self.prev_token.span), vis));
|
||||
return Ok(Visibility {
|
||||
span: lo.to(self.prev_token.span),
|
||||
kind: vis,
|
||||
tokens: None,
|
||||
});
|
||||
} else if let FollowedByType::No = fbt {
|
||||
// Provide this diagnostic if a type cannot follow;
|
||||
// in particular, if this is not a tuple struct.
|
||||
@ -1072,7 +1092,7 @@ impl<'a> Parser<'a> {
|
||||
}
|
||||
}
|
||||
|
||||
Ok(respan(lo, VisibilityKind::Public))
|
||||
Ok(Visibility { span: lo, kind: VisibilityKind::Public, tokens: None })
|
||||
}
|
||||
|
||||
/// Recovery for e.g. `pub(something) fn ...` or `struct X { pub(something) y: Z }`
|
||||
|
@ -111,11 +111,28 @@ impl<'a> Parser<'a> {
|
||||
return Err(self.struct_span_err(self.token.span, "expected an item keyword"));
|
||||
}
|
||||
},
|
||||
NonterminalKind::Block => token::NtBlock(self.parse_block()?),
|
||||
NonterminalKind::Stmt => match self.parse_stmt()? {
|
||||
Some(s) => token::NtStmt(s),
|
||||
None => return Err(self.struct_span_err(self.token.span, "expected a statement")),
|
||||
},
|
||||
NonterminalKind::Block => {
|
||||
let (mut block, tokens) = self.collect_tokens(|this| this.parse_block())?;
|
||||
// We have have eaten an NtBlock, which could already have tokens
|
||||
if block.tokens.is_none() {
|
||||
block.tokens = Some(tokens);
|
||||
}
|
||||
token::NtBlock(block)
|
||||
}
|
||||
NonterminalKind::Stmt => {
|
||||
let (stmt, tokens) = self.collect_tokens(|this| this.parse_stmt())?;
|
||||
match stmt {
|
||||
Some(mut s) => {
|
||||
if s.tokens.is_none() {
|
||||
s.tokens = Some(tokens);
|
||||
}
|
||||
token::NtStmt(s)
|
||||
}
|
||||
None => {
|
||||
return Err(self.struct_span_err(self.token.span, "expected a statement"));
|
||||
}
|
||||
}
|
||||
}
|
||||
NonterminalKind::Pat => {
|
||||
let (mut pat, tokens) = self.collect_tokens(|this| this.parse_pat(None))?;
|
||||
// We have have eaten an NtPat, which could already have tokens
|
||||
@ -133,8 +150,23 @@ impl<'a> Parser<'a> {
|
||||
}
|
||||
token::NtExpr(expr)
|
||||
}
|
||||
NonterminalKind::Literal => token::NtLiteral(self.parse_literal_maybe_minus()?),
|
||||
NonterminalKind::Ty => token::NtTy(self.parse_ty()?),
|
||||
NonterminalKind::Literal => {
|
||||
let (mut lit, tokens) =
|
||||
self.collect_tokens(|this| this.parse_literal_maybe_minus())?;
|
||||
// We have have eaten a nonterminal, which could already have tokens
|
||||
if lit.tokens.is_none() {
|
||||
lit.tokens = Some(tokens);
|
||||
}
|
||||
token::NtLiteral(lit)
|
||||
}
|
||||
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) {
|
||||
@ -146,10 +178,33 @@ impl<'a> Parser<'a> {
|
||||
return Err(self.struct_span_err(self.token.span, msg));
|
||||
}
|
||||
}
|
||||
NonterminalKind::Path => token::NtPath(self.parse_path(PathStyle::Type)?),
|
||||
NonterminalKind::Meta => token::NtMeta(P(self.parse_attr_item()?)),
|
||||
NonterminalKind::Path => {
|
||||
let (mut path, tokens) =
|
||||
self.collect_tokens(|this| this.parse_path(PathStyle::Type))?;
|
||||
// We have have eaten an NtPath, which could already have tokens
|
||||
if path.tokens.is_none() {
|
||||
path.tokens = Some(tokens);
|
||||
}
|
||||
token::NtPath(path)
|
||||
}
|
||||
NonterminalKind::Meta => {
|
||||
let (mut attr, tokens) = self.collect_tokens(|this| this.parse_attr_item())?;
|
||||
// We may have eaten a nonterminal, which could already have tokens
|
||||
if attr.tokens.is_none() {
|
||||
attr.tokens = Some(tokens);
|
||||
}
|
||||
token::NtMeta(P(attr))
|
||||
}
|
||||
NonterminalKind::TT => token::NtTT(self.parse_token_tree()),
|
||||
NonterminalKind::Vis => token::NtVis(self.parse_visibility(FollowedByType::Yes)?),
|
||||
NonterminalKind::Vis => {
|
||||
let (mut vis, tokens) =
|
||||
self.collect_tokens(|this| this.parse_visibility(FollowedByType::Yes))?;
|
||||
// We may have etan an `NtVis`, which could already have tokens
|
||||
if vis.tokens.is_none() {
|
||||
vis.tokens = Some(tokens);
|
||||
}
|
||||
token::NtVis(vis)
|
||||
}
|
||||
NonterminalKind::Lifetime => {
|
||||
if self.check_lifetime() {
|
||||
token::NtLifetime(self.expect_lifetime().ident)
|
||||
|
@ -64,7 +64,7 @@ impl<'a> Parser<'a> {
|
||||
path_span = path_lo.to(self.prev_token.span);
|
||||
} else {
|
||||
path_span = self.token.span.to(self.token.span);
|
||||
path = ast::Path { segments: Vec::new(), span: path_span };
|
||||
path = ast::Path { segments: Vec::new(), span: path_span, tokens: None };
|
||||
}
|
||||
|
||||
// See doc comment for `unmatched_angle_bracket_count`.
|
||||
@ -81,7 +81,10 @@ impl<'a> Parser<'a> {
|
||||
let qself = QSelf { ty, path_span, position: path.segments.len() };
|
||||
self.parse_path_segments(&mut path.segments, style)?;
|
||||
|
||||
Ok((qself, Path { segments: path.segments, span: lo.to(self.prev_token.span) }))
|
||||
Ok((
|
||||
qself,
|
||||
Path { segments: path.segments, span: lo.to(self.prev_token.span), tokens: None },
|
||||
))
|
||||
}
|
||||
|
||||
/// Recover from an invalid single colon, when the user likely meant a qualified path.
|
||||
@ -144,7 +147,7 @@ impl<'a> Parser<'a> {
|
||||
}
|
||||
self.parse_path_segments(&mut segments, style)?;
|
||||
|
||||
Ok(Path { segments, span: lo.to(self.prev_token.span) })
|
||||
Ok(Path { segments, span: lo.to(self.prev_token.span), tokens: None })
|
||||
}
|
||||
|
||||
pub(super) fn parse_path_segments(
|
||||
|
@ -411,11 +411,11 @@ impl<'a> Parser<'a> {
|
||||
}
|
||||
|
||||
pub(super) fn mk_block(&self, stmts: Vec<Stmt>, rules: BlockCheckMode, span: Span) -> P<Block> {
|
||||
P(Block { stmts, id: DUMMY_NODE_ID, rules, span })
|
||||
P(Block { stmts, id: DUMMY_NODE_ID, rules, span, tokens: None })
|
||||
}
|
||||
|
||||
pub(super) fn mk_stmt(&self, span: Span, kind: StmtKind) -> Stmt {
|
||||
Stmt { id: DUMMY_NODE_ID, kind, span }
|
||||
Stmt { id: DUMMY_NODE_ID, kind, span, tokens: None }
|
||||
}
|
||||
|
||||
fn mk_stmt_err(&self, span: Span) -> Stmt {
|
||||
|
@ -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 })
|
||||
}
|
||||
}
|
||||
|
@ -218,7 +218,7 @@ impl<'a, 'b> BuildReducedGraphVisitor<'a, 'b> {
|
||||
speculative: bool,
|
||||
) -> Result<ty::Visibility, VisResolutionError<'ast>> {
|
||||
let parent_scope = &self.parent_scope;
|
||||
match vis.node {
|
||||
match vis.kind {
|
||||
ast::VisibilityKind::Public => Ok(ty::Visibility::Public),
|
||||
ast::VisibilityKind::Crate(..) => {
|
||||
Ok(ty::Visibility::Restricted(DefId::local(CRATE_DEF_INDEX)))
|
||||
|
@ -105,7 +105,7 @@ impl<'a, 'b> Visitor<'a> for UnusedImportCheckVisitor<'a, 'b> {
|
||||
// because this means that they were generated in some fashion by the
|
||||
// compiler and we don't need to consider them.
|
||||
if let ast::ItemKind::Use(..) = item.kind {
|
||||
if item.vis.node.is_pub() || item.span.is_dummy() {
|
||||
if item.vis.kind.is_pub() || item.span.is_dummy() {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
@ -794,7 +794,7 @@ impl<'a> Resolver<'a> {
|
||||
}
|
||||
|
||||
segms.push(ast::PathSegment::from_ident(ident));
|
||||
let path = Path { span: name_binding.span, segments: segms };
|
||||
let path = Path { span: name_binding.span, segments: segms, tokens: None };
|
||||
let did = match res {
|
||||
Res::Def(DefKind::Ctor(..), did) => this.parent(did),
|
||||
_ => res.opt_def_id(),
|
||||
|
@ -1967,7 +1967,7 @@ impl<'a, 'b, 'ast> LateResolutionVisitor<'a, 'b, 'ast> {
|
||||
|
||||
if qself.is_none() {
|
||||
let path_seg = |seg: &Segment| PathSegment::from_ident(seg.ident);
|
||||
let path = Path { segments: path.iter().map(path_seg).collect(), span };
|
||||
let path = Path { segments: path.iter().map(path_seg).collect(), span, tokens: None };
|
||||
if let Ok((_, res)) =
|
||||
self.r.resolve_macro_path(&path, None, &self.parent_scope, false, false)
|
||||
{
|
||||
|
@ -83,6 +83,7 @@ fn import_candidate_to_enum_paths(suggestion: &ImportSuggestion) -> (String, Str
|
||||
let enum_path = ast::Path {
|
||||
span: suggestion.path.span,
|
||||
segments: suggestion.path.segments[0..path_len - 1].to_vec(),
|
||||
tokens: None,
|
||||
};
|
||||
let enum_path_string = path_names_to_string(&enum_path);
|
||||
|
||||
@ -1065,7 +1066,8 @@ impl<'a> LateResolutionVisitor<'a, '_, '_> {
|
||||
path_segments.push(ast::PathSegment::from_ident(ident));
|
||||
let module_def_id = module.def_id().unwrap();
|
||||
if module_def_id == def_id {
|
||||
let path = Path { span: name_binding.span, segments: path_segments };
|
||||
let path =
|
||||
Path { span: name_binding.span, segments: path_segments, tokens: None };
|
||||
result = Some((
|
||||
module,
|
||||
ImportSuggestion {
|
||||
@ -1095,7 +1097,7 @@ impl<'a> LateResolutionVisitor<'a, '_, '_> {
|
||||
if let Res::Def(DefKind::Variant, _) = name_binding.res() {
|
||||
let mut segms = enum_import_suggestion.path.segments.clone();
|
||||
segms.push(ast::PathSegment::from_ident(ident));
|
||||
variants.push(Path { span: name_binding.span, segments: segms });
|
||||
variants.push(Path { span: name_binding.span, segments: segms, tokens: None });
|
||||
}
|
||||
});
|
||||
variants
|
||||
|
@ -3189,6 +3189,7 @@ impl<'a> Resolver<'a> {
|
||||
.chain(path_str.split("::").skip(1).map(Ident::from_str))
|
||||
.map(|i| self.new_ast_path_segment(i))
|
||||
.collect(),
|
||||
tokens: None,
|
||||
}
|
||||
} else {
|
||||
ast::Path {
|
||||
@ -3198,6 +3199,7 @@ impl<'a> Resolver<'a> {
|
||||
.map(Ident::from_str)
|
||||
.map(|i| self.new_ast_path_segment(i))
|
||||
.collect(),
|
||||
tokens: None,
|
||||
}
|
||||
};
|
||||
let module = self.get_module(module_id);
|
||||
|
@ -62,7 +62,7 @@ fn expr(kind: ExprKind) -> P<Expr> {
|
||||
|
||||
fn make_x() -> P<Expr> {
|
||||
let seg = PathSegment::from_ident(Ident::from_str("x"));
|
||||
let path = Path { segments: vec![seg], span: DUMMY_SP };
|
||||
let path = Path { segments: vec![seg], span: DUMMY_SP, tokens: None };
|
||||
expr(ExprKind::Path(None, path))
|
||||
}
|
||||
|
||||
@ -113,6 +113,7 @@ fn iter_exprs(depth: usize, f: &mut dyn FnMut(P<Expr>)) {
|
||||
id: DUMMY_NODE_ID,
|
||||
rules: BlockCheckMode::Default,
|
||||
span: DUMMY_SP,
|
||||
tokens: None,
|
||||
});
|
||||
iter_exprs(depth - 1, &mut |e| g(ExprKind::If(e, block.clone(), None)));
|
||||
},
|
||||
|
@ -1 +1 @@
|
||||
{"module":{"inner":{"lo":0,"hi":0},"unsafety":"No","items":[{"attrs":[],"id":0,"span":{"lo":0,"hi":0},"vis":{"node":"Inherited","span":{"lo":0,"hi":0}},"ident":{"name":"core","span":{"lo":0,"hi":0}},"kind":{"variant":"ExternCrate","fields":[null]},"tokens":null}],"inline":true},"attrs":[{"kind":{"variant":"Normal","fields":[{"path":{"span":{"lo":0,"hi":0},"segments":[{"ident":{"name":"crate_type","span":{"lo":0,"hi":0}},"id":0,"args":null}]},"args":{"variant":"Eq","fields":[{"lo":0,"hi":0},{"0":[[{"variant":"Token","fields":[{"kind":{"variant":"Literal","fields":[{"kind":"Str","symbol":"lib","suffix":null}]},"span":{"lo":0,"hi":0}}]},"Alone"]]}]}}]},"id":null,"style":"Inner","span":{"lo":0,"hi":0}}],"span":{"lo":0,"hi":0},"proc_macros":[]}
|
||||
{"module":{"inner":{"lo":0,"hi":0},"unsafety":"No","items":[{"attrs":[],"id":0,"span":{"lo":0,"hi":0},"vis":{"kind":"Inherited","span":{"lo":0,"hi":0},"tokens":null},"ident":{"name":"core","span":{"lo":0,"hi":0}},"kind":{"variant":"ExternCrate","fields":[null]},"tokens":null}],"inline":true},"attrs":[{"kind":{"variant":"Normal","fields":[{"path":{"span":{"lo":0,"hi":0},"segments":[{"ident":{"name":"crate_type","span":{"lo":0,"hi":0}},"id":0,"args":null}],"tokens":null},"args":{"variant":"Eq","fields":[{"lo":0,"hi":0},{"0":[[{"variant":"Token","fields":[{"kind":{"variant":"Literal","fields":[{"kind":"Str","symbol":"lib","suffix":null}]},"span":{"lo":0,"hi":0}}]},"Alone"]]}]},"tokens":null}]},"id":null,"style":"Inner","span":{"lo":0,"hi":0}}],"span":{"lo":0,"hi":0},"proc_macros":[]}
|
||||
|
@ -1 +1 @@
|
||||
{"module":{"inner":{"lo":0,"hi":0},"unsafety":"No","items":[{"attrs":[{"kind":{"variant":"Normal","fields":[{"path":{"span":{"lo":0,"hi":0},"segments":[{"ident":{"name":"prelude_import","span":{"lo":0,"hi":0}},"id":0,"args":null}]},"args":"Empty"}]},"id":null,"style":"Outer","span":{"lo":0,"hi":0}}],"id":0,"span":{"lo":0,"hi":0},"vis":{"node":"Inherited","span":{"lo":0,"hi":0}},"ident":{"name":"","span":{"lo":0,"hi":0}},"kind":{"variant":"Use","fields":[{"prefix":{"span":{"lo":0,"hi":0},"segments":[{"ident":{"name":"{{root}}","span":{"lo":0,"hi":0}},"id":0,"args":null},{"ident":{"name":"std","span":{"lo":0,"hi":0}},"id":0,"args":null},{"ident":{"name":"prelude","span":{"lo":0,"hi":0}},"id":0,"args":null},{"ident":{"name":"v1","span":{"lo":0,"hi":0}},"id":0,"args":null}]},"kind":"Glob","span":{"lo":0,"hi":0}}]},"tokens":null},{"attrs":[{"kind":{"variant":"Normal","fields":[{"path":{"span":{"lo":0,"hi":0},"segments":[{"ident":{"name":"macro_use","span":{"lo":0,"hi":0}},"id":0,"args":null}]},"args":"Empty"}]},"id":null,"style":"Outer","span":{"lo":0,"hi":0}}],"id":0,"span":{"lo":0,"hi":0},"vis":{"node":"Inherited","span":{"lo":0,"hi":0}},"ident":{"name":"std","span":{"lo":0,"hi":0}},"kind":{"variant":"ExternCrate","fields":[null]},"tokens":null},{"attrs":[],"id":0,"span":{"lo":0,"hi":0},"vis":{"node":"Inherited","span":{"lo":0,"hi":0}},"ident":{"name":"core","span":{"lo":0,"hi":0}},"kind":{"variant":"ExternCrate","fields":[null]},"tokens":null}],"inline":true},"attrs":[{"kind":{"variant":"Normal","fields":[{"path":{"span":{"lo":0,"hi":0},"segments":[{"ident":{"name":"crate_type","span":{"lo":0,"hi":0}},"id":0,"args":null}]},"args":{"variant":"Eq","fields":[{"lo":0,"hi":0},{"0":[[{"variant":"Token","fields":[{"kind":{"variant":"Literal","fields":[{"kind":"Str","symbol":"lib","suffix":null}]},"span":{"lo":0,"hi":0}}]},"Alone"]]}]}}]},"id":null,"style":"Inner","span":{"lo":0,"hi":0}}],"span":{"lo":0,"hi":0},"proc_macros":[]}
|
||||
{"module":{"inner":{"lo":0,"hi":0},"unsafety":"No","items":[{"attrs":[{"kind":{"variant":"Normal","fields":[{"path":{"span":{"lo":0,"hi":0},"segments":[{"ident":{"name":"prelude_import","span":{"lo":0,"hi":0}},"id":0,"args":null}],"tokens":null},"args":"Empty","tokens":null}]},"id":null,"style":"Outer","span":{"lo":0,"hi":0}}],"id":0,"span":{"lo":0,"hi":0},"vis":{"kind":"Inherited","span":{"lo":0,"hi":0},"tokens":null},"ident":{"name":"","span":{"lo":0,"hi":0}},"kind":{"variant":"Use","fields":[{"prefix":{"span":{"lo":0,"hi":0},"segments":[{"ident":{"name":"{{root}}","span":{"lo":0,"hi":0}},"id":0,"args":null},{"ident":{"name":"std","span":{"lo":0,"hi":0}},"id":0,"args":null},{"ident":{"name":"prelude","span":{"lo":0,"hi":0}},"id":0,"args":null},{"ident":{"name":"v1","span":{"lo":0,"hi":0}},"id":0,"args":null}],"tokens":null},"kind":"Glob","span":{"lo":0,"hi":0}}]},"tokens":null},{"attrs":[{"kind":{"variant":"Normal","fields":[{"path":{"span":{"lo":0,"hi":0},"segments":[{"ident":{"name":"macro_use","span":{"lo":0,"hi":0}},"id":0,"args":null}],"tokens":null},"args":"Empty","tokens":null}]},"id":null,"style":"Outer","span":{"lo":0,"hi":0}}],"id":0,"span":{"lo":0,"hi":0},"vis":{"kind":"Inherited","span":{"lo":0,"hi":0},"tokens":null},"ident":{"name":"std","span":{"lo":0,"hi":0}},"kind":{"variant":"ExternCrate","fields":[null]},"tokens":null},{"attrs":[],"id":0,"span":{"lo":0,"hi":0},"vis":{"kind":"Inherited","span":{"lo":0,"hi":0},"tokens":null},"ident":{"name":"core","span":{"lo":0,"hi":0}},"kind":{"variant":"ExternCrate","fields":[null]},"tokens":null}],"inline":true},"attrs":[{"kind":{"variant":"Normal","fields":[{"path":{"span":{"lo":0,"hi":0},"segments":[{"ident":{"name":"crate_type","span":{"lo":0,"hi":0}},"id":0,"args":null}],"tokens":null},"args":{"variant":"Eq","fields":[{"lo":0,"hi":0},{"0":[[{"variant":"Token","fields":[{"kind":{"variant":"Literal","fields":[{"kind":"Str","symbol":"lib","suffix":null}]},"span":{"lo":0,"hi":0}}]},"Alone"]]}]},"tokens":null}]},"id":null,"style":"Inner","span":{"lo":0,"hi":0}}],"span":{"lo":0,"hi":0},"proc_macros":[]}
|
||||
|
@ -1,10 +1,20 @@
|
||||
// aux-build:test-macros.rs
|
||||
// check-pass
|
||||
// compile-flags: -Z span-debug
|
||||
// normalize-stdout-test "#\d+" -> "#CTXT"
|
||||
|
||||
#![no_std] // Don't load unnecessary hygiene information from std
|
||||
extern crate std;
|
||||
|
||||
extern crate test_macros;
|
||||
use test_macros::print_bang;
|
||||
use test_macros::{print_bang, print_bang_consume};
|
||||
|
||||
macro_rules! test_matchers {
|
||||
($expr:expr, $block:block, $stmt:stmt, $ty:ty, $ident:ident, $lifetime:lifetime,
|
||||
$meta:meta, $path:path, $vis:vis, $tt:tt, $lit:literal) => {
|
||||
print_bang_consume!($expr, $block, $stmt, $ty, $ident,
|
||||
$lifetime, $meta, $path, $vis, $tt, $lit)
|
||||
}
|
||||
}
|
||||
|
||||
macro_rules! use_expr {
|
||||
($expr:expr) => {
|
||||
@ -24,10 +34,23 @@ impl Foo {
|
||||
#[allow(dead_code)]
|
||||
fn use_self(self) {
|
||||
drop(use_expr!(self));
|
||||
test_matchers!(
|
||||
1 + 1,
|
||||
{ "a" },
|
||||
let a = 1,
|
||||
String,
|
||||
my_name,
|
||||
'a,
|
||||
my_val = 30,
|
||||
std::option::Option,
|
||||
pub(in some::path),
|
||||
[ a b c ],
|
||||
-30
|
||||
);
|
||||
}
|
||||
|
||||
fn with_pat(use_pat!((a, b)): (u32, u32)) {
|
||||
println!("Args: {} {}", a, b);
|
||||
let _ = (a, b);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -5,10 +5,299 @@ PRINT-BANG INPUT (DEBUG): TokenStream [
|
||||
stream: TokenStream [
|
||||
Ident {
|
||||
ident: "self",
|
||||
span: $DIR/capture-macro-rules-invoke.rs:26:24: 26:28 (#CTXT),
|
||||
span: $DIR/capture-macro-rules-invoke.rs:36:24: 36:28 (#0),
|
||||
},
|
||||
],
|
||||
span: $DIR/capture-macro-rules-invoke.rs:11:21: 11:26 (#CTXT),
|
||||
span: $DIR/capture-macro-rules-invoke.rs:21:21: 21:26 (#3),
|
||||
},
|
||||
]
|
||||
PRINT-BANG INPUT (DISPLAY): 1 + 1, { "a" }, let a = 1;, String, my_name, 'a, my_val = 30,
|
||||
std::option::Option, pub(in some::path) , [a b c], -30
|
||||
PRINT-BANG RE-COLLECTED (DISPLAY): 1 + 1, { "a" }, let a = 1, String, my_name, 'a, my_val = 30,
|
||||
std :: option :: Option, pub(in some :: path), [a b c], - 30
|
||||
PRINT-BANG INPUT (DEBUG): TokenStream [
|
||||
Group {
|
||||
delimiter: None,
|
||||
stream: TokenStream [
|
||||
Literal {
|
||||
kind: Integer,
|
||||
symbol: "1",
|
||||
suffix: None,
|
||||
span: $DIR/capture-macro-rules-invoke.rs:38:13: 38:14 (#0),
|
||||
},
|
||||
Punct {
|
||||
ch: '+',
|
||||
spacing: Alone,
|
||||
span: $DIR/capture-macro-rules-invoke.rs:38:15: 38:16 (#0),
|
||||
},
|
||||
Literal {
|
||||
kind: Integer,
|
||||
symbol: "1",
|
||||
suffix: None,
|
||||
span: $DIR/capture-macro-rules-invoke.rs:38:17: 38:18 (#0),
|
||||
},
|
||||
],
|
||||
span: $DIR/capture-macro-rules-invoke.rs:14:29: 14:34 (#7),
|
||||
},
|
||||
Punct {
|
||||
ch: ',',
|
||||
spacing: Alone,
|
||||
span: $DIR/capture-macro-rules-invoke.rs:14:34: 14:35 (#7),
|
||||
},
|
||||
Group {
|
||||
delimiter: None,
|
||||
stream: TokenStream [
|
||||
Group {
|
||||
delimiter: Brace,
|
||||
stream: TokenStream [
|
||||
Literal {
|
||||
kind: Str,
|
||||
symbol: "a",
|
||||
suffix: None,
|
||||
span: $DIR/capture-macro-rules-invoke.rs:39:15: 39:18 (#0),
|
||||
},
|
||||
],
|
||||
span: $DIR/capture-macro-rules-invoke.rs:39:13: 39:20 (#0),
|
||||
},
|
||||
],
|
||||
span: $DIR/capture-macro-rules-invoke.rs:14:36: 14:42 (#7),
|
||||
},
|
||||
Punct {
|
||||
ch: ',',
|
||||
spacing: Alone,
|
||||
span: $DIR/capture-macro-rules-invoke.rs:14:42: 14:43 (#7),
|
||||
},
|
||||
Group {
|
||||
delimiter: None,
|
||||
stream: TokenStream [
|
||||
Ident {
|
||||
ident: "let",
|
||||
span: $DIR/capture-macro-rules-invoke.rs:40:13: 40:16 (#0),
|
||||
},
|
||||
Ident {
|
||||
ident: "a",
|
||||
span: $DIR/capture-macro-rules-invoke.rs:40:17: 40:18 (#0),
|
||||
},
|
||||
Punct {
|
||||
ch: '=',
|
||||
spacing: Alone,
|
||||
span: $DIR/capture-macro-rules-invoke.rs:40:19: 40:20 (#0),
|
||||
},
|
||||
Literal {
|
||||
kind: Integer,
|
||||
symbol: "1",
|
||||
suffix: None,
|
||||
span: $DIR/capture-macro-rules-invoke.rs:40:21: 40:22 (#0),
|
||||
},
|
||||
],
|
||||
span: $DIR/capture-macro-rules-invoke.rs:14:44: 14:49 (#7),
|
||||
},
|
||||
Punct {
|
||||
ch: ',',
|
||||
spacing: Alone,
|
||||
span: $DIR/capture-macro-rules-invoke.rs:14:49: 14:50 (#7),
|
||||
},
|
||||
Group {
|
||||
delimiter: None,
|
||||
stream: TokenStream [
|
||||
Ident {
|
||||
ident: "String",
|
||||
span: $DIR/capture-macro-rules-invoke.rs:41:13: 41:19 (#0),
|
||||
},
|
||||
],
|
||||
span: $DIR/capture-macro-rules-invoke.rs:14:51: 14:54 (#7),
|
||||
},
|
||||
Punct {
|
||||
ch: ',',
|
||||
spacing: Alone,
|
||||
span: $DIR/capture-macro-rules-invoke.rs:14:54: 14:55 (#7),
|
||||
},
|
||||
Group {
|
||||
delimiter: None,
|
||||
stream: TokenStream [
|
||||
Ident {
|
||||
ident: "my_name",
|
||||
span: $DIR/capture-macro-rules-invoke.rs:42:13: 42:20 (#0),
|
||||
},
|
||||
],
|
||||
span: $DIR/capture-macro-rules-invoke.rs:14:56: 14:62 (#7),
|
||||
},
|
||||
Punct {
|
||||
ch: ',',
|
||||
spacing: Alone,
|
||||
span: $DIR/capture-macro-rules-invoke.rs:14:62: 14:63 (#7),
|
||||
},
|
||||
Group {
|
||||
delimiter: None,
|
||||
stream: TokenStream [
|
||||
Punct {
|
||||
ch: '\'',
|
||||
spacing: Joint,
|
||||
span: $DIR/capture-macro-rules-invoke.rs:43:13: 43:15 (#0),
|
||||
},
|
||||
Ident {
|
||||
ident: "a",
|
||||
span: $DIR/capture-macro-rules-invoke.rs:43:13: 43:15 (#0),
|
||||
},
|
||||
],
|
||||
span: $DIR/capture-macro-rules-invoke.rs:15:29: 15:38 (#7),
|
||||
},
|
||||
Punct {
|
||||
ch: ',',
|
||||
spacing: Alone,
|
||||
span: $DIR/capture-macro-rules-invoke.rs:15:38: 15:39 (#7),
|
||||
},
|
||||
Group {
|
||||
delimiter: None,
|
||||
stream: TokenStream [
|
||||
Ident {
|
||||
ident: "my_val",
|
||||
span: $DIR/capture-macro-rules-invoke.rs:44:13: 44:19 (#0),
|
||||
},
|
||||
Punct {
|
||||
ch: '=',
|
||||
spacing: Alone,
|
||||
span: $DIR/capture-macro-rules-invoke.rs:44:20: 44:21 (#0),
|
||||
},
|
||||
Literal {
|
||||
kind: Integer,
|
||||
symbol: "30",
|
||||
suffix: None,
|
||||
span: $DIR/capture-macro-rules-invoke.rs:44:22: 44:24 (#0),
|
||||
},
|
||||
],
|
||||
span: $DIR/capture-macro-rules-invoke.rs:15:40: 15:45 (#7),
|
||||
},
|
||||
Punct {
|
||||
ch: ',',
|
||||
spacing: Alone,
|
||||
span: $DIR/capture-macro-rules-invoke.rs:15:45: 15:46 (#7),
|
||||
},
|
||||
Group {
|
||||
delimiter: None,
|
||||
stream: TokenStream [
|
||||
Ident {
|
||||
ident: "std",
|
||||
span: $DIR/capture-macro-rules-invoke.rs:45:13: 45:16 (#0),
|
||||
},
|
||||
Punct {
|
||||
ch: ':',
|
||||
spacing: Joint,
|
||||
span: $DIR/capture-macro-rules-invoke.rs:45:16: 45:18 (#0),
|
||||
},
|
||||
Punct {
|
||||
ch: ':',
|
||||
spacing: Alone,
|
||||
span: $DIR/capture-macro-rules-invoke.rs:45:16: 45:18 (#0),
|
||||
},
|
||||
Ident {
|
||||
ident: "option",
|
||||
span: $DIR/capture-macro-rules-invoke.rs:45:18: 45:24 (#0),
|
||||
},
|
||||
Punct {
|
||||
ch: ':',
|
||||
spacing: Joint,
|
||||
span: $DIR/capture-macro-rules-invoke.rs:45:24: 45:26 (#0),
|
||||
},
|
||||
Punct {
|
||||
ch: ':',
|
||||
spacing: Alone,
|
||||
span: $DIR/capture-macro-rules-invoke.rs:45:24: 45:26 (#0),
|
||||
},
|
||||
Ident {
|
||||
ident: "Option",
|
||||
span: $DIR/capture-macro-rules-invoke.rs:45:26: 45:32 (#0),
|
||||
},
|
||||
],
|
||||
span: $DIR/capture-macro-rules-invoke.rs:15:47: 15:52 (#7),
|
||||
},
|
||||
Punct {
|
||||
ch: ',',
|
||||
spacing: Alone,
|
||||
span: $DIR/capture-macro-rules-invoke.rs:15:52: 15:53 (#7),
|
||||
},
|
||||
Group {
|
||||
delimiter: None,
|
||||
stream: TokenStream [
|
||||
Ident {
|
||||
ident: "pub",
|
||||
span: $DIR/capture-macro-rules-invoke.rs:46:13: 46:16 (#0),
|
||||
},
|
||||
Group {
|
||||
delimiter: Parenthesis,
|
||||
stream: TokenStream [
|
||||
Ident {
|
||||
ident: "in",
|
||||
span: $DIR/capture-macro-rules-invoke.rs:46:17: 46:19 (#0),
|
||||
},
|
||||
Ident {
|
||||
ident: "some",
|
||||
span: $DIR/capture-macro-rules-invoke.rs:46:20: 46:24 (#0),
|
||||
},
|
||||
Punct {
|
||||
ch: ':',
|
||||
spacing: Joint,
|
||||
span: $DIR/capture-macro-rules-invoke.rs:46:24: 46:26 (#0),
|
||||
},
|
||||
Punct {
|
||||
ch: ':',
|
||||
spacing: Alone,
|
||||
span: $DIR/capture-macro-rules-invoke.rs:46:24: 46:26 (#0),
|
||||
},
|
||||
Ident {
|
||||
ident: "path",
|
||||
span: $DIR/capture-macro-rules-invoke.rs:46:26: 46:30 (#0),
|
||||
},
|
||||
],
|
||||
span: $DIR/capture-macro-rules-invoke.rs:46:16: 46:31 (#0),
|
||||
},
|
||||
],
|
||||
span: $DIR/capture-macro-rules-invoke.rs:15:54: 15:58 (#7),
|
||||
},
|
||||
Punct {
|
||||
ch: ',',
|
||||
spacing: Alone,
|
||||
span: $DIR/capture-macro-rules-invoke.rs:15:58: 15:59 (#7),
|
||||
},
|
||||
Group {
|
||||
delimiter: Bracket,
|
||||
stream: TokenStream [
|
||||
Ident {
|
||||
ident: "a",
|
||||
span: $DIR/capture-macro-rules-invoke.rs:47:15: 47:16 (#0),
|
||||
},
|
||||
Ident {
|
||||
ident: "b",
|
||||
span: $DIR/capture-macro-rules-invoke.rs:47:17: 47:18 (#0),
|
||||
},
|
||||
Ident {
|
||||
ident: "c",
|
||||
span: $DIR/capture-macro-rules-invoke.rs:47:19: 47:20 (#0),
|
||||
},
|
||||
],
|
||||
span: $DIR/capture-macro-rules-invoke.rs:47:13: 47:22 (#0),
|
||||
},
|
||||
Punct {
|
||||
ch: ',',
|
||||
spacing: Alone,
|
||||
span: $DIR/capture-macro-rules-invoke.rs:15:63: 15:64 (#7),
|
||||
},
|
||||
Group {
|
||||
delimiter: None,
|
||||
stream: TokenStream [
|
||||
Punct {
|
||||
ch: '-',
|
||||
spacing: Alone,
|
||||
span: $DIR/capture-macro-rules-invoke.rs:48:13: 48:14 (#0),
|
||||
},
|
||||
Literal {
|
||||
kind: Integer,
|
||||
symbol: "30",
|
||||
suffix: None,
|
||||
span: $DIR/capture-macro-rules-invoke.rs:48:14: 48:16 (#0),
|
||||
},
|
||||
],
|
||||
span: $DIR/capture-macro-rules-invoke.rs:15:65: 15:69 (#7),
|
||||
},
|
||||
]
|
||||
PRINT-BANG INPUT (DISPLAY): (a, b)
|
||||
@ -21,21 +310,21 @@ PRINT-BANG INPUT (DEBUG): TokenStream [
|
||||
stream: TokenStream [
|
||||
Ident {
|
||||
ident: "a",
|
||||
span: $DIR/capture-macro-rules-invoke.rs:29:27: 29:28 (#CTXT),
|
||||
span: $DIR/capture-macro-rules-invoke.rs:52:27: 52:28 (#0),
|
||||
},
|
||||
Punct {
|
||||
ch: ',',
|
||||
spacing: Alone,
|
||||
span: $DIR/capture-macro-rules-invoke.rs:29:28: 29:29 (#CTXT),
|
||||
span: $DIR/capture-macro-rules-invoke.rs:52:28: 52:29 (#0),
|
||||
},
|
||||
Ident {
|
||||
ident: "b",
|
||||
span: $DIR/capture-macro-rules-invoke.rs:29:30: 29:31 (#CTXT),
|
||||
span: $DIR/capture-macro-rules-invoke.rs:52:30: 52:31 (#0),
|
||||
},
|
||||
],
|
||||
span: $DIR/capture-macro-rules-invoke.rs:29:26: 29:32 (#CTXT),
|
||||
span: $DIR/capture-macro-rules-invoke.rs:52:26: 52:32 (#0),
|
||||
},
|
||||
],
|
||||
span: $DIR/capture-macro-rules-invoke.rs:17:21: 17:25 (#CTXT),
|
||||
span: $DIR/capture-macro-rules-invoke.rs:27:21: 27:25 (#11),
|
||||
},
|
||||
]
|
||||
|
@ -285,7 +285,7 @@ impl EarlyLintPass for EnumVariantNames {
|
||||
);
|
||||
}
|
||||
}
|
||||
if item.vis.node.is_pub() {
|
||||
if item.vis.kind.is_pub() {
|
||||
let matching = partial_match(mod_camel, &item_camel);
|
||||
let rmatching = partial_rmatch(mod_camel, &item_camel);
|
||||
let nchars = mod_camel.chars().count();
|
||||
@ -316,7 +316,7 @@ impl EarlyLintPass for EnumVariantNames {
|
||||
}
|
||||
}
|
||||
if let ItemKind::Enum(ref def, _) = item.kind {
|
||||
let lint = match item.vis.node {
|
||||
let lint = match item.vis.kind {
|
||||
VisibilityKind::Public => PUB_ENUM_VARIANT_NAMES,
|
||||
_ => ENUM_VARIANT_NAMES,
|
||||
};
|
||||
|
@ -122,7 +122,7 @@ fn check_manual_non_exhaustive_enum(cx: &EarlyContext<'_>, item: &Item, variants
|
||||
|
||||
fn check_manual_non_exhaustive_struct(cx: &EarlyContext<'_>, item: &Item, data: &VariantData) {
|
||||
fn is_private(field: &StructField) -> bool {
|
||||
matches!(field.vis.node, VisibilityKind::Inherited)
|
||||
matches!(field.vis.kind, VisibilityKind::Inherited)
|
||||
}
|
||||
|
||||
fn is_non_exhaustive_marker(field: &StructField) -> bool {
|
||||
@ -141,7 +141,7 @@ fn check_manual_non_exhaustive_struct(cx: &EarlyContext<'_>, item: &Item, data:
|
||||
|
||||
let fields = data.fields();
|
||||
let private_fields = fields.iter().filter(|f| is_private(f)).count();
|
||||
let public_fields = fields.iter().filter(|f| f.vis.node.is_pub()).count();
|
||||
let public_fields = fields.iter().filter(|f| f.vis.kind.is_pub()).count();
|
||||
|
||||
if_chain! {
|
||||
if private_fields == 1 && public_fields >= 1 && public_fields == fields.len() - 1;
|
||||
|
@ -41,7 +41,7 @@ impl EarlyLintPass for SingleComponentPathImports {
|
||||
if_chain! {
|
||||
if !in_macro(item.span);
|
||||
if cx.sess.opts.edition == Edition::Edition2018;
|
||||
if !item.vis.node.is_pub();
|
||||
if !item.vis.kind.is_pub();
|
||||
if let ItemKind::Use(use_tree) = &item.kind;
|
||||
if let segments = &use_tree.prefix.segments;
|
||||
if segments.len() == 1;
|
||||
|
@ -394,7 +394,7 @@ pub fn eq_defaultness(l: Defaultness, r: Defaultness) -> bool {
|
||||
|
||||
pub fn eq_vis(l: &Visibility, r: &Visibility) -> bool {
|
||||
use VisibilityKind::*;
|
||||
match (&l.node, &r.node) {
|
||||
match (&l.kind, &r.kind) {
|
||||
(Public, Public) | (Inherited, Inherited) | (Crate(_), Crate(_)) => true,
|
||||
(Restricted { path: l, .. }, Restricted { path: r, .. }) => eq_path(l, r),
|
||||
_ => false,
|
||||
|
Loading…
Reference in New Issue
Block a user