aboutsummaryrefslogtreecommitdiff
path: root/src/comp/middle
diff options
context:
space:
mode:
authorPatrick Walton <[email protected]>2010-12-01 15:27:38 -0800
committerPatrick Walton <[email protected]>2010-12-01 15:27:38 -0800
commitfd600bad4666758088ec69a355a0dbd86bb11c22 (patch)
tree5d5d69c08aa4635575da7b825a19c13298167640 /src/comp/middle
parentrustc: Typecheck tag constructors (diff)
downloadrust-fd600bad4666758088ec69a355a0dbd86bb11c22.tar.xz
rust-fd600bad4666758088ec69a355a0dbd86bb11c22.zip
rustc: Annotate variants with their types. This may be useful for trans!
Diffstat (limited to 'src/comp/middle')
-rw-r--r--src/comp/middle/fold.rs3
-rw-r--r--src/comp/middle/typeck.rs21
2 files changed, 17 insertions, 7 deletions
diff --git a/src/comp/middle/fold.rs b/src/comp/middle/fold.rs
index 458f9e95..48cb1e01 100644
--- a/src/comp/middle/fold.rs
+++ b/src/comp/middle/fold.rs
@@ -591,7 +591,8 @@ fn fold_item[ENV](&ENV env, ast_fold[ENV] fld, @item i) -> @item {
for (@ast.ty t in v.args) {
new_args += vec(fold_ty[ENV](env_, fld, t));
}
- new_variants += rec(name=v.name, args=new_args, id=v.id);
+ new_variants += rec(name=v.name, args=new_args, id=v.id,
+ ann=v.ann);
}
ret fld.fold_item_tag(env_, i.span, ident, new_variants,
ty_params, id);
diff --git a/src/comp/middle/typeck.rs b/src/comp/middle/typeck.rs
index d9e1494f..80bafb29 100644
--- a/src/comp/middle/typeck.rs
+++ b/src/comp/middle/typeck.rs
@@ -402,10 +402,12 @@ fn collect_item_types(@ast.crate crate) -> tup(@ast.crate, @ty_table) {
}
}
- fn add_tag_variant_types(@hashmap[ast.def_id,@ast.item] id_to_ty_item,
+ fn get_tag_variant_types(@hashmap[ast.def_id,@ast.item] id_to_ty_item,
@ty_table item_to_ty,
&ast.def_id tag_id,
- &vec[ast.variant] variants) {
+ &vec[ast.variant] variants) -> vec[ast.variant] {
+ let vec[ast.variant] result = vec();
+
for (ast.variant variant in variants) {
// Nullary tag constructors get turned into constants; n-ary tag
// constructors get turned into functions.
@@ -427,7 +429,12 @@ fn collect_item_types(@ast.crate crate) -> tup(@ast.crate, @ty_table) {
}
item_to_ty.insert(variant.id, result_ty);
+
+ auto variant_t = rec(ann=ast.ann_type(result_ty) with variant);
+ result += vec(variant_t);
}
+
+ ret result;
}
// First pass: collect all type item IDs.
@@ -463,10 +470,12 @@ fn collect_item_types(@ast.crate crate) -> tup(@ast.crate, @ty_table) {
case (ast.item_mod(_, _, _)) {
result = it.node;
}
- case (ast.item_tag(_, ?variants, _, ?tag_id)) {
- add_tag_variant_types(id_to_ty_item, item_to_ty, tag_id,
- variants);
- result = it.node;
+ case (ast.item_tag(?ident, ?variants, ?tps, ?tag_id)) {
+ auto variants_t = get_tag_variant_types(id_to_ty_item,
+ item_to_ty,
+ tag_id,
+ variants);
+ result = ast.item_tag(ident, variants_t, tps, tag_id);
}
}
items_t += vec(@fold.respan[ast.item_](it.span, result));