Skip to content

Commit 73eb894

Browse files
committed
Report obsolete class method syntax
1 parent df79026 commit 73eb894

File tree

3 files changed

+43
-20
lines changed

3 files changed

+43
-20
lines changed

src/libsyntax/parse/obsolete.rs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@ pub enum ObsoleteSyntax {
1818
ObsoleteLet,
1919
ObsoleteFieldTerminator,
2020
ObsoleteStructCtor,
21-
ObsoleteWith
21+
ObsoleteWith,
22+
ObsoleteClassMethod,
2223
}
2324

2425
impl ObsoleteSyntax : cmp::Eq {
@@ -71,6 +72,10 @@ impl parser : ObsoleteReporter {
7172
"record update is done with `..`, e.g. \
7273
`MyStruct { foo: bar, .. baz }`"
7374
),
75+
ObsoleteClassMethod => (
76+
"class method",
77+
"methods should be defined inside impls"
78+
),
7479
};
7580

7681
self.report(sp, kind, kind_str, desc);

src/libsyntax/parse/parser.rs

Lines changed: 29 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ use obsolete::{
1919
ObsoleteReporter, ObsoleteSyntax,
2020
ObsoleteLowerCaseKindBounds, ObsoleteLet,
2121
ObsoleteFieldTerminator, ObsoleteStructCtor,
22-
ObsoleteWith
22+
ObsoleteWith, ObsoleteClassMethod
2323
};
2424
use ast::{_mod, add, alt_check, alt_exhaustive, arg, arm, attribute,
2525
bind_by_ref, bind_by_implicit_ref, bind_by_value, bind_by_move,
@@ -2778,25 +2778,35 @@ impl parser {
27782778
let obsolete_let = self.eat_obsolete_ident("let");
27792779
if obsolete_let { self.obsolete(copy self.last_span, ObsoleteLet) }
27802780

2781-
let a_var = self.parse_instance_var(vis);
2782-
match self.token {
2783-
token::SEMI => {
2784-
self.obsolete(copy self.span, ObsoleteFieldTerminator);
2785-
self.bump();
2786-
}
2787-
token::COMMA => {
2788-
self.bump();
2789-
}
2790-
token::RBRACE => {}
2791-
_ => {
2792-
self.span_fatal(copy self.span,
2793-
fmt!("expected `;`, `,`, or '}' but \
2794-
found `%s`",
2795-
token_to_str(self.reader,
2796-
self.token)));
2797-
}
2781+
let parse_obsolete_method =
2782+
!((obsolete_let || self.is_keyword(~"mut") ||
2783+
!self.is_any_keyword(copy self.token))
2784+
&& !self.token_is_pound_or_doc_comment(copy self.token));
2785+
2786+
if !parse_obsolete_method {
2787+
let a_var = self.parse_instance_var(vis);
2788+
match self.token {
2789+
token::SEMI => {
2790+
self.obsolete(copy self.span, ObsoleteFieldTerminator);
2791+
self.bump();
2792+
}
2793+
token::COMMA => {
2794+
self.bump();
2795+
}
2796+
token::RBRACE => {}
2797+
_ => {
2798+
self.span_fatal(copy self.span,
2799+
fmt!("expected `;`, `,`, or '}' but \
2800+
found `%s`",
2801+
token_to_str(self.reader,
2802+
self.token)));
2803+
}
2804+
}
2805+
return a_var;
2806+
} else {
2807+
self.obsolete(copy self.span, ObsoleteClassMethod);
2808+
return @method_member(self.parse_method(vis));
27982809
}
2799-
return a_var;
28002810
}
28012811

28022812
fn parse_dtor(attrs: ~[attribute]) -> class_contents {

src/test/compile-fail/obsolete-syntax.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,14 @@ struct s {
1919
//~^ ERROR obsolete syntax: struct constructor
2020
}
2121

22+
struct ss {
23+
fn foo() { }
24+
//~^ ERROR obsolete syntax: class method
25+
#[whatever]
26+
fn foo() { }
27+
//~^ ERROR obsolete syntax: class method
28+
}
29+
2230
fn obsolete_with() {
2331
struct S {
2432
foo: (),

0 commit comments

Comments
 (0)