Skip to content

Commit 338f278

Browse files
committed
---
yaml --- r: 23182 b: refs/heads/master c: 9b5266d h: refs/heads/master v: v3
1 parent 3d9dc9f commit 338f278

File tree

2 files changed

+114
-31
lines changed

2 files changed

+114
-31
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
---
2-
refs/heads/master: 91612dbb7e37b53223a57557a442e29a84f0f6bf
2+
refs/heads/master: 9b5266d745ec69e625c2be2defd36d59080caf34
33
refs/heads/snap-stage1: e33de59e47c5076a89eadeb38f4934f58a3618a6
44
refs/heads/snap-stage3: cd6f24f9d14ac90d167386a56e7a6ac1f0318195
55
refs/heads/try: ffbe0e0e00374358b789b0037bcb3a577cd218be

trunk/src/libsyntax/parse/parser.rs

Lines changed: 113 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,8 @@ export SOURCE_FILE;
7070
import parse_from_source_str;
7171
export parse_from_source_str;
7272

73+
export item_or_view_item, iovi_none, iovi_view_item, iovi_item;
74+
7375
enum restriction {
7476
UNRESTRICTED,
7577
RESTRICT_STMT_EXPR,
@@ -103,6 +105,11 @@ enum class_contents { ctor_decl(fn_decl, ~[attribute], blk, codemap::span),
103105
type arg_or_capture_item = either<arg, capture_item>;
104106
type item_info = (ident, item_, option<~[attribute]>);
105107

108+
enum item_or_view_item {
109+
iovi_none,
110+
iovi_item(@item),
111+
iovi_view_item(@view_item)
112+
}
106113

107114
/* The expr situation is not as complex as I thought it would be.
108115
The important thing is to make sure that lookahead doesn't balk
@@ -135,6 +142,13 @@ macro_rules! maybe_whole {
135142
INTERPOLATED(token::$constructor(x)) => { $p.bump(); return some(x); }
136143
_ => ()
137144
}} ;
145+
{iovi $p:expr, $constructor:ident} => { match copy $p.token {
146+
INTERPOLATED(token::$constructor(x)) => {
147+
$p.bump();
148+
return iovi_item(x);
149+
}
150+
_ => ()
151+
}} ;
138152
{pair_empty $p:expr, $constructor:ident} => { match copy $p.token {
139153
INTERPOLATED(token::$constructor(x)) => { $p.bump(); return (~[], x); }
140154
_ => ()
@@ -2004,13 +2018,17 @@ class parser {
20042018

20052019
let item_attrs = vec::append(first_item_attrs, item_attrs);
20062020

2007-
match self.parse_item(item_attrs) {
2008-
some(i) => {
2021+
match self.parse_item_or_view_item(item_attrs) {
2022+
iovi_item(i) => {
20092023
let mut hi = i.span.hi;
20102024
let decl = @spanned(lo, hi, decl_item(i));
20112025
return @spanned(lo, hi, stmt_decl(decl, self.get_id()));
20122026
}
2013-
none() => { /* fallthrough */ }
2027+
iovi_view_item(vi) => {
2028+
self.span_fatal(vi.span, ~"view items must be declared at \
2029+
the top of the block");
2030+
}
2031+
iovi_none() => { /* fallthrough */ }
20142032
}
20152033

20162034
check_expected_item(self, item_attrs);
@@ -2680,9 +2698,15 @@ class parser {
26802698
attrs = vec::append(attrs_remaining, attrs);
26812699
first = false;
26822700
}
2683-
debug!{"parse_mod_items: parse_item(attrs=%?)", attrs};
2684-
match self.parse_item(attrs) {
2685-
some(i) => vec::push(items, i),
2701+
debug!("parse_mod_items: parse_item_or_view_item(attrs=%?)",
2702+
attrs);
2703+
match self.parse_item_or_view_item(attrs) {
2704+
iovi_item(item) => vec::push(items, item),
2705+
iovi_view_item(view_item) => {
2706+
self.span_fatal(view_item.span, ~"view items must be \
2707+
declared at the top of the \
2708+
module");
2709+
}
26862710
_ => {
26872711
self.fatal(~"expected item but found `" +
26882712
token_to_str(self.reader, self.token) + ~"`");
@@ -2969,8 +2993,8 @@ class parser {
29692993
}
29702994
}
29712995

2972-
fn parse_item(+attrs: ~[attribute]) -> option<@item> {
2973-
maybe_whole!{some self,nt_item};
2996+
fn parse_item_or_view_item(+attrs: ~[attribute]) -> item_or_view_item {
2997+
maybe_whole!{iovi self,nt_item};
29742998
let lo = self.span.lo;
29752999

29763000
let visibility;
@@ -2982,41 +3006,90 @@ class parser {
29823006
visibility = inherited;
29833007
}
29843008

2985-
let (ident, item_, extra_attrs) = if self.eat_keyword(~"const") {
2986-
self.parse_item_const()
3009+
pure fn maybe_append(+lhs: ~[attribute], rhs: option<~[attribute]>)
3010+
-> ~[attribute] {
3011+
match rhs {
3012+
none => lhs,
3013+
some(attrs) => vec::append(lhs, attrs)
3014+
}
3015+
}
3016+
3017+
if self.eat_keyword(~"const") {
3018+
let (ident, item_, extra_attrs) = self.parse_item_const();
3019+
return iovi_item(self.mk_item(lo, self.last_span.hi, ident, item_,
3020+
visibility,
3021+
maybe_append(attrs, extra_attrs)));
29873022
} else if self.is_keyword(~"fn") &&
29883023
!self.fn_expr_lookahead(self.look_ahead(1u)) {
29893024
self.bump();
2990-
self.parse_item_fn(impure_fn)
3025+
let (ident, item_, extra_attrs) = self.parse_item_fn(impure_fn);
3026+
return iovi_item(self.mk_item(lo, self.last_span.hi, ident, item_,
3027+
visibility,
3028+
maybe_append(attrs, extra_attrs)));
29913029
} else if self.eat_keyword(~"pure") {
29923030
self.expect_keyword(~"fn");
2993-
self.parse_item_fn(pure_fn)
3031+
let (ident, item_, extra_attrs) = self.parse_item_fn(pure_fn);
3032+
return iovi_item(self.mk_item(lo, self.last_span.hi, ident, item_,
3033+
visibility,
3034+
maybe_append(attrs, extra_attrs)));
29943035
} else if self.is_keyword(~"unsafe")
29953036
&& self.look_ahead(1u) != token::LBRACE {
29963037
self.bump();
29973038
self.expect_keyword(~"fn");
2998-
self.parse_item_fn(unsafe_fn)
3039+
let (ident, item_, extra_attrs) = self.parse_item_fn(unsafe_fn);
3040+
return iovi_item(self.mk_item(lo, self.last_span.hi, ident, item_,
3041+
visibility,
3042+
maybe_append(attrs, extra_attrs)));
29993043
} else if self.eat_keyword(~"extern") {
3044+
// XXX: "extern mod foo;" syntax as a "use" replacement.
30003045
if self.eat_keyword(~"fn") {
3001-
self.parse_item_fn(extern_fn)
3002-
} else {
3003-
self.parse_item_foreign_mod()
3046+
let (ident, item_, extra_attrs) =
3047+
self.parse_item_fn(extern_fn);
3048+
return iovi_item(self.mk_item(lo, self.last_span.hi, ident,
3049+
item_, visibility,
3050+
maybe_append(attrs,
3051+
extra_attrs)));
30043052
}
3053+
let (ident, item_, extra_attrs) = self.parse_item_foreign_mod();
3054+
return iovi_item(self.mk_item(lo, self.last_span.hi, ident, item_,
3055+
visibility,
3056+
maybe_append(attrs, extra_attrs)));
30053057
} else if self.eat_keyword(~"mod") || self.eat_keyword(~"module") {
3006-
self.parse_item_mod()
3058+
let (ident, item_, extra_attrs) = self.parse_item_mod();
3059+
return iovi_item(self.mk_item(lo, self.last_span.hi, ident, item_,
3060+
visibility,
3061+
maybe_append(attrs, extra_attrs)));
30073062
} else if self.eat_keyword(~"type") {
3008-
self.parse_item_type()
3063+
let (ident, item_, extra_attrs) = self.parse_item_type();
3064+
return iovi_item(self.mk_item(lo, self.last_span.hi, ident, item_,
3065+
visibility,
3066+
maybe_append(attrs, extra_attrs)));
30093067
} else if self.eat_keyword(~"enum") {
3010-
self.parse_item_enum()
3068+
let (ident, item_, extra_attrs) = self.parse_item_enum();
3069+
return iovi_item(self.mk_item(lo, self.last_span.hi, ident, item_,
3070+
visibility,
3071+
maybe_append(attrs, extra_attrs)));
30113072
} else if self.eat_keyword(~"iface") {
30123073
self.warn(~"`iface` is deprecated; use `trait`");
3013-
self.parse_item_trait()
3074+
let (ident, item_, extra_attrs) = self.parse_item_trait();
3075+
return iovi_item(self.mk_item(lo, self.last_span.hi, ident, item_,
3076+
visibility,
3077+
maybe_append(attrs, extra_attrs)));
30143078
} else if self.eat_keyword(~"trait") {
3015-
self.parse_item_trait()
3079+
let (ident, item_, extra_attrs) = self.parse_item_trait();
3080+
return iovi_item(self.mk_item(lo, self.last_span.hi, ident, item_,
3081+
visibility,
3082+
maybe_append(attrs, extra_attrs)));
30163083
} else if self.eat_keyword(~"impl") {
3017-
self.parse_item_impl()
3084+
let (ident, item_, extra_attrs) = self.parse_item_impl();
3085+
return iovi_item(self.mk_item(lo, self.last_span.hi, ident, item_,
3086+
visibility,
3087+
maybe_append(attrs, extra_attrs)));
30183088
} else if self.eat_keyword(~"class") || self.eat_keyword(~"struct") {
3019-
self.parse_item_class()
3089+
let (ident, item_, extra_attrs) = self.parse_item_class();
3090+
return iovi_item(self.mk_item(lo, self.last_span.hi, ident, item_,
3091+
visibility,
3092+
maybe_append(attrs, extra_attrs)));
30203093
} else if !self.is_any_keyword(copy self.token)
30213094
&& self.look_ahead(1) == token::NOT
30223095
&& is_plain_ident(self.look_ahead(2))
@@ -3039,13 +3112,23 @@ class parser {
30393112
span: {lo: self.span.lo,
30403113
hi: self.span.hi,
30413114
expn_info: none}};
3042-
(id, item_mac(m), none)
3043-
} else { return none; };
3044-
some(self.mk_item(lo, self.last_span.hi, ident, item_, visibility,
3045-
match extra_attrs {
3046-
some(as) => vec::append(attrs, as),
3047-
none => attrs
3048-
}))
3115+
let item_ = item_mac(m);
3116+
return iovi_item(self.mk_item(lo, self.last_span.hi, id, item_,
3117+
visibility, attrs));
3118+
} else {
3119+
return iovi_none;
3120+
};
3121+
}
3122+
3123+
fn parse_item(+attrs: ~[attribute]) -> option<@ast::item> {
3124+
match self.parse_item_or_view_item(attrs) {
3125+
iovi_none =>
3126+
none,
3127+
iovi_view_item(_) =>
3128+
self.fatal(~"view items are not allowed here"),
3129+
iovi_item(item) =>
3130+
some(item)
3131+
}
30493132
}
30503133

30513134
fn parse_use() -> view_item_ {

0 commit comments

Comments
 (0)