Skip to content

Commit 98477f7

Browse files
committed
---
yaml --- r: 16027 b: refs/heads/try c: 5b72e52 h: refs/heads/master i: 16025: b32f7fe 16023: 0ed5c5c v: v3
1 parent f76dfa4 commit 98477f7

File tree

6 files changed

+132
-119
lines changed

6 files changed

+132
-119
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,5 @@
22
refs/heads/master: 61b1875c16de39c166b0f4d54bba19f9c6777d1a
33
refs/heads/snap-stage1: e33de59e47c5076a89eadeb38f4934f58a3618a6
44
refs/heads/snap-stage3: 4a81779abd786ff22d71434c6d9a5917ea4cdfff
5-
refs/heads/try: 09652c8f5f0f12913396898afd4fb382ae90a448
5+
refs/heads/try: 5b72e52e472ca06f42700a322dc2cac4c38e05f1
66
refs/tags/release-0.1: 1f5c5126e96c79d22cb7862f75304136e204f105

branches/try/src/librustsyntax/parse.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ export parse_item_from_source_str;
1313
export parse_from_source_str;
1414

1515
import parser::parser;
16+
import attr::parser_attr;
1617
import common::parser_common;
1718
import ast::node_id;
1819
import util::interner;
@@ -44,7 +45,7 @@ fn parse_crate_from_crate_file(input: str, cfg: ast::crate_cfg,
4445
let p = new_parser_from_file(sess, cfg, input, parser::CRATE_FILE);
4546
let lo = p.span.lo;
4647
let prefix = path::dirname(p.reader.filemap.name);
47-
let leading_attrs = attr::parse_inner_attrs_and_next(p);
48+
let leading_attrs = p.parse_inner_attrs_and_next();
4849
let crate_attrs = leading_attrs.inner;
4950
let first_cdir_attr = leading_attrs.next;
5051
let cdirs = p.parse_crate_directives(token::EOF, first_cdir_attr);

branches/try/src/librustsyntax/parse/attr.rs

Lines changed: 108 additions & 94 deletions
Original file line numberDiff line numberDiff line change
@@ -3,116 +3,130 @@ import ast_util::spanned;
33
import common::{parser_common, seq_sep};
44

55
export attr_or_ext;
6-
export parse_outer_attributes;
7-
export parse_outer_attrs_or_ext;
8-
export parse_inner_attrs_and_next;
9-
export parse_optional_meta;
6+
export parser_attr;
107

118
// A type to distingush between the parsing of item attributes or syntax
129
// extensions, which both begin with token.POUND
1310
type attr_or_ext = option<either<[ast::attribute], @ast::expr>>;
1411

15-
fn parse_outer_attrs_or_ext(
16-
p: parser,
17-
first_item_attrs: [ast::attribute]) -> attr_or_ext {
18-
let expect_item_next = vec::is_not_empty(first_item_attrs);
19-
if p.token == token::POUND {
20-
let lo = p.span.lo;
21-
if p.look_ahead(1u) == token::LBRACKET {
22-
p.bump();
23-
let first_attr = parse_attribute_naked(p, ast::attr_outer, lo);
24-
ret some(left([first_attr] + parse_outer_attributes(p)));
25-
} else if !(p.look_ahead(1u) == token::LT
26-
|| p.look_ahead(1u) == token::LBRACKET
27-
|| expect_item_next) {
28-
p.bump();
29-
ret some(right(p.parse_syntax_ext_naked(lo)));
12+
impl parser_attr for parser {
13+
14+
fn parse_outer_attrs_or_ext(first_item_attrs: [ast::attribute])
15+
-> attr_or_ext
16+
{
17+
let expect_item_next = vec::is_not_empty(first_item_attrs);
18+
if self.token == token::POUND {
19+
let lo = self.span.lo;
20+
if self.look_ahead(1u) == token::LBRACKET {
21+
self.bump();
22+
let first_attr =
23+
self.parse_attribute_naked(ast::attr_outer, lo);
24+
ret some(left([first_attr] + self.parse_outer_attributes()));
25+
} else if !(self.look_ahead(1u) == token::LT
26+
|| self.look_ahead(1u) == token::LBRACKET
27+
|| expect_item_next) {
28+
self.bump();
29+
ret some(right(self.parse_syntax_ext_naked(lo)));
30+
} else { ret none; }
3031
} else { ret none; }
31-
} else { ret none; }
32-
}
32+
}
3333

34-
// Parse attributes that appear before an item
35-
fn parse_outer_attributes(p: parser) -> [ast::attribute] {
36-
let mut attrs: [ast::attribute] = [];
37-
while p.token == token::POUND && p.look_ahead(1u) == token::LBRACKET {
38-
attrs += [parse_attribute(p, ast::attr_outer)];
34+
// Parse attributes that appear before an item
35+
fn parse_outer_attributes() -> [ast::attribute] {
36+
let mut attrs: [ast::attribute] = [];
37+
while self.token == token::POUND
38+
&& self.look_ahead(1u) == token::LBRACKET {
39+
attrs += [self.parse_attribute(ast::attr_outer)];
40+
}
41+
ret attrs;
3942
}
40-
ret attrs;
41-
}
4243

43-
fn parse_attribute(p: parser, style: ast::attr_style) -> ast::attribute {
44-
let lo = p.span.lo;
45-
p.expect(token::POUND);
46-
ret parse_attribute_naked(p, style, lo);
47-
}
44+
fn parse_attribute(style: ast::attr_style) -> ast::attribute {
45+
let lo = self.span.lo;
46+
self.expect(token::POUND);
47+
ret self.parse_attribute_naked(style, lo);
48+
}
4849

49-
fn parse_attribute_naked(p: parser, style: ast::attr_style, lo: uint) ->
50-
ast::attribute {
51-
p.expect(token::LBRACKET);
52-
let meta_item = parse_meta_item(p);
53-
p.expect(token::RBRACKET);
54-
let mut hi = p.span.hi;
55-
ret spanned(lo, hi, {style: style, value: *meta_item});
56-
}
50+
fn parse_attribute_naked(style: ast::attr_style, lo: uint) ->
51+
ast::attribute {
52+
self.expect(token::LBRACKET);
53+
let meta_item = self.parse_meta_item();
54+
self.expect(token::RBRACKET);
55+
let mut hi = self.span.hi;
56+
ret spanned(lo, hi, {style: style, value: *meta_item});
57+
}
5758

58-
// Parse attributes that appear after the opening of an item, each terminated
59-
// by a semicolon. In addition to a vector of inner attributes, this function
60-
// also returns a vector that may contain the first outer attribute of the
61-
// next item (since we can't know whether the attribute is an inner attribute
62-
// of the containing item or an outer attribute of the first contained item
63-
// until we see the semi).
64-
fn parse_inner_attrs_and_next(p: parser) ->
65-
{inner: [ast::attribute], next: [ast::attribute]} {
66-
let mut inner_attrs: [ast::attribute] = [];
67-
let mut next_outer_attrs: [ast::attribute] = [];
68-
while p.token == token::POUND {
69-
if p.look_ahead(1u) != token::LBRACKET {
70-
// This is an extension
71-
break;
59+
// Parse attributes that appear after the opening of an item, each
60+
// terminated by a semicolon. In addition to a vector of inner attributes,
61+
// this function also returns a vector that may contain the first outer
62+
// attribute of the next item (since we can't know whether the attribute
63+
// is an inner attribute of the containing item or an outer attribute of
64+
// the first contained item until we see the semi).
65+
fn parse_inner_attrs_and_next() ->
66+
{inner: [ast::attribute], next: [ast::attribute]} {
67+
let mut inner_attrs: [ast::attribute] = [];
68+
let mut next_outer_attrs: [ast::attribute] = [];
69+
while self.token == token::POUND {
70+
if self.look_ahead(1u) != token::LBRACKET {
71+
// This is an extension
72+
break;
73+
}
74+
let attr = self.parse_attribute(ast::attr_inner);
75+
if self.token == token::SEMI {
76+
self.bump();
77+
inner_attrs += [attr];
78+
} else {
79+
// It's not really an inner attribute
80+
let outer_attr =
81+
spanned(attr.span.lo, attr.span.hi,
82+
{style: ast::attr_outer, value: attr.node.value});
83+
next_outer_attrs += [outer_attr];
84+
break;
85+
}
7286
}
73-
let attr = parse_attribute(p, ast::attr_inner);
74-
if p.token == token::SEMI {
75-
p.bump();
76-
inner_attrs += [attr];
77-
} else {
78-
// It's not really an inner attribute
79-
let outer_attr =
80-
spanned(attr.span.lo, attr.span.hi,
81-
{style: ast::attr_outer, value: attr.node.value});
82-
next_outer_attrs += [outer_attr];
83-
break;
87+
ret {inner: inner_attrs, next: next_outer_attrs};
88+
}
89+
90+
fn parse_meta_item() -> @ast::meta_item {
91+
let lo = self.span.lo;
92+
let ident = self.parse_ident();
93+
alt self.token {
94+
token::EQ {
95+
self.bump();
96+
let lit = self.parse_lit();
97+
let mut hi = self.span.hi;
98+
ret @spanned(lo, hi, ast::meta_name_value(ident, lit));
99+
}
100+
token::LPAREN {
101+
let inner_items = self.parse_meta_seq();
102+
let mut hi = self.span.hi;
103+
ret @spanned(lo, hi, ast::meta_list(ident, inner_items));
104+
}
105+
_ {
106+
let mut hi = self.span.hi;
107+
ret @spanned(lo, hi, ast::meta_word(ident));
108+
}
84109
}
85110
}
86-
ret {inner: inner_attrs, next: next_outer_attrs};
87-
}
88111

89-
fn parse_meta_item(p: parser) -> @ast::meta_item {
90-
let lo = p.span.lo;
91-
let ident = p.parse_ident();
92-
alt p.token {
93-
token::EQ {
94-
p.bump();
95-
let lit = p.parse_lit();
96-
let mut hi = p.span.hi;
97-
ret @spanned(lo, hi, ast::meta_name_value(ident, lit));
98-
}
99-
token::LPAREN {
100-
let inner_items = parse_meta_seq(p);
101-
let mut hi = p.span.hi;
102-
ret @spanned(lo, hi, ast::meta_list(ident, inner_items));
103-
}
104-
_ {
105-
let mut hi = p.span.hi;
106-
ret @spanned(lo, hi, ast::meta_word(ident));
107-
}
112+
fn parse_meta_seq() -> [@ast::meta_item] {
113+
ret self.parse_seq(token::LPAREN, token::RPAREN,
114+
seq_sep(token::COMMA),
115+
{|p| p.parse_meta_item()}).node;
108116
}
109-
}
110117

111-
fn parse_meta_seq(p: parser) -> [@ast::meta_item] {
112-
ret p.parse_seq(token::LPAREN, token::RPAREN, seq_sep(token::COMMA),
113-
{|p| parse_meta_item(p)}).node;
118+
fn parse_optional_meta() -> [@ast::meta_item] {
119+
alt self.token { token::LPAREN { ret self.parse_meta_seq(); }
120+
_ { ret []; } }
121+
}
114122
}
115123

116-
fn parse_optional_meta(p: parser) -> [@ast::meta_item] {
117-
alt p.token { token::LPAREN { ret parse_meta_seq(p); } _ { ret []; } }
118-
}
124+
//
125+
// Local Variables:
126+
// mode: rust
127+
// fill-column: 78;
128+
// indent-tabs-mode: nil
129+
// c-basic-offset: 4
130+
// buffer-file-coding-system: utf-8-unix
131+
// End:
132+
//

branches/try/src/librustsyntax/parse/eval.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import parser::{parser, SOURCE_FILE};
2-
import attr::parse_inner_attrs_and_next;
2+
import attr::parser_attr;
33

44
export eval_crate_directives_to_mod;
55

@@ -65,7 +65,7 @@ fn parse_companion_mod(cx: ctx, prefix: str, suffix: option<str>)
6565
if file_exists(modpath) {
6666
#debug("found companion mod");
6767
let p0 = new_parser_from_file(cx.sess, cx.cfg, modpath, SOURCE_FILE);
68-
let inner_attrs = parse_inner_attrs_and_next(p0);
68+
let inner_attrs = p0.parse_inner_attrs_and_next();
6969
let first_item_outer_attrs = inner_attrs.next;
7070
let m0 = p0.parse_mod_items(token::EOF, first_item_outer_attrs);
7171
cx.sess.chpos = p0.reader.chpos;
@@ -97,7 +97,7 @@ fn eval_crate_directive(cx: ctx, cdir: @ast::crate_directive, prefix: str,
9797
} else { prefix + path::path_sep() + file_path };
9898
let p0 =
9999
new_parser_from_file(cx.sess, cx.cfg, full_path, SOURCE_FILE);
100-
let inner_attrs = parse_inner_attrs_and_next(p0);
100+
let inner_attrs = p0.parse_inner_attrs_and_next();
101101
let mod_attrs = attrs + inner_attrs.inner;
102102
let first_item_outer_attrs = inner_attrs.next;
103103
let m0 = p0.parse_mod_items(token::EOF, first_item_outer_attrs);

0 commit comments

Comments
 (0)