diff options
| author | Patrick Walton <pcwalton@mimiga.net> | 2012-10-22 17:57:10 -0700 |
|---|---|---|
| committer | Patrick Walton <pcwalton@mimiga.net> | 2012-10-23 10:45:23 -0700 |
| commit | 3bf0a9b0945f297d1aea330b6afcf98052e6de1e (patch) | |
| tree | 0908f3cc9095dbbc6b8aa508d3dac2c9b4a40afa /src/libsyntax | |
| parent | 575950d12c38d79dcb2cac906f6664325d10ec9d (diff) | |
| download | rust-3bf0a9b0945f297d1aea330b6afcf98052e6de1e.tar.gz rust-3bf0a9b0945f297d1aea330b6afcf98052e6de1e.zip | |
rustc: Implement typechecking for simple monomorphic derivable traits on monomorphic types. r=brson
Diffstat (limited to 'src/libsyntax')
| -rw-r--r-- | src/libsyntax/ast.rs | 2 | ||||
| -rw-r--r-- | src/libsyntax/ast_map.rs | 10 | ||||
| -rw-r--r-- | src/libsyntax/ext/auto_serialize.rs | 2 | ||||
| -rw-r--r-- | src/libsyntax/fold.rs | 6 | ||||
| -rw-r--r-- | src/libsyntax/parse/parser.rs | 19 | ||||
| -rw-r--r-- | src/libsyntax/print/pprust.rs | 17 | ||||
| -rw-r--r-- | src/libsyntax/visit.rs | 8 |
7 files changed, 42 insertions, 22 deletions
diff --git a/src/libsyntax/ast.rs b/src/libsyntax/ast.rs index a3d2fe96b5d..579699c9958 100644 --- a/src/libsyntax/ast.rs +++ b/src/libsyntax/ast.rs @@ -1508,7 +1508,7 @@ enum item_ { item_impl(~[ty_param], Option<@trait_ref>, /* (optional) trait this impl implements */ @Ty, /* self */ - ~[@method]), + Option<~[@method]>), item_mac(mac), } diff --git a/src/libsyntax/ast_map.rs b/src/libsyntax/ast_map.rs index 8555ceed2db..bcda838b248 100644 --- a/src/libsyntax/ast_map.rs +++ b/src/libsyntax/ast_map.rs @@ -202,11 +202,13 @@ fn map_item(i: @item, cx: ctx, v: vt) { let item_path = @/* FIXME (#2543) */ copy cx.path; cx.map.insert(i.id, node_item(i, item_path)); match i.node { - item_impl(_, _, _, ms) => { + item_impl(_, _, _, ms_opt) => { let impl_did = ast_util::local_def(i.id); - for ms.each |m| { - map_method(impl_did, extend(cx, i.ident), *m, - cx); + for ms_opt.each |ms| { + for ms.each |m| { + map_method(impl_did, extend(cx, i.ident), *m, + cx); + } } } item_enum(enum_definition, _) => { diff --git a/src/libsyntax/ext/auto_serialize.rs b/src/libsyntax/ext/auto_serialize.rs index 47e61c26f38..707787e78b9 100644 --- a/src/libsyntax/ext/auto_serialize.rs +++ b/src/libsyntax/ext/auto_serialize.rs @@ -398,7 +398,7 @@ fn mk_impl( ident: ast::token::special_idents::clownshoes_extensions, attrs: ~[], id: cx.next_id(), - node: ast::item_impl(trait_tps, opt_trait, ty, ~[f(ty)]), + node: ast::item_impl(trait_tps, opt_trait, ty, Some(~[f(ty)])), vis: ast::public, span: span, } diff --git a/src/libsyntax/fold.rs b/src/libsyntax/fold.rs index 311928dd4e0..7eb7b2853e3 100644 --- a/src/libsyntax/fold.rs +++ b/src/libsyntax/fold.rs @@ -248,11 +248,13 @@ fn noop_fold_item_underscore(i: item_, fld: ast_fold) -> item_ { let struct_def = fold_struct_def(struct_def, fld); item_class(struct_def, /* FIXME (#2543) */ copy typms) } - item_impl(tps, ifce, ty, methods) => { + item_impl(tps, ifce, ty, ref methods_opt) => { item_impl(fold_ty_params(tps, fld), ifce.map(|p| fold_trait_ref(*p, fld)), fld.fold_ty(ty), - vec::map(methods, |x| fld.fold_method(*x))) + option::map(methods_opt, + |methods| vec::map( + *methods, |x| fld.fold_method(*x)))) } item_trait(tps, traits, methods) => { item_trait(fold_ty_params(tps, fld), diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs index 925da063ca6..672f86b7a10 100644 --- a/src/libsyntax/parse/parser.rs +++ b/src/libsyntax/parse/parser.rs @@ -2603,13 +2603,20 @@ impl Parser { None }; - let mut meths = ~[]; - self.expect(token::LBRACE); - while !self.eat(token::RBRACE) { - let vis = self.parse_visibility(); - meths.push(self.parse_method(vis)); + let meths_opt; + if self.eat(token::SEMI) { + meths_opt = None; + } else { + let mut meths = ~[]; + self.expect(token::LBRACE); + while !self.eat(token::RBRACE) { + let vis = self.parse_visibility(); + meths.push(self.parse_method(vis)); + } + meths_opt = Some(move meths); } - (ident, item_impl(tps, opt_trait, ty, meths), None) + + (ident, item_impl(tps, opt_trait, ty, meths_opt), None) } // Instantiates ident <i> with references to <typarams> as arguments. diff --git a/src/libsyntax/print/pprust.rs b/src/libsyntax/print/pprust.rs index 33915c8c0c9..d68b28c6836 100644 --- a/src/libsyntax/print/pprust.rs +++ b/src/libsyntax/print/pprust.rs @@ -522,7 +522,7 @@ fn print_item(s: ps, &&item: @ast::item) { print_struct(s, struct_def, tps, item.ident, item.span); } - ast::item_impl(tps, opt_trait, ty, methods) => { + ast::item_impl(tps, opt_trait, ty, methods_opt) => { head(s, visibility_qualified(item.vis, ~"impl")); if tps.is_not_empty() { print_type_params(s, tps); @@ -539,11 +539,18 @@ fn print_item(s: ps, &&item: @ast::item) { }; space(s.s); - bopen(s); - for methods.each |meth| { - print_method(s, *meth); + match methods_opt { + None => { + word(s.s, ~";"); + } + Some(methods) => { + bopen(s); + for methods.each |meth| { + print_method(s, *meth); + } + bclose(s, item.span); + } } - bclose(s, item.span); } ast::item_trait(tps, traits, methods) => { head(s, visibility_qualified(item.vis, ~"trait")); diff --git a/src/libsyntax/visit.rs b/src/libsyntax/visit.rs index b45af2d4ae8..7035400f92d 100644 --- a/src/libsyntax/visit.rs +++ b/src/libsyntax/visit.rs @@ -142,14 +142,16 @@ fn visit_item<E>(i: @item, e: E, v: vt<E>) { v.visit_ty_params(tps, e, v); visit_enum_def(enum_definition, tps, e, v); } - item_impl(tps, traits, ty, methods) => { + item_impl(tps, traits, ty, methods_opt) => { v.visit_ty_params(tps, e, v); for traits.each |p| { visit_path(p.path, e, v); } v.visit_ty(ty, e, v); - for methods.each |m| { - visit_method_helper(*m, e, v) + for methods_opt.each |methods| { + for methods.each |m| { + visit_method_helper(*m, e, v) + } } } item_class(struct_def, tps) => { |
