diff options
| author | Luqman Aden <laden@csclub.uwaterloo.ca> | 2013-02-21 00:16:31 -0800 |
|---|---|---|
| committer | Luqman Aden <laden@csclub.uwaterloo.ca> | 2013-02-21 00:19:15 -0800 |
| commit | b02f5c2090340a9007989b3eb384facb0f0286f2 (patch) | |
| tree | a2c45d1b8f788d990e4989467b416d3424c2c963 /src/libsyntax/parse | |
| parent | 41a4151173df5cd93089e40238205c6356835807 (diff) | |
| download | rust-b02f5c2090340a9007989b3eb384facb0f0286f2.tar.gz rust-b02f5c2090340a9007989b3eb384facb0f0286f2.zip | |
Get rid of structural records in libsyntax and the last bit in librustc.
Diffstat (limited to 'src/libsyntax/parse')
| -rw-r--r-- | src/libsyntax/parse/attr.rs | 6 | ||||
| -rw-r--r-- | src/libsyntax/parse/comments.rs | 27 | ||||
| -rw-r--r-- | src/libsyntax/parse/common.rs | 35 | ||||
| -rw-r--r-- | src/libsyntax/parse/eval.rs | 12 | ||||
| -rw-r--r-- | src/libsyntax/parse/mod.rs | 64 | ||||
| -rw-r--r-- | src/libsyntax/parse/parser.rs | 121 |
6 files changed, 144 insertions, 121 deletions
diff --git a/src/libsyntax/parse/attr.rs b/src/libsyntax/parse/attr.rs index 34ac5c16841..5803c607191 100644 --- a/src/libsyntax/parse/attr.rs +++ b/src/libsyntax/parse/attr.rs @@ -24,7 +24,7 @@ pub trait parser_attr { fn parse_attribute_naked(style: ast::attr_style, lo: BytePos) -> ast::attribute; fn parse_inner_attrs_and_next() -> - {inner: ~[ast::attribute], next: ~[ast::attribute]}; + (~[ast::attribute], ~[ast::attribute]); fn parse_meta_item() -> @ast::meta_item; fn parse_meta_seq() -> ~[@ast::meta_item]; fn parse_optional_meta() -> ~[@ast::meta_item]; @@ -82,7 +82,7 @@ impl parser_attr for Parser { // is an inner attribute of the containing item or an outer attribute of // the first contained item until we see the semi). fn parse_inner_attrs_and_next() -> - {inner: ~[ast::attribute], next: ~[ast::attribute]} { + (~[ast::attribute], ~[ast::attribute]) { let mut inner_attrs: ~[ast::attribute] = ~[]; let mut next_outer_attrs: ~[ast::attribute] = ~[]; loop { @@ -121,7 +121,7 @@ impl parser_attr for Parser { _ => break } } - return {inner: inner_attrs, next: next_outer_attrs}; + (inner_attrs, next_outer_attrs) } fn parse_meta_item() -> @ast::meta_item { diff --git a/src/libsyntax/parse/comments.rs b/src/libsyntax/parse/comments.rs index e27784d1f6b..152bd9b0ce4 100644 --- a/src/libsyntax/parse/comments.rs +++ b/src/libsyntax/parse/comments.rs @@ -44,7 +44,11 @@ impl cmp::Eq for cmnt_style { } } -pub type cmnt = {style: cmnt_style, lines: ~[~str], pos: BytePos}; +pub struct cmnt { + style: cmnt_style, + lines: ~[~str], + pos: BytePos +} pub fn is_doc_comment(s: &str) -> bool { (s.starts_with(~"///") && !is_line_non_doc_comment(s)) || @@ -147,7 +151,7 @@ fn consume_non_eol_whitespace(rdr: @mut StringReader) { fn push_blank_line_comment(rdr: @mut StringReader, comments: &mut ~[cmnt]) { debug!(">>> blank-line comment"); let v: ~[~str] = ~[]; - comments.push({style: blank_line, lines: v, pos: rdr.last_pos}); + comments.push(cmnt {style: blank_line, lines: v, pos: rdr.last_pos}); } fn consume_whitespace_counting_blank_lines(rdr: @mut StringReader, @@ -166,7 +170,7 @@ fn read_shebang_comment(rdr: @mut StringReader, code_to_the_left: bool, debug!(">>> shebang comment"); let p = rdr.last_pos; debug!("<<< shebang comment"); - comments.push({ + comments.push(cmnt { style: if code_to_the_left { trailing } else { isolated }, lines: ~[read_one_line_comment(rdr)], pos: p @@ -189,7 +193,7 @@ fn read_line_comments(rdr: @mut StringReader, code_to_the_left: bool, } debug!("<<< line comments"); if !lines.is_empty() { - comments.push({ + comments.push(cmnt { style: if code_to_the_left { trailing } else { isolated }, lines: lines, pos: p @@ -288,7 +292,7 @@ fn read_block_comment(rdr: @mut StringReader, style = mixed; } debug!("<<< block comment"); - comments.push({style: style, lines: lines, pos: p}); + comments.push(cmnt {style: style, lines: lines, pos: p}); } fn peeking_at_comment(rdr: @mut StringReader) -> bool { @@ -311,12 +315,14 @@ fn consume_comment(rdr: @mut StringReader, debug!("<<< consume comment"); } -pub type lit = {lit: ~str, pos: BytePos}; +pub struct lit { + lit: ~str, + pos: BytePos +} pub fn gather_comments_and_literals(span_diagnostic: diagnostic::span_handler, path: ~str, - srdr: io::Reader) -> - {cmnts: ~[cmnt], lits: ~[lit]} { + srdr: io::Reader) -> (~[cmnt], ~[lit]) { let src = @str::from_bytes(srdr.read_whole_stream()); let itr = parse::token::mk_fake_ident_interner(); let cm = CodeMap::new(); @@ -350,12 +356,13 @@ pub fn gather_comments_and_literals(span_diagnostic: diagnostic::span_handler, let TokenAndSpan {tok: tok, sp: sp} = rdr.peek(); if token::is_lit(tok) { let s = get_str_from(rdr, bstart); - literals.push({lit: s, pos: sp.lo}); + literals.push(lit {lit: s, pos: sp.lo}); log(debug, ~"tok lit: " + s); } else { log(debug, ~"tok: " + token::to_str(rdr.interner, tok)); } first_read = false; } - return {cmnts: comments, lits: literals}; + + (comments, literals) } diff --git a/src/libsyntax/parse/common.rs b/src/libsyntax/parse/common.rs index 4c9c9a5e52a..22004be87ad 100644 --- a/src/libsyntax/parse/common.rs +++ b/src/libsyntax/parse/common.rs @@ -20,21 +20,30 @@ use core::option::{None, Option, Some}; use core::option; use std::oldmap::HashMap; -// seq_sep : a sequence separator (token) +// SeqSep : a sequence separator (token) // and whether a trailing separator is allowed. -pub type seq_sep = { +pub struct SeqSep { sep: Option<token::Token>, trailing_sep_allowed: bool -}; +} -pub fn seq_sep_trailing_disallowed(t: token::Token) -> seq_sep { - return {sep: option::Some(t), trailing_sep_allowed: false}; +pub fn seq_sep_trailing_disallowed(t: token::Token) -> SeqSep { + SeqSep { + sep: option::Some(t), + trailing_sep_allowed: false + } } -pub fn seq_sep_trailing_allowed(t: token::Token) -> seq_sep { - return {sep: option::Some(t), trailing_sep_allowed: true}; +pub fn seq_sep_trailing_allowed(t: token::Token) -> SeqSep { + SeqSep { + sep: option::Some(t), + trailing_sep_allowed: true + } } -pub fn seq_sep_none() -> seq_sep { - return {sep: option::None, trailing_sep_allowed: false}; +pub fn seq_sep_none() -> SeqSep { + SeqSep { + sep: option::None, + trailing_sep_allowed: false + } } pub fn token_to_str(reader: reader, ++token: token::Token) -> ~str { @@ -253,7 +262,7 @@ pub impl Parser { // parse a sequence, including the closing delimiter. The function // f must consume tokens until reaching the next separator or // closing bracket. - fn parse_seq_to_end<T:Copy>(ket: token::Token, sep: seq_sep, + fn parse_seq_to_end<T:Copy>(ket: token::Token, sep: SeqSep, f: fn(Parser) -> T) -> ~[T] { let val = self.parse_seq_to_before_end(ket, sep, f); self.bump(); @@ -263,7 +272,7 @@ pub impl Parser { // parse a sequence, not including the closing delimiter. The function // f must consume tokens until reaching the next separator or // closing bracket. - fn parse_seq_to_before_end<T:Copy>(ket: token::Token, sep: seq_sep, + fn parse_seq_to_before_end<T:Copy>(ket: token::Token, sep: SeqSep, f: fn(Parser) -> T) -> ~[T] { let mut first: bool = true; let mut v: ~[T] = ~[]; @@ -286,7 +295,7 @@ pub impl Parser { // closing bracket. fn parse_unspanned_seq<T:Copy>(bra: token::Token, ket: token::Token, - sep: seq_sep, + sep: SeqSep, f: fn(Parser) -> T) -> ~[T] { self.expect(bra); let result = self.parse_seq_to_before_end::<T>(ket, sep, f); @@ -296,7 +305,7 @@ pub impl Parser { // NB: Do not use this function unless you actually plan to place the // spanned list in the AST. - fn parse_seq<T:Copy>(bra: token::Token, ket: token::Token, sep: seq_sep, + fn parse_seq<T:Copy>(bra: token::Token, ket: token::Token, sep: SeqSep, f: fn(Parser) -> T) -> spanned<~[T]> { let lo = self.span.lo; self.expect(bra); diff --git a/src/libsyntax/parse/eval.rs b/src/libsyntax/parse/eval.rs index 5decb2351e3..5d44db084d6 100644 --- a/src/libsyntax/parse/eval.rs +++ b/src/libsyntax/parse/eval.rs @@ -75,9 +75,9 @@ fn parse_companion_mod(cx: ctx, prefix: &Path, suffix: &Option<Path>) let p0 = new_sub_parser_from_file(cx.sess, cx.cfg, modpath, codemap::dummy_sp()); - let inner_attrs = p0.parse_inner_attrs_and_next(); - let m0 = p0.parse_mod_items(token::EOF, inner_attrs.next); - return (m0.view_items, m0.items, inner_attrs.inner); + let (inner, next) = p0.parse_inner_attrs_and_next(); + let m0 = p0.parse_mod_items(token::EOF, next); + return (m0.view_items, m0.items, inner); } else { return (~[], ~[], ~[]); } @@ -111,9 +111,9 @@ pub fn eval_src_mod_from_path(cx: ctx, prefix: &Path, path: &Path, let p0 = new_sub_parser_from_file(cx.sess, cx.cfg, &full_path, sp); - let inner_attrs = p0.parse_inner_attrs_and_next(); - let mod_attrs = vec::append(outer_attrs, inner_attrs.inner); - let first_item_outer_attrs = inner_attrs.next; + let (inner, next) = p0.parse_inner_attrs_and_next(); + let mod_attrs = vec::append(outer_attrs, inner); + let first_item_outer_attrs = next; let m0 = p0.parse_mod_items(token::EOF, first_item_outer_attrs); return (ast::item_mod(m0), mod_attrs); } diff --git a/src/libsyntax/parse/mod.rs b/src/libsyntax/parse/mod.rs index 82c1697bf72..0ecd7917ac6 100644 --- a/src/libsyntax/parse/mod.rs +++ b/src/libsyntax/parse/mod.rs @@ -47,33 +47,35 @@ pub mod classify; /// Reporting obsolete syntax pub mod obsolete; -pub type parse_sess = @{ +pub struct ParseSess { cm: @codemap::CodeMap, - mut next_id: node_id, + next_id: node_id, span_diagnostic: span_handler, interner: @ident_interner, -}; +} -pub fn new_parse_sess(demitter: Option<Emitter>) -> parse_sess { +pub fn new_parse_sess(demitter: Option<Emitter>) -> @mut ParseSess { let cm = @CodeMap::new(); - return @{cm: cm, - mut next_id: 1, - span_diagnostic: mk_span_handler(mk_handler(demitter), cm), - interner: mk_ident_interner(), - }; + @mut ParseSess { + cm: cm, + next_id: 1, + span_diagnostic: mk_span_handler(mk_handler(demitter), cm), + interner: mk_ident_interner(), + } } pub fn new_parse_sess_special_handler(sh: span_handler, cm: @codemap::CodeMap) - -> parse_sess { - return @{cm: cm, - mut next_id: 1, - span_diagnostic: sh, - interner: mk_ident_interner(), - }; + -> @mut ParseSess { + @mut ParseSess { + cm: cm, + next_id: 1, + span_diagnostic: sh, + interner: mk_ident_interner(), + } } pub fn parse_crate_from_file(input: &Path, cfg: ast::crate_cfg, - sess: parse_sess) -> @ast::crate { + sess: @mut ParseSess) -> @ast::crate { let p = new_crate_parser_from_file(sess, cfg, input); let r = p.parse_crate_mod(cfg); return r; @@ -82,7 +84,7 @@ pub fn parse_crate_from_file(input: &Path, cfg: ast::crate_cfg, pub fn parse_crate_from_source_str(name: ~str, source: @~str, cfg: ast::crate_cfg, - sess: parse_sess) -> @ast::crate { + sess: @mut ParseSess) -> @ast::crate { let p = new_parser_from_source_str(sess, cfg, name, codemap::FssNone, source); let r = p.parse_crate_mod(cfg); @@ -93,7 +95,7 @@ pub fn parse_crate_from_source_str(name: ~str, pub fn parse_expr_from_source_str(name: ~str, source: @~str, cfg: ast::crate_cfg, - sess: parse_sess) -> @ast::expr { + sess: @mut ParseSess) -> @ast::expr { let p = new_parser_from_source_str(sess, cfg, name, codemap::FssNone, source); let r = p.parse_expr(); @@ -105,7 +107,7 @@ pub fn parse_item_from_source_str(name: ~str, source: @~str, cfg: ast::crate_cfg, +attrs: ~[ast::attribute], - sess: parse_sess) + sess: @mut ParseSess) -> Option<@ast::item> { let p = new_parser_from_source_str(sess, cfg, name, codemap::FssNone, source); @@ -118,7 +120,7 @@ pub fn parse_stmt_from_source_str(name: ~str, source: @~str, cfg: ast::crate_cfg, +attrs: ~[ast::attribute], - sess: parse_sess) -> @ast::stmt { + sess: @mut ParseSess) -> @ast::stmt { let p = new_parser_from_source_str(sess, cfg, name, codemap::FssNone, source); let r = p.parse_stmt(attrs); @@ -129,7 +131,7 @@ pub fn parse_stmt_from_source_str(name: ~str, pub fn parse_tts_from_source_str(name: ~str, source: @~str, cfg: ast::crate_cfg, - sess: parse_sess) -> ~[ast::token_tree] { + sess: @mut ParseSess) -> ~[ast::token_tree] { let p = new_parser_from_source_str(sess, cfg, name, codemap::FssNone, source); p.quote_depth += 1u; @@ -141,7 +143,7 @@ pub fn parse_tts_from_source_str(name: ~str, pub fn parse_from_source_str<T>(f: fn (p: Parser) -> T, name: ~str, ss: codemap::FileSubstr, source: @~str, cfg: ast::crate_cfg, - sess: parse_sess) + sess: @mut ParseSess) -> T { let p = new_parser_from_source_str(sess, cfg, name, ss, @@ -154,7 +156,7 @@ pub fn parse_from_source_str<T>(f: fn (p: Parser) -> T, r } -pub fn next_node_id(sess: parse_sess) -> node_id { +pub fn next_node_id(sess: @mut ParseSess) -> node_id { let rv = sess.next_id; sess.next_id += 1; // ID 0 is reserved for the crate and doesn't actually exist in the AST @@ -162,17 +164,17 @@ pub fn next_node_id(sess: parse_sess) -> node_id { return rv; } -pub fn new_parser_from_source_str(sess: parse_sess, cfg: ast::crate_cfg, +pub fn new_parser_from_source_str(sess: @mut ParseSess, cfg: ast::crate_cfg, +name: ~str, +ss: codemap::FileSubstr, source: @~str) -> Parser { let filemap = sess.cm.new_filemap_w_substr(name, ss, source); - let srdr = lexer::new_string_reader(sess.span_diagnostic, + let srdr = lexer::new_string_reader(copy sess.span_diagnostic, filemap, sess.interner); return Parser(sess, cfg, srdr as reader); } -pub fn new_parser_from_file(sess: parse_sess, +pub fn new_parser_from_file(sess: @mut ParseSess, cfg: ast::crate_cfg, path: &Path) -> Result<Parser, ~str> { @@ -180,7 +182,7 @@ pub fn new_parser_from_file(sess: parse_sess, result::Ok(src) => { let filemap = sess.cm.new_filemap(path.to_str(), @src); - let srdr = lexer::new_string_reader(sess.span_diagnostic, + let srdr = lexer::new_string_reader(copy sess.span_diagnostic, filemap, sess.interner); Ok(Parser(sess, cfg, srdr as reader)) @@ -192,7 +194,7 @@ pub fn new_parser_from_file(sess: parse_sess, /// Create a new parser for an entire crate, handling errors as appropriate /// if the file doesn't exist -pub fn new_crate_parser_from_file(sess: parse_sess, cfg: ast::crate_cfg, +pub fn new_crate_parser_from_file(sess: @mut ParseSess, cfg: ast::crate_cfg, path: &Path) -> Parser { match new_parser_from_file(sess, cfg, path) { Ok(parser) => parser, @@ -204,7 +206,7 @@ pub fn new_crate_parser_from_file(sess: parse_sess, cfg: ast::crate_cfg, /// Create a new parser based on a span from an existing parser. Handles /// error messages correctly when the file does not exist. -pub fn new_sub_parser_from_file(sess: parse_sess, cfg: ast::crate_cfg, +pub fn new_sub_parser_from_file(sess: @mut ParseSess, cfg: ast::crate_cfg, path: &Path, sp: span) -> Parser { match new_parser_from_file(sess, cfg, path) { Ok(parser) => parser, @@ -214,9 +216,9 @@ pub fn new_sub_parser_from_file(sess: parse_sess, cfg: ast::crate_cfg, } } -pub fn new_parser_from_tts(sess: parse_sess, cfg: ast::crate_cfg, +pub fn new_parser_from_tts(sess: @mut ParseSess, cfg: ast::crate_cfg, tts: ~[ast::token_tree]) -> Parser { - let trdr = lexer::new_tt_reader(sess.span_diagnostic, sess.interner, + let trdr = lexer::new_tt_reader(copy sess.span_diagnostic, sess.interner, None, tts); return Parser(sess, cfg, trdr as reader) } diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs index 644d6ed5189..a2e539becf4 100644 --- a/src/libsyntax/parse/parser.rs +++ b/src/libsyntax/parse/parser.rs @@ -79,7 +79,7 @@ use parse::prec::{as_prec, token_to_binop}; use parse::token::{can_begin_expr, is_ident, is_ident_or_path}; use parse::token::{is_plain_ident, INTERPOLATED, special_idents}; use parse::token; -use parse::{new_sub_parser_from_file, next_node_id, parse_sess}; +use parse::{new_sub_parser_from_file, next_node_id, ParseSess}; use print::pprust::expr_to_str; use util::interner::Interner; @@ -178,10 +178,16 @@ pure fn maybe_append(+lhs: ~[attribute], rhs: Option<~[attribute]>) } +struct ParsedItemsAndViewItems { + attrs_remaining: ~[attribute], + view_items: ~[@view_item], + items: ~[@item], + foreign_items: ~[@foreign_item] +} + /* ident is handled by common.rs */ -pub fn Parser(sess: parse_sess - , +pub fn Parser(sess: @mut ParseSess, cfg: ast::crate_cfg, +rdr: reader) -> Parser { @@ -212,7 +218,7 @@ pub fn Parser(sess: parse_sess } pub struct Parser { - sess: parse_sess, + sess: @mut ParseSess, cfg: crate_cfg, mut token: token::Token, mut span: span, @@ -1705,8 +1711,7 @@ pub impl Parser { els = Some(elexpr); hi = elexpr.span.hi; } - let q = {cond: cond, then: thn, els: els, lo: lo, hi: hi}; - self.mk_expr(q.lo, q.hi, expr_if(q.cond, q.then, q.els)) + self.mk_expr(lo, hi, expr_if(cond, thn, els)) } fn parse_fn_expr(sigil: Sigil) -> @expr { @@ -2469,11 +2474,11 @@ pub impl Parser { maybe_whole!(pair_empty self, nt_block); fn maybe_parse_inner_attrs_and_next(p: Parser, parse_attrs: bool) -> - {inner: ~[attribute], next: ~[attribute]} { + (~[attribute], ~[attribute]) { if parse_attrs { p.parse_inner_attrs_and_next() } else { - {inner: ~[], next: ~[]} + (~[], ~[]) } } @@ -2482,7 +2487,7 @@ pub impl Parser { self.obsolete(copy self.span, ObsoleteUnsafeBlock); } self.expect(token::LBRACE); - let {inner: inner, next: next} = + let (inner, next) = maybe_parse_inner_attrs_and_next(self, parse_attrs); return (inner, self.parse_block_tail_(lo, default_blk, next)); } @@ -2507,10 +2512,12 @@ pub impl Parser { let mut stmts = ~[]; let mut expr = None; - let {attrs_remaining: attrs_remaining, - view_items: view_items, - items: items, _} = - self.parse_items_and_view_items(first_item_attrs, + let ParsedItemsAndViewItems { + attrs_remaining: attrs_remaining, + view_items: view_items, + items: items, + _ + } = self.parse_items_and_view_items(first_item_attrs, IMPORTS_AND_ITEMS_ALLOWED, false); for items.each |item| { @@ -2845,10 +2852,10 @@ pub impl Parser { } } - fn parse_fn_header() -> {ident: ident, tps: ~[ty_param]} { + fn parse_fn_header() -> (ident, ~[ty_param]) { let id = self.parse_value_ident(); let ty_params = self.parse_ty_params(); - return {ident: id, tps: ty_params}; + (id, ty_params) } fn mk_item(+lo: BytePos, +hi: BytePos, +ident: ident, @@ -2863,10 +2870,10 @@ pub impl Parser { } fn parse_item_fn(purity: purity) -> item_info { - let t = self.parse_fn_header(); + let (ident, tps) = self.parse_fn_header(); let decl = self.parse_fn_decl(|p| p.parse_arg()); let (inner_attrs, body) = self.parse_inner_attrs_and_block(true); - (t.ident, item_fn(decl, purity, t.tps, body), Some(inner_attrs)) + (ident, item_fn(decl, purity, tps, body), Some(inner_attrs)) } fn parse_method_name() -> ident { @@ -3194,10 +3201,12 @@ pub impl Parser { fn parse_mod_items(term: token::Token, +first_item_attrs: ~[attribute]) -> _mod { // Shouldn't be any view items since we've already parsed an item attr - let {attrs_remaining: attrs_remaining, - view_items: view_items, - items: starting_items, _} = - self.parse_items_and_view_items(first_item_attrs, + let ParsedItemsAndViewItems { + attrs_remaining: attrs_remaining, + view_items: view_items, + items: starting_items, + _ + } = self.parse_items_and_view_items(first_item_attrs, VIEW_ITEMS_AND_ITEMS_ALLOWED, true); let mut items: ~[@item] = starting_items; @@ -3255,11 +3264,11 @@ pub impl Parser { } else { self.push_mod_path(id, outer_attrs); self.expect(token::LBRACE); - let inner_attrs = self.parse_inner_attrs_and_next(); - let m = self.parse_mod_items(token::RBRACE, inner_attrs.next); + let (inner, next) = self.parse_inner_attrs_and_next(); + let m = self.parse_mod_items(token::RBRACE, next); self.expect(token::RBRACE); self.pop_mod_path(); - (id, item_mod(m), Some(inner_attrs.inner)) + (id, item_mod(m), Some(inner)) }; // XXX: Transitionary hack to do the template work inside core @@ -3349,9 +3358,9 @@ pub impl Parser { let p0 = new_sub_parser_from_file(self.sess, self.cfg, &full_path, id_sp); - let inner_attrs = p0.parse_inner_attrs_and_next(); - let mod_attrs = vec::append(outer_attrs, inner_attrs.inner); - let first_item_outer_attrs = inner_attrs.next; + let (inner, next) = p0.parse_inner_attrs_and_next(); + let mod_attrs = vec::append(outer_attrs, inner); + let first_item_outer_attrs = next; let m0 = p0.parse_mod_items(token::EOF, first_item_outer_attrs); return (ast::item_mod(m0), mod_attrs); @@ -3367,13 +3376,13 @@ pub impl Parser { let lo = self.span.lo; let vis = self.parse_visibility(); let purity = self.parse_fn_purity(); - let t = self.parse_fn_header(); + let (ident, tps) = self.parse_fn_header(); let decl = self.parse_fn_decl(|p| p.parse_arg()); let mut hi = self.span.hi; self.expect(token::SEMI); - @ast::foreign_item { ident: t.ident, + @ast::foreign_item { ident: ident, attrs: attrs, - node: foreign_item_fn(decl, purity, t.tps), + node: foreign_item_fn(decl, purity, tps), id: self.get_id(), span: mk_sp(lo, hi), vis: vis } @@ -3422,11 +3431,12 @@ pub impl Parser { +first_item_attrs: ~[attribute]) -> foreign_mod { // Shouldn't be any view items since we've already parsed an item attr - let {attrs_remaining: attrs_remaining, - view_items: view_items, - items: _, - foreign_items: foreign_items} = - self.parse_items_and_view_items(first_item_attrs, + let ParsedItemsAndViewItems { + attrs_remaining: attrs_remaining, + view_items: view_items, + items: _, + foreign_items: foreign_items + } = self.parse_items_and_view_items(first_item_attrs, VIEW_ITEMS_AND_FOREIGN_ITEMS_ALLOWED, true); @@ -3498,17 +3508,13 @@ pub impl Parser { None => abi = special_idents::c_abi, } - let extra_attrs = self.parse_inner_attrs_and_next(); - let m = self.parse_foreign_mod_items(sort, - abi, - extra_attrs.next); + let (inner, next) = self.parse_inner_attrs_and_next(); + let m = self.parse_foreign_mod_items(sort, abi, next); self.expect(token::RBRACE); return iovi_item(self.mk_item(lo, self.last_span.hi, ident, - item_foreign_mod(m), visibility, - maybe_append(attrs, - Some(extra_attrs. - inner)))); + item_foreign_mod(m), visibility, + maybe_append(attrs, Some(inner)))); } match abi_opt { @@ -3530,20 +3536,20 @@ pub impl Parser { }) } - fn parse_type_decl() -> {lo: BytePos, ident: ident} { + fn parse_type_decl() -> (BytePos, ident) { let lo = self.last_span.lo; let id = self.parse_ident(); - return {lo: lo, ident: id}; + (lo, id) } fn parse_item_type() -> item_info { - let t = self.parse_type_decl(); + let (_, ident) = self.parse_type_decl(); self.parse_region_param(); let tps = self.parse_ty_params(); self.expect(token::EQ); let ty = self.parse_ty(false); self.expect(token::SEMI); - (t.ident, item_ty(ty, tps), None) + (ident, item_ty(ty, tps), None) } fn parse_region_param() { @@ -4040,10 +4046,7 @@ pub impl Parser { fn parse_items_and_view_items(+first_item_attrs: ~[attribute], mode: view_item_parse_mode, macros_allowed: bool) - -> {attrs_remaining: ~[attribute], - view_items: ~[@view_item], - items: ~[@item], - foreign_items: ~[@foreign_item]} { + -> ParsedItemsAndViewItems { let mut attrs = vec::append(first_item_attrs, self.parse_outer_attributes()); @@ -4094,21 +4097,23 @@ pub impl Parser { attrs = self.parse_outer_attributes(); } - {attrs_remaining: attrs, - view_items: view_items, - items: items, - foreign_items: foreign_items} + ParsedItemsAndViewItems { + attrs_remaining: attrs, + view_items: view_items, + items: items, + foreign_items: foreign_items + } } // Parses a source module as a crate fn parse_crate_mod(_cfg: crate_cfg) -> @crate { let lo = self.span.lo; - let crate_attrs = self.parse_inner_attrs_and_next(); - let first_item_outer_attrs = crate_attrs.next; + let (inner, next) = self.parse_inner_attrs_and_next(); + let first_item_outer_attrs = next; let m = self.parse_mod_items(token::EOF, first_item_outer_attrs); @spanned(lo, self.span.lo, ast::crate_ { module: m, - attrs: crate_attrs.inner, + attrs: inner, config: self.cfg }) } |
