From 9705f97ead1bdb5863e82a31c315113efd9c1c68 Mon Sep 17 00:00:00 2001 From: Lindsey Kuper Date: Fri, 29 Jul 2011 10:31:52 -0700 Subject: [PATCH] Typechecking bugfix for anon objs. Removes duplicate methods in outer object types. --- src/comp/middle/typeck.rs | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/comp/middle/typeck.rs b/src/comp/middle/typeck.rs index a3a2fbec25b2..0b0fcff4615e 100644 --- a/src/comp/middle/typeck.rs +++ b/src/comp/middle/typeck.rs @@ -2417,6 +2417,26 @@ fn check_expr(fcx: &@fn_ctxt, expr: &@ast::expr) { ~[anon_obj(ivec::map(ast::obj_field_from_anon_obj_field, fields), inner_obj_sty)]; + // Whenever an outer method overrides an inner, we need to remove + // that inner from the type. Filter inner_obj_methods to remove + // any methods that share a name with an outer method. + fn filtering_fn(m: &ty::method, + outer_obj_methods: (@ast::method)[]) -> + option::t[ty::method] { + + for om: @ast::method in outer_obj_methods { + if str::eq(om.node.ident, m.ident) { + ret none; + } + } + ret some(m); + } + + let f = bind filtering_fn(_, ao.methods); + inner_obj_methods = + std::ivec::filter_map[ty::method, + ty::method](f, inner_obj_methods); + methods += inner_obj_methods; ret methods; }