ast: add `Defaultness` to `Item`, making `AssocItem` an alias.

This commit is contained in:
Mazdak Farrokhzad 2020-02-22 03:29:17 +01:00
parent d41fc138bf
commit 7017058e6b
13 changed files with 35 additions and 44 deletions

View File

@ -1016,8 +1016,8 @@ impl<'a> State<'a> {
}
crate fn print_foreign_item(&mut self, item: &ast::ForeignItem) {
let ast::ForeignItem { id, span, ident, attrs, kind, vis, tokens: _ } = item;
self.print_nested_item_kind(*id, *span, *ident, attrs, ast::Defaultness::Final, kind, vis);
let ast::Item { id, span, ident, attrs, kind, vis, defaultness, tokens: _ } = item;
self.print_nested_item_kind(*id, *span, *ident, attrs, *defaultness, kind, vis);
}
fn print_nested_item_kind(

View File

@ -30,6 +30,7 @@ pub fn expand_global_asm<'cx>(
id: ast::DUMMY_NODE_ID,
kind: ast::ItemKind::GlobalAsm(P(global_asm)),
vis: respan(sp.shrink_to_lo(), ast::VisibilityKind::Inherited),
defaultness: ast::Defaultness::Final,
span: cx.with_def_site_ctxt(sp),
tokens: None,
})]),

View File

@ -162,7 +162,7 @@ impl MutVisitor for EntryPointCleaner {
// #[allow(dead_code)] to avoid printing warnings.
let item = match entry::entry_point_type(&item, self.depth) {
EntryPointType::MainNamed | EntryPointType::MainAttr | EntryPointType::Start => item
.map(|ast::Item { id, ident, attrs, kind, vis, span, tokens }| {
.map(|ast::Item { id, ident, attrs, kind, vis, defaultness, span, tokens }| {
let allow_ident = Ident::new(sym::allow, self.def_site);
let dc_nested = attr::mk_nested_word_item(Ident::from_str_and_span(
"dead_code",
@ -170,22 +170,13 @@ impl MutVisitor for EntryPointCleaner {
));
let allow_dead_code_item = attr::mk_list_item(allow_ident, vec![dc_nested]);
let allow_dead_code = attr::mk_attr_outer(allow_dead_code_item);
ast::Item {
id,
ident,
attrs: attrs
let attrs = attrs
.into_iter()
.filter(|attr| {
!attr.check_name(sym::main) && !attr.check_name(sym::start)
})
.filter(|attr| !attr.check_name(sym::main) && !attr.check_name(sym::start))
.chain(iter::once(allow_dead_code))
.collect(),
kind,
vis,
span,
tokens,
}
.collect();
ast::Item { id, ident, attrs, kind, vis, defaultness, span, tokens }
}),
EntryPointType::None | EntryPointType::OtherMain => item,
};
@ -321,6 +312,7 @@ fn mk_main(cx: &mut TestCtxt<'_>) -> P<ast::Item> {
id: ast::DUMMY_NODE_ID,
kind: main,
vis: respan(sp, ast::VisibilityKind::Public),
defaultness: ast::Defaultness::Final,
span: sp,
tokens: None,
});

View File

@ -588,6 +588,7 @@ impl<'a> ExtCtxt<'a> {
id: ast::DUMMY_NODE_ID,
kind,
vis: respan(span.shrink_to_lo(), ast::VisibilityKind::Inherited),
defaultness: ast::Defaultness::Final,
span,
tokens: None,
})

View File

@ -358,6 +358,7 @@ impl<'a, 'b> MacroExpander<'a, 'b> {
ident: Ident::invalid(),
id: ast::DUMMY_NODE_ID,
vis: respan(krate.span.shrink_to_lo(), ast::VisibilityKind::Public),
defaultness: ast::Defaultness::Final,
tokens: None,
})]);

View File

