Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
56 changes: 0 additions & 56 deletions compiler/rustc_builtin_macros/src/deriving/bounds.rs

This file was deleted.

57 changes: 26 additions & 31 deletions compiler/rustc_builtin_macros/src/deriving/clone.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
use rustc_ast::{self as ast, Generics, ItemKind, MetaItem, Safety, VariantData};
use rustc_data_structures::fx::FxHashSet;
use rustc_expand::base::{Annotatable, ExtCtxt};
use rustc_expand::base::ExtCtxt;
use rustc_span::{DUMMY_SP, Ident, Span, kw, sym};
use thin_vec::{ThinVec, thin_vec};

Expand All @@ -12,8 +12,8 @@ pub(crate) fn expand_deriving_clone(
cx: &ExtCtxt<'_>,
span: Span,
mitem: &MetaItem,
item: &Annotatable,
push: &mut dyn FnMut(Annotatable),
item: &ast::Item,
push: &mut dyn FnMut(Box<ast::Item>),
is_const: bool,
) {
// The simple form is `fn clone(&self) -> Self { *self }`, possibly with
Expand All @@ -32,35 +32,30 @@ pub(crate) fn expand_deriving_clone(
let bounds;
let substructure;
let is_simple;
match item {
Annotatable::Item(annitem) => match &annitem.kind {
ItemKind::Struct(_, Generics { params, .. }, _)
| ItemKind::Enum(_, Generics { params, .. }, _) => {
let container_id = cx.current_expansion.id.expn_data().parent.expect_local();
let has_derive_copy = cx.resolver.has_derive_copy(container_id);
bounds = smallvec![];
if has_derive_copy
&& !params
.iter()
.any(|param| matches!(param.kind, ast::GenericParamKind::Type { .. }))
{
is_simple = true;
substructure =
combine_substructure(|c, s, sub| cs_clone_simple(c, s, sub, false));
} else {
is_simple = false;
substructure = combine_substructure(cs_clone);
}
}
ItemKind::Union(..) => {
bounds = smallvec![Path(path_std!(marker::Copy))];
match &item.kind {
ItemKind::Struct(_, Generics { params, .. }, _)
| ItemKind::Enum(_, Generics { params, .. }, _) => {
let container_id = cx.current_expansion.id.expn_data().parent.expect_local();
let has_derive_copy = cx.resolver.has_derive_copy(container_id);
bounds = smallvec![];
if has_derive_copy
&& !params
.iter()
.any(|param| matches!(param.kind, ast::GenericParamKind::Type { .. }))
{
is_simple = true;
substructure = combine_substructure(|c, s, sub| cs_clone_simple(c, s, sub, true));
substructure = combine_substructure(|c, s, sub| cs_clone_simple(c, s, sub, false));
} else {
is_simple = false;
substructure = combine_substructure(cs_clone);
}
_ => cx.dcx().span_bug(span, "`#[derive(Clone)]` on wrong item kind"),
},

_ => cx.dcx().span_bug(span, "`#[derive(Clone)]` on trait item or impl item"),
}
ItemKind::Union(..) => {
bounds = smallvec![Path(path_std!(marker::Copy))];
is_simple = true;
substructure = combine_substructure(|c, s, sub| cs_clone_simple(c, s, sub, true));
}
_ => cx.dcx().span_bug(span, "`#[derive(Clone)]` on wrong item kind"),
}

// If the clone method is just copying the value, also mark the type as
Expand All @@ -82,7 +77,7 @@ pub(crate) fn expand_deriving_clone(
document: false,
};

trivial_def.expand_ext(cx, mitem, item, push, true);
trivial_def.expand(cx, mitem, item, push);
}

let trait_def = TraitDef {
Expand Down
20 changes: 9 additions & 11 deletions compiler/rustc_builtin_macros/src/deriving/coerce_pointee.rs
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
use ast::HasAttrs;
use rustc_ast::mut_visit::MutVisitor;
use rustc_ast::visit::BoundKind;
use rustc_ast::visit::{BoundKind, Visitor};
use rustc_ast::{
self as ast, GenericArg, GenericBound, GenericParamKind, Generics, ItemKind, MetaItem,
TraitBoundModifiers, VariantData, WherePredicate,
};
use rustc_data_structures::flat_map_in_place::FlatMapInPlace;
use rustc_errors::E0802;
use rustc_expand::base::{Annotatable, ExtCtxt};
use rustc_expand::base::ExtCtxt;
use rustc_macros::Diagnostic;
use rustc_span::{Ident, Span, Symbol, sym};
use thin_vec::{ThinVec, thin_vec};
Expand All @@ -22,15 +22,13 @@ pub(crate) fn expand_deriving_coerce_pointee(
cx: &ExtCtxt<'_>,
span: Span,
_mitem: &MetaItem,
item: &Annotatable,
push: &mut dyn FnMut(Annotatable),
item: &ast::Item,
push: &mut dyn FnMut(Box<ast::Item>),
_is_const: bool,
) {
item.visit_with(&mut DetectNonGenericPointeeAttr { cx });
DetectNonGenericPointeeAttr { cx }.visit_item(item);

let (name_ident, generics) = if let Annotatable::Item(aitem) = item
&& let ItemKind::Struct(ident, g, struct_data) = &aitem.kind
{
let (name_ident, generics) = if let ItemKind::Struct(ident, g, struct_data) = &item.kind {
if !matches!(
struct_data,
VariantData::Struct { fields, recovered: _ } | VariantData::Tuple(fields, _)
Expand Down Expand Up @@ -104,7 +102,7 @@ pub(crate) fn expand_deriving_coerce_pointee(
let trait_path =
cx.path_all(span, true, path!(span, core::marker::CoercePointeeValidated), vec![]);
let trait_ref = cx.trait_ref(trait_path);
push(Annotatable::Item(
push(
cx.item(
span,
attrs.clone(),
Expand Down Expand Up @@ -144,7 +142,7 @@ pub(crate) fn expand_deriving_coerce_pointee(
items: ThinVec::new(),
}),
),
));
);
}
let mut add_impl_block = |generics, trait_symbol, trait_args| {
let mut parts = path!(span, core::ops);
Expand All @@ -167,7 +165,7 @@ pub(crate) fn expand_deriving_coerce_pointee(
items: ThinVec::new(),
}),
);
push(Annotatable::Item(item));
push(item);
};

// Create unsized `self`, that is, one where the `#[pointee]` type arg is replaced with `__S`. For
Expand Down
31 changes: 31 additions & 0 deletions compiler/rustc_builtin_macros/src/deriving/const_param_ty.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
use rustc_ast::{MetaItem, Safety};
use rustc_expand::base::ExtCtxt;
use rustc_span::Span;

use crate::deriving::generic::*;
use crate::deriving::path_std;

pub(crate) fn expand_deriving_const_param_ty(
cx: &ExtCtxt<'_>,
span: Span,
mitem: &MetaItem,
item: &ast::Item,
push: &mut dyn FnMut(Box<ast::Item>),
is_const: bool,
) {
let trait_def = TraitDef {
span,
path: path_std!(marker::ConstParamTy_),
skip_path_as_bound: false,
needs_copy_as_bound_if_packed: false,
additional_bounds: smallvec![ty::Ty::Path(path_std!(cmp::Eq))],
supports_unions: false,
methods: SmallVec::new(),
associated_types: SmallVec::new(),
is_const,
safety: Safety::Default,
document: true,
};

trait_def.expand(cx, mitem, item, push);
}
31 changes: 31 additions & 0 deletions compiler/rustc_builtin_macros/src/deriving/copy.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
use rustc_ast::{MetaItem, Safety};
use rustc_expand::base::ExtCtxt;
use rustc_span::Span;

use crate::deriving::generic::*;
use crate::deriving::path_std;

pub(crate) fn expand_deriving_copy(
cx: &ExtCtxt<'_>,
span: Span,
mitem: &MetaItem,
item: &ast::Item,
push: &mut dyn FnMut(Box<ast::Item>),
is_const: bool,
) {
let trait_def = TraitDef {
span,
path: path_std!(marker::Copy),
skip_path_as_bound: false,
needs_copy_as_bound_if_packed: false,
additional_bounds: SmallVec::new(),
supports_unions: true,
methods: SmallVec::new(),
associated_types: SmallVec::new(),
is_const,
safety: Safety::Default,
document: true,
};

trait_def.expand(cx, mitem, item, push);
}
6 changes: 3 additions & 3 deletions compiler/rustc_builtin_macros/src/deriving/debug.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
use rustc_ast::{self as ast, EnumDef, ExprKind, MetaItem, Safety, TyKind, token};
use rustc_expand::base::{Annotatable, ExtCtxt};
use rustc_expand::base::ExtCtxt;
use rustc_session::config::FmtDebug;
use rustc_span::{Ident, Span, Symbol, sym};
use thin_vec::{ThinVec, thin_vec};
Expand All @@ -12,8 +12,8 @@ pub(crate) fn expand_deriving_debug(
cx: &ExtCtxt<'_>,
span: Span,
mitem: &MetaItem,
item: &Annotatable,
push: &mut dyn FnMut(Annotatable),
item: &ast::Item,
push: &mut dyn FnMut(Box<ast::Item>),
is_const: bool,
) {
// &mut ::std::fmt::Formatter
Expand Down
56 changes: 32 additions & 24 deletions compiler/rustc_builtin_macros/src/deriving/default.rs
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
use core::ops::ControlFlow;

use rustc_ast::visit::visit_opt;
use rustc_ast::visit::{Visitor, visit_opt};
use rustc_ast::{self as ast, EnumDef, Safety, VariantData, attr};
use rustc_expand::base::{Annotatable, DummyResult, ExtCtxt};
use rustc_expand::base::{DummyResult, ExtCtxt};
use rustc_span::{ErrorGuaranteed, Ident, Span, kw, sym};
use smallvec::SmallVec;
use thin_vec::{ThinVec, thin_vec};
Expand All @@ -15,11 +15,11 @@ pub(crate) fn expand_deriving_default(
cx: &ExtCtxt<'_>,
span: Span,
mitem: &ast::MetaItem,
item: &Annotatable,
push: &mut dyn FnMut(Annotatable),
item: &ast::Item,
push: &mut dyn FnMut(Box<ast::Item>),
is_const: bool,
) {
item.visit_with(&mut DetectNonVariantDefaultAttr { cx });
DetectNonVariantDefaultAttr { cx }.visit_item(item);

let trait_def = TraitDef {
span,
Expand All @@ -38,11 +38,11 @@ pub(crate) fn expand_deriving_default(
fieldless_variants_strategy: FieldlessVariantsStrategy::Default,
combine_substructure: combine_substructure(|cx, trait_span, substr| {
match substr.fields {
StaticStruct(_, fields) => {
default_struct_substructure(cx, trait_span, substr, fields)
StaticStruct(variant_data) => {
default_struct_substructure(cx, trait_span, substr, variant_data)
}
StaticEnum(enum_def) => {
default_enum_substructure(cx, trait_span, enum_def, item.span())
default_enum_substructure(cx, trait_span, enum_def, item.span)
}
_ => cx.dcx().span_bug(trait_span, "method in `derive(Default)`"),
}
Expand All @@ -66,27 +66,35 @@ fn default_struct_substructure(
cx: &ExtCtxt<'_>,
trait_span: Span,
substr: &Substructure<'_>,
summary: &StaticFields<'_>,
variant_data: &VariantData,
) -> BlockOrExpr {
let expr = match summary {
Unnamed(_, IsTuple::No) => cx.expr_ident(trait_span, substr.type_ident),
Unnamed(fields, IsTuple::Yes) => {
let exprs = fields.iter().map(|sp| default_call(cx, *sp)).collect();
let expr = match variant_data {
VariantData::Unit(_) => cx.expr_ident(trait_span, substr.type_ident),
VariantData::Tuple(fields, _) => {
let exprs = fields
.iter()
.map(|field| default_call(cx, field.span.with_ctxt(trait_span.ctxt())))
.collect();
cx.expr_call_ident(trait_span, substr.type_ident, exprs)
}
Named(fields) => {
VariantData::Struct { fields, .. } => {
let default_fields = fields
.iter()
.map(|&(ident, span, default_val)| {
let value = match default_val {
// We use `Default::default()`.
None => default_call(cx, span),
.map(|field| {
let span = field.span.with_ctxt(trait_span.ctxt());
let value = if let Some(extras) = &field.extras
&& let Some(default_val) = &extras.default
{
// We use the field default const expression.
Some(val) => {
cx.expr(val.value.span, ast::ExprKind::ConstBlock(val.clone()))
}
cx.expr(
default_val.value.span,
ast::ExprKind::ConstBlock(default_val.clone()),
)
} else {
// We use `Default::default()`.
default_call(cx, span)
};
cx.field_imm(span, ident, value)
cx.field_imm(span, field.ident.unwrap(), value)
})
.collect();
cx.expr_struct_ident(trait_span, substr.type_ident, default_fields)
Expand Down Expand Up @@ -308,7 +316,7 @@ impl<'a, 'b> rustc_ast::visit::Visitor<'a> for DetectNonVariantDefaultAttr<'a, '
}
}

fn has_a_default_variant(item: &Annotatable) -> bool {
fn has_a_default_variant(item: &ast::Item) -> bool {
struct HasDefaultAttrOnVariant;

impl<'ast> rustc_ast::visit::Visitor<'ast> for HasDefaultAttrOnVariant {
Expand All @@ -323,5 +331,5 @@ fn has_a_default_variant(item: &Annotatable) -> bool {
}
}

item.visit_with(&mut HasDefaultAttrOnVariant).is_break()
HasDefaultAttrOnVariant.visit_item(item).is_break()
}
Loading
Loading