syntax: correct the modifications to deriving(Ord) so that it works.
This commit is contained in:
parent
ebf7281b7b
commit
a965f4981a
|
@ -22,7 +22,7 @@ pub fn expand_deriving_ord(cx: @ExtCtxt,
|
||||||
mitem: @meta_item,
|
mitem: @meta_item,
|
||||||
in_items: ~[@item]) -> ~[@item] {
|
in_items: ~[@item]) -> ~[@item] {
|
||||||
macro_rules! md (
|
macro_rules! md (
|
||||||
($name:expr, $func:expr, $op:expr) => {
|
($name:expr, $op:expr, $equal:expr) => {
|
||||||
MethodDef {
|
MethodDef {
|
||||||
name: $name,
|
name: $name,
|
||||||
generics: LifetimeBounds::empty(),
|
generics: LifetimeBounds::empty(),
|
||||||
|
@ -30,7 +30,7 @@ pub fn expand_deriving_ord(cx: @ExtCtxt,
|
||||||
args: ~[borrowed_self()],
|
args: ~[borrowed_self()],
|
||||||
ret_ty: Literal(Path::new(~["bool"])),
|
ret_ty: Literal(Path::new(~["bool"])),
|
||||||
const_nonmatching: false,
|
const_nonmatching: false,
|
||||||
combine_substructure: |cx, span, substr| $func($op, cx, span, substr)
|
combine_substructure: |cx, span, substr| cs_op($op, $equal, cx, span, substr)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
@ -40,17 +40,17 @@ pub fn expand_deriving_ord(cx: @ExtCtxt,
|
||||||
additional_bounds: ~[],
|
additional_bounds: ~[],
|
||||||
generics: LifetimeBounds::empty(),
|
generics: LifetimeBounds::empty(),
|
||||||
methods: ~[
|
methods: ~[
|
||||||
md!("lt", cs_strict, true),
|
md!("lt", true, false),
|
||||||
md!("le", cs_nonstrict, true), // inverse operation
|
md!("le", true, true),
|
||||||
md!("gt", cs_strict, false),
|
md!("gt", false, false),
|
||||||
md!("ge", cs_nonstrict, false)
|
md!("ge", false, true)
|
||||||
]
|
]
|
||||||
};
|
};
|
||||||
trait_def.expand(cx, span, mitem, in_items)
|
trait_def.expand(cx, span, mitem, in_items)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Strict inequality.
|
/// Strict inequality.
|
||||||
fn cs_strict(less: bool, cx: @ExtCtxt, span: span, substr: &Substructure) -> @expr {
|
fn cs_op(less: bool, equal: bool, cx: @ExtCtxt, span: span, substr: &Substructure) -> @expr {
|
||||||
let op = if less {ast::lt} else {ast::gt};
|
let op = if less {ast::lt} else {ast::gt};
|
||||||
cs_fold(
|
cs_fold(
|
||||||
false, // need foldr,
|
false, // need foldr,
|
||||||
|
@ -81,16 +81,15 @@ fn cs_strict(less: bool, cx: @ExtCtxt, span: span, substr: &Substructure) -> @ex
|
||||||
cx.expr_deref(span, self_f),
|
cx.expr_deref(span, self_f),
|
||||||
cx.expr_deref(span, other_f));
|
cx.expr_deref(span, other_f));
|
||||||
|
|
||||||
let not_cmp = cx.expr_binary(span, op,
|
let not_cmp = cx.expr_unary(span, ast::not,
|
||||||
cx.expr_deref(span, other_f),
|
cx.expr_binary(span, op,
|
||||||
cx.expr_deref(span, self_f));
|
cx.expr_deref(span, other_f),
|
||||||
let not_cmp = cx.expr_unary(span, ast::not, not_cmp);
|
cx.expr_deref(span, self_f)));
|
||||||
|
|
||||||
let and = cx.expr_binary(span, ast::and,
|
let and = cx.expr_binary(span, ast::and, not_cmp, subexpr);
|
||||||
not_cmp, subexpr);
|
|
||||||
cx.expr_binary(span, ast::or, cmp, and)
|
cx.expr_binary(span, ast::or, cmp, and)
|
||||||
},
|
},
|
||||||
cx.expr_bool(span, false),
|
cx.expr_bool(span, equal),
|
||||||
|cx, span, args, _| {
|
|cx, span, args, _| {
|
||||||
// nonmatching enums, order by the order the variants are
|
// nonmatching enums, order by the order the variants are
|
||||||
// written
|
// written
|
||||||
|
@ -108,19 +107,3 @@ fn cs_strict(less: bool, cx: @ExtCtxt, span: span, substr: &Substructure) -> @ex
|
||||||
},
|
},
|
||||||
cx, span, substr)
|
cx, span, substr)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn cs_nonstrict(less: bool, cx: @ExtCtxt, span: span, substr: &Substructure) -> @expr {
|
|
||||||
// Example: ge becomes !(*self < *other), le becomes !(*self > *other)
|
|
||||||
|
|
||||||
let inverse_op = if less {ast::gt} else {ast::lt};
|
|
||||||
match substr.self_args {
|
|
||||||
[self_, other] => {
|
|
||||||
let inverse_cmp = cx.expr_binary(span, inverse_op,
|
|
||||||
cx.expr_deref(span, self_),
|
|
||||||
cx.expr_deref(span, other));
|
|
||||||
|
|
||||||
cx.expr_unary(span, ast::not, inverse_cmp)
|
|
||||||
}
|
|
||||||
_ => cx.span_bug(span, "Not exactly 2 arguments in `deriving(Ord)`")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
Loading…
Reference in New Issue