Report obsolete class method syntax

This commit is contained in:
Brian Anderson 2012-09-10 17:26:20 -07:00
parent df79026169
commit 73eb894305
3 changed files with 43 additions and 20 deletions

View file

@ -18,7 +18,8 @@ pub enum ObsoleteSyntax {
ObsoleteLet,
ObsoleteFieldTerminator,
ObsoleteStructCtor,
ObsoleteWith
ObsoleteWith,
ObsoleteClassMethod,
}
impl ObsoleteSyntax : cmp::Eq {
@ -71,6 +72,10 @@ impl parser : ObsoleteReporter {
"record update is done with `..`, e.g. \
`MyStruct { foo: bar, .. baz }`"
),
ObsoleteClassMethod => (
"class method",
"methods should be defined inside impls"
),
};
self.report(sp, kind, kind_str, desc);

View file

@ -19,7 +19,7 @@ use obsolete::{
ObsoleteReporter, ObsoleteSyntax,
ObsoleteLowerCaseKindBounds, ObsoleteLet,
ObsoleteFieldTerminator, ObsoleteStructCtor,
ObsoleteWith
ObsoleteWith, ObsoleteClassMethod
};
use ast::{_mod, add, alt_check, alt_exhaustive, arg, arm, attribute,
bind_by_ref, bind_by_implicit_ref, bind_by_value, bind_by_move,
@ -2778,25 +2778,35 @@ impl parser {
let obsolete_let = self.eat_obsolete_ident("let");
if obsolete_let { self.obsolete(copy self.last_span, ObsoleteLet) }
let a_var = self.parse_instance_var(vis);
match self.token {
token::SEMI => {
self.obsolete(copy self.span, ObsoleteFieldTerminator);
self.bump();
}
token::COMMA => {
self.bump();
}
token::RBRACE => {}
_ => {
self.span_fatal(copy self.span,
fmt!("expected `;`, `,`, or '}' but \
found `%s`",
token_to_str(self.reader,
self.token)));
}
let parse_obsolete_method =
!((obsolete_let || self.is_keyword(~"mut") ||
!self.is_any_keyword(copy self.token))
&& !self.token_is_pound_or_doc_comment(copy self.token));
if !parse_obsolete_method {
let a_var = self.parse_instance_var(vis);
match self.token {
token::SEMI => {
self.obsolete(copy self.span, ObsoleteFieldTerminator);
self.bump();
}
token::COMMA => {
self.bump();
}
token::RBRACE => {}
_ => {
self.span_fatal(copy self.span,
fmt!("expected `;`, `,`, or '}' but \
found `%s`",
token_to_str(self.reader,
self.token)));
}
}
return a_var;
} else {
self.obsolete(copy self.span, ObsoleteClassMethod);
return @method_member(self.parse_method(vis));
}
return a_var;
}
fn parse_dtor(attrs: ~[attribute]) -> class_contents {

View file

@ -19,6 +19,14 @@ struct s {
//~^ ERROR obsolete syntax: struct constructor
}
struct ss {
fn foo() { }
//~^ ERROR obsolete syntax: class method
#[whatever]
fn foo() { }
//~^ ERROR obsolete syntax: class method
}
fn obsolete_with() {
struct S {
foo: (),