@ -26,6 +26,7 @@ pub fn placeholder(
let ident = ast::Ident::invalid();
let attrs = Vec::new();
let vis = vis.unwrap_or_else(|| dummy_spanned(ast::VisibilityKind::Inherited));
let defaultness = ast::Defaultness::Final;
let span = DUMMY_SP;
let expr_placeholder = || {
P(ast::Expr {
@ -46,6 +47,7 @@ pub fn placeholder(
span,
ident,
vis,
defaultness,
attrs,
kind: ast::ItemKind::Mac(mac_placeholder()),
tokens: None,
@ -76,6 +78,7 @@ pub fn placeholder(
span,
ident,
vis,
defaultness,
attrs,
kind: ast::ForeignItemKind::Macro(mac_placeholder()),
tokens: None,

View File

@ -464,6 +464,7 @@ impl CStore {
legacy: def.legacy,
}),
vis: source_map::respan(local_span.shrink_to_lo(), ast::VisibilityKind::Inherited),
defaultness: ast::Defaultness::Final,
tokens: None,
},
data.root.edition,

View File

@ -85,7 +85,7 @@ impl<'a> Parser<'a> {
let vis = self.parse_visibility(FollowedByType::No)?;
if let Some((ident, kind)) = self.parse_item_kind(&mut attrs, macros_allowed, lo, &vis)? {
return Ok(Some(P(self.mk_item(lo, ident, kind, vis, attrs))));
return Ok(Some(P(self.mk_item(lo, ident, kind, vis, Defaultness::Final, attrs))));
}
// FAILURE TO PARSE ITEM
@ -866,7 +866,7 @@ impl<'a> Parser<'a> {
let lo = self.token.span;
let vis = self.parse_visibility(FollowedByType::No)?;
let (ident, kind) = self.parse_assoc_item_kind(at_end, &mut attrs, |_| true, &vis)?;
let item = self.mk_item(lo, ident, kind, vis, attrs);
let item = self.mk_item(lo, ident, kind, vis, Defaultness::Final, attrs);
self.error_on_foreign_const(&item);
Ok(P(item))
}
@ -1420,10 +1420,11 @@ impl<'a> Parser<'a> {
ident: Ident,
kind: K,
vis: Visibility,
defaultness: Defaultness,
attrs: Vec<Attribute>,
) -> Item<K> {
let span = lo.to(self.prev_span);
Item { ident, attrs, id: DUMMY_NODE_ID, kind, vis, span, tokens: None }
Item { ident, attrs, id: DUMMY_NODE_ID, kind, vis, defaultness, span, tokens: None }
}
}

View File

@ -2411,16 +2411,19 @@ impl VariantData {
}
}
/// An item.
///
/// The name might be a dummy name in case of anonymous items.
/// An item definition.
#[derive(Clone, RustcEncodable, RustcDecodable, Debug)]
pub struct Item<K = ItemKind> {
pub attrs: Vec<Attribute>,
pub id: NodeId,
pub span: Span,
pub vis: Visibility,
/// The name of the item.
/// It might be a dummy name in case of anonymous items.
pub ident: Ident,
/// The `default`ness of this item.
/// This should only occur in syntactically well-formed code in associated contexts.
pub defaultness: Defaultness,
pub kind: K,
@ -2613,19 +2616,7 @@ pub type ForeignItemKind = AssocItemKind;
/// Represents associated items.
/// These include items in `impl` and `trait` definitions.
#[derive(Clone, RustcEncodable, RustcDecodable, Debug)]
pub struct AssocItem {
pub attrs: Vec<Attribute>,
pub id: NodeId,
pub span: Span,
pub vis: Visibility,
pub ident: Ident,
pub defaultness: Defaultness,
pub kind: AssocItemKind,
/// See `Item::tokens` for what this is.
pub tokens: Option<TokenStream>,
}
pub type AssocItem = Item<AssocItemKind>;
/// Represents non-free item kinds.
///

View File

@ -722,6 +722,6 @@ macro_rules! derive_has_attrs {
}
derive_has_attrs! {
Item, Expr, Local, ast::ForeignItem, ast::StructField, ast::AssocItem, ast::Arm,
Item, Expr, Local, ast::ForeignItem, ast::StructField, ast::Arm,
ast::Field, ast::FieldPat, ast::Variant, ast::Param, GenericParam
}

View File

@ -948,8 +948,7 @@ pub fn noop_flat_map_assoc_item<T: MutVisitor>(
mut item: P<AssocItem>,
visitor: &mut T,
) -> SmallVec<[P<AssocItem>; 1]> {
let AssocItem { id, ident, vis, defaultness: _, attrs, kind, span, tokens: _ } =
item.deref_mut();
let Item { id, ident, vis, defaultness: _, attrs, kind, span, tokens: _ } = item.deref_mut();
walk_nested_item(visitor, id, span, ident, vis, attrs, kind);
smallvec![item]
}
@ -1004,6 +1003,7 @@ pub fn noop_visit_crate<T: MutVisitor>(krate: &mut Crate, vis: &mut T) {
attrs,
id: DUMMY_NODE_ID,
vis: respan(span.shrink_to_lo(), VisibilityKind::Public),
defaultness: Defaultness::Final,
span,
kind: ItemKind::Mod(module),
tokens: None,
@ -1031,7 +1031,7 @@ pub fn noop_flat_map_item<T: MutVisitor>(
mut item: P<Item>,
visitor: &mut T,
) -> SmallVec<[P<Item>; 1]> {
let Item { ident, attrs, id, kind, vis, span, tokens: _ } = item.deref_mut();
let Item { ident, attrs, id, kind, vis, defaultness: _, span, tokens: _ } = item.deref_mut();
visitor.visit_ident(ident);
visit_attrs(attrs, visitor);
visitor.visit_id(id);
@ -1049,7 +1049,7 @@ pub fn noop_flat_map_foreign_item<T: MutVisitor>(
mut item: P<ForeignItem>,
visitor: &mut T,
) -> SmallVec<[P<ForeignItem>; 1]> {
let ForeignItem { ident, attrs, id, kind, vis, span, tokens: _ } = item.deref_mut();
let Item { ident, attrs, id, kind, vis, defaultness: _, span, tokens: _ } = item.deref_mut();
walk_nested_item(visitor, id, span, ident, vis, attrs, kind);
smallvec![item]
}

View File

@ -526,7 +526,7 @@ pub fn walk_pat<'a, V: Visitor<'a>>(visitor: &mut V, pattern: &'a Pat) {
}
pub fn walk_foreign_item<'a, V: Visitor<'a>>(visitor: &mut V, item: &'a ForeignItem) {
let ForeignItem { id, span, ident, vis, attrs, kind, tokens: _ } = item;
let ForeignItem { id, span, ident, vis, defaultness: _, attrs, kind, tokens: _ } = item;
walk_nested_item(visitor, *id, *span, *ident, vis, attrs, kind, FnCtxt::Foreign);
}

View File

@ -1 +1 @@
{"module":{"inner":{"lo":0,"hi":0},"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":{"_field0":[[{"variant":"Token","fields":[{"kind":{"variant":"Ident","fields":["extern",false]},"span":{"lo":0,"hi":0}}]},"NonJoint"],[{"variant":"Token","fields":[{"kind":{"variant":"Ident","fields":["crate",false]},"span":{"lo":0,"hi":0}}]},"NonJoint"],[{"variant":"Token","fields":[{"kind":{"variant":"Ident","fields":["core",false]},"span":{"lo":0,"hi":0}}]},"NonJoint"],[{"variant":"Token","fields":[{"kind":"Semi","span":{"lo":0,"hi":0}}]},"NonJoint"]]}}],"inline":true},"attrs":[],"span":{"lo":0,"hi":0},"proc_macros":[]}
{"module":{"inner":{"lo":0,"hi":0},"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}},"defaultness":"Final","kind":{"variant":"ExternCrate","fields":[null]},"tokens":{"_field0":[[{"variant":"Token","fields":[{"kind":{"variant":"Ident","fields":["extern",false]},"span":{"lo":0,"hi":0}}]},"NonJoint"],[{"variant":"Token","fields":[{"kind":{"variant":"Ident","fields":["crate",false]},"span":{"lo":0,"hi":0}}]},"NonJoint"],[{"variant":"Token","fields":[{"kind":{"variant":"Ident","fields":["core",false]},"span":{"lo":0,"hi":0}}]},"NonJoint"],[{"variant":"Token","fields":[{"kind":"Semi","span":{"lo":0,"hi":0}}]},"NonJoint"]]}}],"inline":true},"attrs":[],"span":{"lo":0,"hi":0},"proc_macros":[]}