aboutsummaryrefslogtreecommitdiff
path: root/src/comp
diff options
context:
space:
mode:
authorGraydon Hoare <[email protected]>2010-12-30 17:00:59 -0800
committerGraydon Hoare <[email protected]>2010-12-30 17:00:59 -0800
commit9676fb2d0ad8867aa90d946deb23fd6c5dd33bce (patch)
tree88d50eb2b74f58bd814c7cb0d2f9152238338a36 /src/comp
parentTeach typeck to check obj field accesses. (diff)
downloadrust-9676fb2d0ad8867aa90d946deb23fd6c5dd33bce.tar.xz
rust-9676fb2d0ad8867aa90d946deb23fd6c5dd33bce.zip
Assign method types properly by sorted-order.
Diffstat (limited to 'src/comp')
-rw-r--r--src/comp/middle/typeck.rs20
1 files changed, 12 insertions, 8 deletions
diff --git a/src/comp/middle/typeck.rs b/src/comp/middle/typeck.rs
index b5cc5e76..229a15bb 100644
--- a/src/comp/middle/typeck.rs
+++ b/src/comp/middle/typeck.rs
@@ -164,7 +164,8 @@ fn ast_ty_to_ty_crate(@crate_ctxt ccx, &@ast.ty ast_ty) -> @ty.t {
// We then annotate the AST with the resulting types and return the annotated
// AST, along with a table mapping item IDs to their types.
-fn collect_item_types(@ast.crate crate) -> tup(@ast.crate, @ty_table) {
+fn collect_item_types(session.session sess, @ast.crate crate)
+ -> tup(@ast.crate, @ty_table) {
type ty_item_table = hashmap[ast.def_id,@ast.item];
@@ -344,9 +345,11 @@ fn collect_item_types(@ast.crate crate) -> tup(@ast.crate, @ty_table) {
// Second pass: translate the types of all items.
let @ty_table item_to_ty = @common.new_def_hash[@ty.t]();
- type env = rec(@ty_item_table id_to_ty_item,
+ type env = rec(session.session sess,
+ @ty_item_table id_to_ty_item,
@ty_table item_to_ty);
- let @env e = @rec(id_to_ty_item=id_to_ty_item,
+ let @env e = @rec(sess=sess,
+ id_to_ty_item=id_to_ty_item,
item_to_ty=item_to_ty);
fn convert(&@env e, @ast.item i) -> @env {
@@ -413,9 +416,11 @@ fn collect_item_types(@ast.crate crate) -> tup(@ast.crate, @ty_table) {
let vec[@ast.method] methods = vec();
let vec[ast.obj_field] fields = vec();
- let uint n = 0u;
- for (method meth_ty in meth_tys) {
- let @ast.method meth = ob.methods.(n);
+ for (@ast.method meth in ob.methods) {
+ let uint ix = ty.method_idx(e.sess,
+ sp, meth.node.ident,
+ meth_tys);
+ let method meth_ty = meth_tys.(ix);
let ast.method_ m_;
let @ast.method m;
auto meth_tfn = plain_ty(ty.ty_fn(meth_ty.inputs,
@@ -423,7 +428,6 @@ fn collect_item_types(@ast.crate crate) -> tup(@ast.crate, @ty_table) {
m_ = rec(ann=ast.ann_type(meth_tfn) with meth.node);
m = @rec(node=m_ with *meth);
append[@ast.method](methods, m);
- n += 1u;
}
auto g = bind getter(e.id_to_ty_item, e.item_to_ty, _);
for (ast.obj_field fld in ob.fields) {
@@ -1529,7 +1533,7 @@ fn update_obj_fields(&@crate_ctxt ccx, @ast.item i) -> @crate_ctxt {
}
fn check_crate(session.session sess, @ast.crate crate) -> @ast.crate {
- auto result = collect_item_types(crate);
+ auto result = collect_item_types(sess, crate);
let vec[ast.obj_field] fields = vec();