]>
git.proxmox.com Git - rustc.git/blob - src/libsyntax/ext/deriving/cmp/partial_eq.rs
5d744334745d32e9c17bb6394a15df3d19b33623
1 // Copyright 2013 The Rust Project Developers. See the COPYRIGHT
2 // file at the top-level directory of this distribution and at
3 // http://rust-lang.org/COPYRIGHT.
5 // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6 // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7 // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8 // option. This file may not be copied, modified, or distributed
9 // except according to those terms.
11 use ast
::{MetaItem, Expr, self}
;
13 use ext
::base
::{ExtCtxt, Annotatable}
;
14 use ext
::build
::AstBuilder
;
15 use ext
::deriving
::generic
::*;
16 use ext
::deriving
::generic
::ty
::*;
17 use parse
::token
::InternedString
;
20 pub fn expand_deriving_partial_eq(cx
: &mut ExtCtxt
,
24 push
: &mut FnMut(Annotatable
))
26 // structures are equal if all fields are equal, and non equal, if
27 // any fields are not equal or if the enum variants are different
28 fn cs_eq(cx
: &mut ExtCtxt
, span
: Span
, substr
: &Substructure
) -> P
<Expr
> {
31 |cx
, span
, subexpr
, self_f
, other_fs
| {
32 let other_f
= match (other_fs
.len(), other_fs
.get(0)) {
33 (1, Some(o_f
)) => o_f
,
34 _
=> cx
.span_bug(span
, "not exactly 2 arguments in `derive(PartialEq)`")
37 let eq
= cx
.expr_binary(span
, ast
::BiEq
, self_f
, other_f
.clone());
39 cx
.expr_binary(span
, ast
::BiAnd
, subexpr
, eq
)
41 cx
.expr_bool(span
, true),
42 Box
::new(|cx
, span
, _
, _
| cx
.expr_bool(span
, false)),
45 fn cs_ne(cx
: &mut ExtCtxt
, span
: Span
, substr
: &Substructure
) -> P
<Expr
> {
48 |cx
, span
, subexpr
, self_f
, other_fs
| {
49 let other_f
= match (other_fs
.len(), other_fs
.get(0)) {
50 (1, Some(o_f
)) => o_f
,
51 _
=> cx
.span_bug(span
, "not exactly 2 arguments in `derive(PartialEq)`")
54 let eq
= cx
.expr_binary(span
, ast
::BiNe
, self_f
, other_f
.clone());
56 cx
.expr_binary(span
, ast
::BiOr
, subexpr
, eq
)
58 cx
.expr_bool(span
, false),
59 Box
::new(|cx
, span
, _
, _
| cx
.expr_bool(span
, true)),
64 ($name
:expr
, $f
:ident
) => { {
65 let inline
= cx
.meta_word(span
, InternedString
::new("inline"));
66 let attrs
= vec
!(cx
.attribute(span
, inline
));
69 generics
: LifetimeBounds
::empty(),
70 explicit_self
: borrowed_explicit_self(),
71 args
: vec
!(borrowed_self()),
72 ret_ty
: Literal(path_local
!(bool
)),
74 combine_substructure
: combine_substructure(Box
::new(|a
, b
, c
| {
81 let trait_def
= TraitDef
{
83 attributes
: Vec
::new(),
84 path
: path_std
!(cx
, core
::cmp
::PartialEq
),
85 additional_bounds
: Vec
::new(),
86 generics
: LifetimeBounds
::empty(),
91 associated_types
: Vec
::new(),
93 trait_def
.expand(cx
, mitem
, &item
, push
)