提交 32c9ffb9 编写于 作者: N Nicholas Nethercote

Clarify args terminology.

The deriving code has inconsistent terminology to describe args.

In some places it distinguishes between:
- the `&self` arg (if present), versus
- all other args.

In other places it distinguishes between:
- the `&self` arg (if present) and any other arguments with the same
  type (in practice there is at most one, e.g. in `PartialEq::eq`),
  versus
- all other args.

The terms "self_args" and "nonself_args" are sometimes used for the
former distinction, and sometimes for the latter. "args" is also
sometimes used for "all other args".

This commit makes the code consistently uses "self_args"/"nonself_args"
for the former and "selflike_args"/"nonselflike_args" for the latter.
This change makes the code easier to read.

The commit also adds a panic on an impossible path (the `Self_` case) in
`extract_arg_details`.
上级 052495d0
...@@ -80,7 +80,7 @@ pub fn expand_deriving_clone( ...@@ -80,7 +80,7 @@ pub fn expand_deriving_clone(
name: sym::clone, name: sym::clone,
generics: Bounds::empty(), generics: Bounds::empty(),
explicit_self: true, explicit_self: true,
args: Vec::new(), nonself_args: Vec::new(),
ret_ty: Self_, ret_ty: Self_,
attributes: attrs, attributes: attrs,
unify_fieldless_variants: false, unify_fieldless_variants: false,
......
...@@ -32,7 +32,7 @@ pub fn expand_deriving_eq( ...@@ -32,7 +32,7 @@ pub fn expand_deriving_eq(
name: sym::assert_receiver_is_total_eq, name: sym::assert_receiver_is_total_eq,
generics: Bounds::empty(), generics: Bounds::empty(),
explicit_self: true, explicit_self: true,
args: vec![], nonself_args: vec![],
ret_ty: Unit, ret_ty: Unit,
attributes: attrs, attributes: attrs,
unify_fieldless_variants: true, unify_fieldless_variants: true,
......
...@@ -28,7 +28,7 @@ pub fn expand_deriving_ord( ...@@ -28,7 +28,7 @@ pub fn expand_deriving_ord(
name: sym::cmp, name: sym::cmp,
generics: Bounds::empty(), generics: Bounds::empty(),
explicit_self: true, explicit_self: true,
args: vec![(self_ref(), sym::other)], nonself_args: vec![(self_ref(), sym::other)],
ret_ty: Path(path_std!(cmp::Ordering)), ret_ty: Path(path_std!(cmp::Ordering)),
attributes: attrs, attributes: attrs,
unify_fieldless_variants: true, unify_fieldless_variants: true,
......
...@@ -69,7 +69,7 @@ fn cs_ne(cx: &mut ExtCtxt<'_>, span: Span, substr: &Substructure<'_>) -> BlockOr ...@@ -69,7 +69,7 @@ fn cs_ne(cx: &mut ExtCtxt<'_>, span: Span, substr: &Substructure<'_>) -> BlockOr
name: $name, name: $name,
generics: Bounds::empty(), generics: Bounds::empty(),
explicit_self: true, explicit_self: true,
args: vec![(self_ref(), sym::other)], nonself_args: vec![(self_ref(), sym::other)],
ret_ty: Path(path_local!(bool)), ret_ty: Path(path_local!(bool)),
attributes: attrs, attributes: attrs,
unify_fieldless_variants: true, unify_fieldless_variants: true,
......
...@@ -26,7 +26,7 @@ pub fn expand_deriving_partial_ord( ...@@ -26,7 +26,7 @@ pub fn expand_deriving_partial_ord(
name: sym::partial_cmp, name: sym::partial_cmp,
generics: Bounds::empty(), generics: Bounds::empty(),
explicit_self: true, explicit_self: true,
args: vec![(self_ref(), sym::other)], nonself_args: vec![(self_ref(), sym::other)],
ret_ty, ret_ty,
attributes: attrs, attributes: attrs,
unify_fieldless_variants: true, unify_fieldless_variants: true,
......
...@@ -28,7 +28,7 @@ pub fn expand_deriving_debug( ...@@ -28,7 +28,7 @@ pub fn expand_deriving_debug(
name: sym::fmt, name: sym::fmt,
generics: Bounds::empty(), generics: Bounds::empty(),
explicit_self: true, explicit_self: true,
args: vec![(fmtr, sym::f)], nonself_args: vec![(fmtr, sym::f)],
ret_ty: Path(path_std!(fmt::Result)), ret_ty: Path(path_std!(fmt::Result)),
attributes: Vec::new(), attributes: Vec::new(),
unify_fieldless_variants: false, unify_fieldless_variants: false,
...@@ -53,7 +53,7 @@ fn show_substructure(cx: &mut ExtCtxt<'_>, span: Span, substr: &Substructure<'_> ...@@ -53,7 +53,7 @@ fn show_substructure(cx: &mut ExtCtxt<'_>, span: Span, substr: &Substructure<'_>
// We want to make sure we have the ctxt set so that we can use unstable methods // We want to make sure we have the ctxt set so that we can use unstable methods
let span = cx.with_def_site_ctxt(span); let span = cx.with_def_site_ctxt(span);
let name = cx.expr_lit(span, ast::LitKind::Str(ident.name, ast::StrStyle::Cooked)); let name = cx.expr_lit(span, ast::LitKind::Str(ident.name, ast::StrStyle::Cooked));
let fmt = substr.nonself_args[0].clone(); let fmt = substr.nonselflike_args[0].clone();
// Struct and tuples are similar enough that we use the same code for both, // Struct and tuples are similar enough that we use the same code for both,
// with some extra pieces for structs due to the field names. // with some extra pieces for structs due to the field names.
......
...@@ -36,7 +36,10 @@ pub fn expand_deriving_rustc_decodable( ...@@ -36,7 +36,10 @@ pub fn expand_deriving_rustc_decodable(
)], )],
}, },
explicit_self: false, explicit_self: false,
args: vec![(Ref(Box::new(Path(Path::new_local(typaram))), Mutability::Mut), sym::d)], nonself_args: vec![(
Ref(Box::new(Path(Path::new_local(typaram))), Mutability::Mut),
sym::d,
)],
ret_ty: Path(Path::new_( ret_ty: Path(Path::new_(
pathvec_std!(result::Result), pathvec_std!(result::Result),
vec![ vec![
...@@ -63,7 +66,7 @@ fn decodable_substructure( ...@@ -63,7 +66,7 @@ fn decodable_substructure(
substr: &Substructure<'_>, substr: &Substructure<'_>,
krate: Symbol, krate: Symbol,
) -> BlockOrExpr { ) -> BlockOrExpr {
let decoder = substr.nonself_args[0].clone(); let decoder = substr.nonselflike_args[0].clone();
let recurse = vec![ let recurse = vec![
Ident::new(krate, trait_span), Ident::new(krate, trait_span),
Ident::new(sym::Decodable, trait_span), Ident::new(sym::Decodable, trait_span),
......
...@@ -34,7 +34,7 @@ pub fn expand_deriving_default( ...@@ -34,7 +34,7 @@ pub fn expand_deriving_default(
name: kw::Default, name: kw::Default,
generics: Bounds::empty(), generics: Bounds::empty(),
explicit_self: false, explicit_self: false,
args: Vec::new(), nonself_args: Vec::new(),
ret_ty: Self_, ret_ty: Self_,
attributes: attrs, attributes: attrs,
unify_fieldless_variants: false, unify_fieldless_variants: false,
......
...@@ -120,7 +120,10 @@ pub fn expand_deriving_rustc_encodable( ...@@ -120,7 +120,10 @@ pub fn expand_deriving_rustc_encodable(
)], )],
}, },
explicit_self: true, explicit_self: true,
args: vec![(Ref(Box::new(Path(Path::new_local(typaram))), Mutability::Mut), sym::s)], nonself_args: vec![(
Ref(Box::new(Path(Path::new_local(typaram))), Mutability::Mut),
sym::s,
)],
ret_ty: Path(Path::new_( ret_ty: Path(Path::new_(
pathvec_std!(result::Result), pathvec_std!(result::Result),
vec![ vec![
...@@ -147,7 +150,7 @@ fn encodable_substructure( ...@@ -147,7 +150,7 @@ fn encodable_substructure(
substr: &Substructure<'_>, substr: &Substructure<'_>,
krate: Symbol, krate: Symbol,
) -> BlockOrExpr { ) -> BlockOrExpr {
let encoder = substr.nonself_args[0].clone(); let encoder = substr.nonselflike_args[0].clone();
// throw an underscore in front to suppress unused variable warnings // throw an underscore in front to suppress unused variable warnings
let blkarg = Ident::new(sym::_e, trait_span); let blkarg = Ident::new(sym::_e, trait_span);
let blkencoder = cx.expr_ident(trait_span, blkarg); let blkencoder = cx.expr_ident(trait_span, blkarg);
......
...@@ -30,7 +30,7 @@ pub fn expand_deriving_hash( ...@@ -30,7 +30,7 @@ pub fn expand_deriving_hash(
name: sym::hash, name: sym::hash,
generics: Bounds { bounds: vec![(typaram, vec![path_std!(hash::Hasher)])] }, generics: Bounds { bounds: vec![(typaram, vec![path_std!(hash::Hasher)])] },
explicit_self: true, explicit_self: true,
args: vec![(Ref(Box::new(Path(arg)), Mutability::Mut), sym::state)], nonself_args: vec![(Ref(Box::new(Path(arg)), Mutability::Mut), sym::state)],
ret_ty: Unit, ret_ty: Unit,
attributes: vec![], attributes: vec![],
unify_fieldless_variants: true, unify_fieldless_variants: true,
...@@ -49,7 +49,7 @@ fn hash_substructure( ...@@ -49,7 +49,7 @@ fn hash_substructure(
trait_span: Span, trait_span: Span,
substr: &Substructure<'_>, substr: &Substructure<'_>,
) -> BlockOrExpr { ) -> BlockOrExpr {
let [state_expr] = substr.nonself_args else { let [state_expr] = substr.nonselflike_args else {
cx.span_bug(trait_span, "incorrect number of arguments in `derive(Hash)`"); cx.span_bug(trait_span, "incorrect number of arguments in `derive(Hash)`");
}; };
let call_hash = |span, thing_expr| { let call_hash = |span, thing_expr| {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册