Added support for struct-like enum variants in middle::ty::enum_variants().
This commit is contained in:
parent
ab34864a30
commit
866a5b1c78
@ -3816,41 +3816,62 @@ pub fn enum_variants(cx: ctxt, id: ast::def_id) -> @~[VariantInfo] {
|
|||||||
}, _) => {
|
}, _) => {
|
||||||
let mut disr_val = -1;
|
let mut disr_val = -1;
|
||||||
@enum_definition.variants.iter().transform(|variant| {
|
@enum_definition.variants.iter().transform(|variant| {
|
||||||
|
|
||||||
|
let ctor_ty = node_id_to_type(cx, variant.node.id);
|
||||||
|
|
||||||
match variant.node.kind {
|
match variant.node.kind {
|
||||||
ast::tuple_variant_kind(ref args) => {
|
ast::tuple_variant_kind(ref args) => {
|
||||||
let ctor_ty = node_id_to_type(cx, variant.node.id);
|
let arg_tys = if args.len() > 0u {
|
||||||
let arg_tys = {
|
ty_fn_args(ctor_ty).map(|a| *a) }
|
||||||
if args.len() > 0u {
|
else {
|
||||||
ty_fn_args(ctor_ty).map(|a| *a)
|
|
||||||
} else {
|
|
||||||
~[]
|
~[]
|
||||||
}
|
};
|
||||||
};
|
|
||||||
match variant.node.disr_expr {
|
match variant.node.disr_expr {
|
||||||
Some (ex) => {
|
Some (ex) => {
|
||||||
disr_val = match const_eval::eval_const_expr(cx,
|
disr_val = match const_eval::eval_const_expr(cx,
|
||||||
ex) {
|
ex) {
|
||||||
const_eval::const_int(val) => val as int,
|
const_eval::const_int(val) => val as int,
|
||||||
_ => cx.sess.bug("tag_variants: bad disr expr")
|
_ => cx.sess.bug("enum_variants: bad disr expr")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
_ => disr_val += 1
|
_ => disr_val += 1
|
||||||
}
|
}
|
||||||
@VariantInfo_{args: arg_tys,
|
@VariantInfo_{
|
||||||
ctor_ty: ctor_ty,
|
args: arg_tys,
|
||||||
name: variant.node.name,
|
ctor_ty: ctor_ty,
|
||||||
id: ast_util::local_def(variant.node.id),
|
name: variant.node.name,
|
||||||
disr_val: disr_val,
|
id: ast_util::local_def(variant.node.id),
|
||||||
vis: variant.node.vis
|
disr_val: disr_val,
|
||||||
|
vis: variant.node.vis
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
ast::struct_variant_kind(_) => {
|
ast::struct_variant_kind(struct_def) => {
|
||||||
fail!("struct variant kinds unimpl in enum_variants")
|
let arg_tys =
|
||||||
|
// Is this check needed for structs too, or are they always guaranteed
|
||||||
|
// to have a valid constructor function?
|
||||||
|
if struct_def.fields.len() > 0 {
|
||||||
|
ty_fn_args(ctor_ty).map(|a| *a)
|
||||||
|
} else {
|
||||||
|
~[]
|
||||||
|
};
|
||||||
|
|
||||||
|
assert!(variant.node.disr_expr.is_none());
|
||||||
|
disr_val += 1;
|
||||||
|
|
||||||
|
@VariantInfo_{
|
||||||
|
args: arg_tys,
|
||||||
|
ctor_ty: ctor_ty,
|
||||||
|
name: variant.node.name,
|
||||||
|
id: ast_util::local_def(variant.node.id),
|
||||||
|
disr_val: disr_val,
|
||||||
|
vis: variant.node.vis
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}).collect()
|
}).collect()
|
||||||
}
|
}
|
||||||
_ => cx.sess.bug("tag_variants: id not bound to an enum")
|
_ => cx.sess.bug("enum_variants: id not bound to an enum")
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
cx.enum_var_cache.insert(id, result);
|
cx.enum_var_cache.insert(id, result);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user