diff --git a/src/rustc/middle/resolve.rs b/src/rustc/middle/resolve.rs index fd0ecaa4fd5..78a0f1bfef7 100644 --- a/src/rustc/middle/resolve.rs +++ b/src/rustc/middle/resolve.rs @@ -573,7 +573,6 @@ fn visit_item_with_scope(e: @env, i: @ast::item, } ast::item_class(tps, ifaces, members, ctor, m_dtor, _) { v.visit_ty_params(tps, sc, v); - // Can maybe skip this now that we require self on class fields let class_scope = @cons(scope_item(i), sc); /* visit the constructor... */ let ctor_scope = @cons(scope_method(ctor.node.self_id, tps), @@ -1061,7 +1060,7 @@ fn lookup_in_scope(e: env, &&sc: scopes, sp: span, name: ident, ns: namespace, } ast::item_class(tps, _, members, ctor, _, _) { if ns == ns_type { - ret lookup_in_ty_params(e, name, tps); + ret lookup_in_ty_params(e, name, tps); } if ns == ns_val && name == it.ident { ret some(ast::def_fn(local_def(ctor.node.id), @@ -1317,13 +1316,14 @@ fn found_def_item(i: @ast::item, ns: namespace) -> option { alt i.node { ast::item_const(*) { if ns == ns_val { - ret some(ast::def_const(local_def(i.id))); } - } - ast::item_fn(decl, _, _) { - if ns == ns_val { - ret some(ast::def_fn(local_def(i.id), decl.purity)); + ret some(ast::def_const(local_def(i.id))); } } + ast::item_fn(decl, _, _) { + if ns == ns_val { + ret some(ast::def_fn(local_def(i.id), decl.purity)); + } + } ast::item_mod(_) { if ns == ns_module { ret some(ast::def_mod(local_def(i.id))); } } @@ -1342,9 +1342,16 @@ fn found_def_item(i: @ast::item, ns: namespace) -> option { _ { } } } - ast::item_class(*) { - if ns == ns_type { - ret some(ast::def_class(local_def(i.id))); + ast::item_class(_, _, _members, ct, _, _) { + alt ns { + ns_type { + ret some(ast::def_class(local_def(i.id))); + } + ns_val { + ret some(ast::def_fn(local_def(ct.node.id), + ast::impure_fn)); + } + ns_module { } } } ast::item_impl(*) { /* ??? */ } @@ -1653,14 +1660,6 @@ fn index_mod(md: ast::_mod) -> mod_index { ast::item_class(tps, _, items, ctor, _, _) { // add the class name itself add_to_index(index, it.ident, mie_item(it)); - // add the constructor decl - add_to_index(index, it.ident, - mie_item(@{ident: it.ident, attrs: [], - id: ctor.node.id, - node: - item_fn(ctor.node.dec, tps, ctor.node.body), - vis: ast::public, - span: ctor.node.body.span})); } } } diff --git a/src/test/run-pass/nested-class.rs b/src/test/run-pass/nested-class.rs new file mode 100644 index 00000000000..b0f62cc3ea9 --- /dev/null +++ b/src/test/run-pass/nested-class.rs @@ -0,0 +1,15 @@ +fn main() { + + class b { + let i: int; + fn do_stuff() -> int { ret 37; } + new(i:int) { self.i = i; } + } + + // fn b(x:int) -> int { fail; } + + let z = b(42); + assert(z.i == 42); + assert(z.do_stuff() == 37); + +} \ No newline at end of file