diff options
Diffstat (limited to 'src/libsyntax/parse')
| -rw-r--r-- | src/libsyntax/parse/comments.rs | 36 | ||||
| -rw-r--r-- | src/libsyntax/parse/lexer.rs | 100 | ||||
| -rw-r--r-- | src/libsyntax/parse/mod.rs | 10 | ||||
| -rw-r--r-- | src/libsyntax/parse/parser.rs | 31 |
4 files changed, 83 insertions, 94 deletions
diff --git a/src/libsyntax/parse/comments.rs b/src/libsyntax/parse/comments.rs index f65bc3ad7a3..77b047a63c3 100644 --- a/src/libsyntax/parse/comments.rs +++ b/src/libsyntax/parse/comments.rs @@ -134,7 +134,7 @@ pub fn strip_doc_comment_decoration(comment: &str) -> ~str { fail!("not a doc-comment: {}", comment); } -fn read_to_eol(rdr: @StringReader) -> ~str { +fn read_to_eol(rdr: &StringReader) -> ~str { let mut val = ~""; while rdr.curr.get() != '\n' && !is_eof(rdr) { val.push_char(rdr.curr.get()); @@ -144,21 +144,21 @@ fn read_to_eol(rdr: @StringReader) -> ~str { return val; } -fn read_one_line_comment(rdr: @StringReader) -> ~str { +fn read_one_line_comment(rdr: &StringReader) -> ~str { let val = read_to_eol(rdr); assert!((val[0] == '/' as u8 && val[1] == '/' as u8) || (val[0] == '#' as u8 && val[1] == '!' as u8)); return val; } -fn consume_non_eol_whitespace(rdr: @StringReader) { +fn consume_non_eol_whitespace(rdr: &StringReader) { while is_whitespace(rdr.curr.get()) && rdr.curr.get() != '\n' && !is_eof(rdr) { bump(rdr); } } -fn push_blank_line_comment(rdr: @StringReader, comments: &mut ~[Comment]) { +fn push_blank_line_comment(rdr: &StringReader, comments: &mut ~[Comment]) { debug!(">>> blank-line comment"); let v: ~[~str] = ~[]; comments.push(Comment { @@ -168,7 +168,7 @@ fn push_blank_line_comment(rdr: @StringReader, comments: &mut ~[Comment]) { }); } -fn consume_whitespace_counting_blank_lines(rdr: @StringReader, +fn consume_whitespace_counting_blank_lines(rdr: &StringReader, comments: &mut ~[Comment]) { while is_whitespace(rdr.curr.get()) && !is_eof(rdr) { if rdr.col.get() == CharPos(0u) && rdr.curr.get() == '\n' { @@ -179,7 +179,7 @@ fn consume_whitespace_counting_blank_lines(rdr: @StringReader, } -fn read_shebang_comment(rdr: @StringReader, code_to_the_left: bool, +fn read_shebang_comment(rdr: &StringReader, code_to_the_left: bool, comments: &mut ~[Comment]) { debug!(">>> shebang comment"); let p = rdr.last_pos.get(); @@ -191,7 +191,7 @@ fn read_shebang_comment(rdr: @StringReader, code_to_the_left: bool, }); } -fn read_line_comments(rdr: @StringReader, code_to_the_left: bool, +fn read_line_comments(rdr: &StringReader, code_to_the_left: bool, comments: &mut ~[Comment]) { debug!(">>> line comments"); let p = rdr.last_pos.get(); @@ -248,7 +248,7 @@ fn trim_whitespace_prefix_and_push_line(lines: &mut ~[~str], lines.push(s1); } -fn read_block_comment(rdr: @StringReader, +fn read_block_comment(rdr: &StringReader, code_to_the_left: bool, comments: &mut ~[Comment]) { debug!(">>> block comment"); @@ -279,7 +279,7 @@ fn read_block_comment(rdr: @StringReader, while level > 0 { debug!("=== block comment level {}", level); if is_eof(rdr) { - (rdr as @Reader).fatal(~"unterminated block comment"); + rdr.fatal(~"unterminated block comment"); } if rdr.curr.get() == '\n' { trim_whitespace_prefix_and_push_line(&mut lines, curr_line, @@ -317,13 +317,13 @@ fn read_block_comment(rdr: @StringReader, comments.push(Comment {style: style, lines: lines, pos: p}); } -fn peeking_at_comment(rdr: @StringReader) -> bool { +fn peeking_at_comment(rdr: &StringReader) -> bool { return ((rdr.curr.get() == '/' && nextch(rdr) == '/') || (rdr.curr.get() == '/' && nextch(rdr) == '*')) || (rdr.curr.get() == '#' && nextch(rdr) == '!'); } -fn consume_comment(rdr: @StringReader, +fn consume_comment(rdr: &StringReader, code_to_the_left: bool, comments: &mut ~[Comment]) { debug!(">>> consume comment"); @@ -359,17 +359,17 @@ pub fn gather_comments_and_literals(span_diagnostic: let mut comments: ~[Comment] = ~[]; let mut literals: ~[Literal] = ~[]; let mut first_read: bool = true; - while !is_eof(rdr) { + while !is_eof(&rdr) { loop { let mut code_to_the_left = !first_read; - consume_non_eol_whitespace(rdr); + consume_non_eol_whitespace(&rdr); if rdr.curr.get() == '\n' { code_to_the_left = false; - consume_whitespace_counting_blank_lines(rdr, &mut comments); + consume_whitespace_counting_blank_lines(&rdr, &mut comments); } - while peeking_at_comment(rdr) { - consume_comment(rdr, code_to_the_left, &mut comments); - consume_whitespace_counting_blank_lines(rdr, &mut comments); + while peeking_at_comment(&rdr) { + consume_comment(&rdr, code_to_the_left, &mut comments); + consume_whitespace_counting_blank_lines(&rdr, &mut comments); } break; } @@ -380,7 +380,7 @@ pub fn gather_comments_and_literals(span_diagnostic: //discard, and look ahead; we're working with internal state let TokenAndSpan {tok: tok, sp: sp} = rdr.peek(); if token::is_lit(&tok) { - with_str_from(rdr, bstart, |s| { + with_str_from(&rdr, bstart, |s| { debug!("tok lit: {}", s); literals.push(Literal {lit: s.to_owned(), pos: sp.lo}); }) diff --git a/src/libsyntax/parse/lexer.rs b/src/libsyntax/parse/lexer.rs index 8c55990289a..1bcff324e08 100644 --- a/src/libsyntax/parse/lexer.rs +++ b/src/libsyntax/parse/lexer.rs @@ -12,8 +12,7 @@ use ast; use codemap::{BytePos, CharPos, CodeMap, Pos, Span}; use codemap; use diagnostic::SpanHandler; -use ext::tt::transcribe::{tt_next_token}; -use ext::tt::transcribe::{dup_tt_reader}; +use ext::tt::transcribe::{dup_tt_reader, tt_next_token}; use parse::token; use parse::token::{str_to_ident}; @@ -26,12 +25,12 @@ use std::util; pub use ext::tt::transcribe::{TtReader, new_tt_reader}; pub trait Reader { - fn is_eof(@self) -> bool; - fn next_token(@self) -> TokenAndSpan; - fn fatal(@self, ~str) -> !; - fn span_diag(@self) -> @SpanHandler; - fn peek(@self) -> TokenAndSpan; - fn dup(@self) -> @Reader; + fn is_eof(&self) -> bool; + fn next_token(&self) -> TokenAndSpan; + fn fatal(&self, ~str) -> !; + fn span_diag(&self) -> @SpanHandler; + fn peek(&self) -> TokenAndSpan; + fn dup(&self) -> ~Reader:; } #[deriving(Clone, Eq)] @@ -58,19 +57,19 @@ pub struct StringReader { pub fn new_string_reader(span_diagnostic: @SpanHandler, filemap: @codemap::FileMap) - -> @StringReader { + -> StringReader { let r = new_low_level_string_reader(span_diagnostic, filemap); - string_advance_token(r); /* fill in peek_* */ - return r; + string_advance_token(&r); /* fill in peek_* */ + r } /* For comments.rs, which hackily pokes into 'pos' and 'curr' */ pub fn new_low_level_string_reader(span_diagnostic: @SpanHandler, filemap: @codemap::FileMap) - -> @StringReader { + -> StringReader { // Force the initial reader bump to start on a fresh line let initial_char = '\n'; - let r = @StringReader { + let r = StringReader { span_diagnostic: span_diagnostic, pos: Cell::new(filemap.start_pos), last_pos: Cell::new(filemap.start_pos), @@ -81,15 +80,15 @@ pub fn new_low_level_string_reader(span_diagnostic: @SpanHandler, peek_tok: RefCell::new(token::EOF), peek_span: RefCell::new(codemap::DUMMY_SP), }; - bump(r); - return r; + bump(&r); + r } // duplicating the string reader is probably a bad idea, in // that using them will cause interleaved pushes of line // offsets to the underlying filemap... -fn dup_string_reader(r: @StringReader) -> @StringReader { - @StringReader { +fn dup_string_reader(r: &StringReader) -> StringReader { + StringReader { span_diagnostic: r.span_diagnostic, pos: Cell::new(r.pos.get()), last_pos: Cell::new(r.last_pos.get()), @@ -102,9 +101,9 @@ fn dup_string_reader(r: @StringReader) -> @StringReader { } impl Reader for StringReader { - fn is_eof(@self) -> bool { is_eof(self) } + fn is_eof(&self) -> bool { is_eof(self) } // return the next token. EFFECT: advances the string_reader. - fn next_token(@self) -> TokenAndSpan { + fn next_token(&self) -> TokenAndSpan { let ret_val = { let mut peek_tok = self.peek_tok.borrow_mut(); TokenAndSpan { @@ -115,45 +114,45 @@ impl Reader for StringReader { string_advance_token(self); ret_val } - fn fatal(@self, m: ~str) -> ! { + fn fatal(&self, m: ~str) -> ! { self.span_diagnostic.span_fatal(self.peek_span.get(), m) } - fn span_diag(@self) -> @SpanHandler { self.span_diagnostic } - fn peek(@self) -> TokenAndSpan { + fn span_diag(&self) -> @SpanHandler { self.span_diagnostic } + fn peek(&self) -> TokenAndSpan { // FIXME(pcwalton): Bad copy! TokenAndSpan { tok: self.peek_tok.get(), sp: self.peek_span.get(), } } - fn dup(@self) -> @Reader { dup_string_reader(self) as @Reader } + fn dup(&self) -> ~Reader: { ~dup_string_reader(self) as ~Reader: } } impl Reader for TtReader { - fn is_eof(@self) -> bool { + fn is_eof(&self) -> bool { let cur_tok = self.cur_tok.borrow(); *cur_tok.get() == token::EOF } - fn next_token(@self) -> TokenAndSpan { + fn next_token(&self) -> TokenAndSpan { let r = tt_next_token(self); debug!("TtReader: r={:?}", r); return r; } - fn fatal(@self, m: ~str) -> ! { + fn fatal(&self, m: ~str) -> ! { self.sp_diag.span_fatal(self.cur_span.get(), m); } - fn span_diag(@self) -> @SpanHandler { self.sp_diag } - fn peek(@self) -> TokenAndSpan { + fn span_diag(&self) -> @SpanHandler { self.sp_diag } + fn peek(&self) -> TokenAndSpan { TokenAndSpan { tok: self.cur_tok.get(), sp: self.cur_span.get(), } } - fn dup(@self) -> @Reader { dup_tt_reader(self) as @Reader } + fn dup(&self) -> ~Reader: { ~dup_tt_reader(self) as ~Reader: } } // report a lexical error spanning [`from_pos`, `to_pos`) -fn fatal_span(rdr: @StringReader, +fn fatal_span(rdr: &StringReader, from_pos: BytePos, to_pos: BytePos, m: ~str) @@ -164,7 +163,7 @@ fn fatal_span(rdr: @StringReader, // report a lexical error spanning [`from_pos`, `to_pos`), appending an // escaped character to the error message -fn fatal_span_char(rdr: @StringReader, +fn fatal_span_char(rdr: &StringReader, from_pos: BytePos, to_pos: BytePos, m: ~str, @@ -178,7 +177,7 @@ fn fatal_span_char(rdr: @StringReader, // report a lexical error spanning [`from_pos`, `to_pos`), appending the // offending string to the error message -fn fatal_span_verbose(rdr: @StringReader, +fn fatal_span_verbose(rdr: &StringReader, from_pos: BytePos, to_pos: BytePos, m: ~str) @@ -194,7 +193,7 @@ fn fatal_span_verbose(rdr: @StringReader, // EFFECT: advance peek_tok and peek_span to refer to the next token. // EFFECT: update the interner, maybe. -fn string_advance_token(r: @StringReader) { +fn string_advance_token(r: &StringReader) { match consume_whitespace_and_comments(r) { Some(comment) => { r.peek_span.set(comment.sp); @@ -221,7 +220,7 @@ fn byte_offset(rdr: &StringReader, pos: BytePos) -> BytePos { /// up to but excluding `rdr.last_pos`, meaning the slice does not include /// the character `rdr.curr`. pub fn with_str_from<T>( - rdr: @StringReader, + rdr: &StringReader, start: BytePos, f: |s: &str| -> T) -> T { @@ -231,7 +230,7 @@ pub fn with_str_from<T>( /// Calls `f` with astring slice of the source text spanning from `start` /// up to but excluding `end`. fn with_str_from_to<T>( - rdr: @StringReader, + rdr: &StringReader, start: BytePos, end: BytePos, f: |s: &str| -> T) @@ -269,10 +268,10 @@ pub fn bump(rdr: &StringReader) { rdr.curr.set(unsafe { transmute(-1u32) }); // FIXME: #8971: unsound } } -pub fn is_eof(rdr: @StringReader) -> bool { +pub fn is_eof(rdr: &StringReader) -> bool { rdr.curr.get() == unsafe { transmute(-1u32) } // FIXME: #8971: unsound } -pub fn nextch(rdr: @StringReader) -> char { +pub fn nextch(rdr: &StringReader) -> char { let offset = byte_offset(rdr, rdr.pos.get()).to_uint(); if offset < (rdr.filemap.src).len() { return rdr.filemap.src.char_at(offset); @@ -303,7 +302,7 @@ fn is_hex_digit(c: char) -> bool { // EFFECT: eats whitespace and comments. // returns a Some(sugared-doc-attr) if one exists, None otherwise. -fn consume_whitespace_and_comments(rdr: @StringReader) +fn consume_whitespace_and_comments(rdr: &StringReader) -> Option<TokenAndSpan> { while is_whitespace(rdr.curr.get()) { bump(rdr); } return consume_any_line_comment(rdr); @@ -316,7 +315,7 @@ pub fn is_line_non_doc_comment(s: &str) -> bool { // PRECONDITION: rdr.curr is not whitespace // EFFECT: eats any kind of comment. // returns a Some(sugared-doc-attr) if one exists, None otherwise -fn consume_any_line_comment(rdr: @StringReader) +fn consume_any_line_comment(rdr: &StringReader) -> Option<TokenAndSpan> { if rdr.curr.get() == '/' { match nextch(rdr) { @@ -377,7 +376,7 @@ pub fn is_block_non_doc_comment(s: &str) -> bool { } // might return a sugared-doc-attr -fn consume_block_comment(rdr: @StringReader) -> Option<TokenAndSpan> { +fn consume_block_comment(rdr: &StringReader) -> Option<TokenAndSpan> { // block comments starting with "/**" or "/*!" are doc-comments let is_doc_comment = rdr.curr.get() == '*' || rdr.curr.get() == '!'; let start_bpos = rdr.pos.get() - BytePos(if is_doc_comment {3} else {2}); @@ -424,7 +423,7 @@ fn consume_block_comment(rdr: @StringReader) -> Option<TokenAndSpan> { if res.is_some() { res } else { consume_whitespace_and_comments(rdr) } } -fn scan_exponent(rdr: @StringReader, start_bpos: BytePos) -> Option<~str> { +fn scan_exponent(rdr: &StringReader, start_bpos: BytePos) -> Option<~str> { let mut c = rdr.curr.get(); let mut rslt = ~""; if c == 'e' || c == 'E' { @@ -445,7 +444,7 @@ fn scan_exponent(rdr: @StringReader, start_bpos: BytePos) -> Option<~str> { } else { return None::<~str>; } } -fn scan_digits(rdr: @StringReader, radix: uint) -> ~str { +fn scan_digits(rdr: &StringReader, radix: uint) -> ~str { let mut rslt = ~""; loop { let c = rdr.curr.get(); @@ -460,7 +459,7 @@ fn scan_digits(rdr: @StringReader, radix: uint) -> ~str { }; } -fn check_float_base(rdr: @StringReader, start_bpos: BytePos, last_bpos: BytePos, +fn check_float_base(rdr: &StringReader, start_bpos: BytePos, last_bpos: BytePos, base: uint) { match base { 16u => fatal_span(rdr, start_bpos, last_bpos, @@ -473,7 +472,7 @@ fn check_float_base(rdr: @StringReader, start_bpos: BytePos, last_bpos: BytePos, } } -fn scan_number(c: char, rdr: @StringReader) -> token::Token { +fn scan_number(c: char, rdr: &StringReader) -> token::Token { let mut num_str; let mut base = 10u; let mut c = c; @@ -599,7 +598,7 @@ fn scan_number(c: char, rdr: @StringReader) -> token::Token { } } -fn scan_numeric_escape(rdr: @StringReader, n_hex_digits: uint) -> char { +fn scan_numeric_escape(rdr: &StringReader, n_hex_digits: uint) -> char { let mut accum_int = 0; let mut i = n_hex_digits; let start_bpos = rdr.last_pos.get(); @@ -640,7 +639,7 @@ fn ident_continue(c: char) -> bool { // return the next token from the string // EFFECT: advances the input past that token // EFFECT: updates the interner -fn next_token_inner(rdr: @StringReader) -> token::Token { +fn next_token_inner(rdr: &StringReader) -> token::Token { let c = rdr.curr.get(); if ident_start(c) && nextch(rdr) != '"' && nextch(rdr) != '#' { // Note: r as in r" or r#" is part of a raw string literal, @@ -665,7 +664,7 @@ fn next_token_inner(rdr: @StringReader) -> token::Token { if is_dec_digit(c) { return scan_number(c, rdr); } - fn binop(rdr: @StringReader, op: token::BinOp) -> token::Token { + fn binop(rdr: &StringReader, op: token::BinOp) -> token::Token { bump(rdr); if rdr.curr.get() == '=' { bump(rdr); @@ -953,7 +952,7 @@ fn next_token_inner(rdr: @StringReader) -> token::Token { } } -fn consume_whitespace(rdr: @StringReader) { +fn consume_whitespace(rdr: &StringReader) { while is_whitespace(rdr.curr.get()) && !is_eof(rdr) { bump(rdr); } } @@ -968,15 +967,14 @@ mod test { // represents a testing reader (incl. both reader and interner) struct Env { - string_reader: @StringReader + string_reader: StringReader } // open a string reader for the given string fn setup(teststr: ~str) -> Env { let cm = CodeMap::new(); let fm = cm.new_filemap(~"zebra.rs", teststr); - let span_handler = - diagnostic::mk_span_handler(diagnostic::mk_handler(None),@cm); + let span_handler = diagnostic::mk_span_handler(diagnostic::mk_handler(), @cm); Env { string_reader: new_string_reader(span_handler,fm) } diff --git a/src/libsyntax/parse/mod.rs b/src/libsyntax/parse/mod.rs index 050ff5cef32..6ddb4bbc11f 100644 --- a/src/libsyntax/parse/mod.rs +++ b/src/libsyntax/parse/mod.rs @@ -14,7 +14,7 @@ use ast; use codemap::{Span, CodeMap, FileMap}; use codemap; -use diagnostic::{SpanHandler, mk_span_handler, mk_handler, Emitter}; +use diagnostic::{SpanHandler, mk_span_handler, mk_handler}; use parse::attr::ParserAttr; use parse::parser::Parser; @@ -45,11 +45,11 @@ pub struct ParseSess { included_mod_stack: RefCell<~[Path]>, } -pub fn new_parse_sess(demitter: Option<@Emitter>) -> @ParseSess { +pub fn new_parse_sess() -> @ParseSess { let cm = @CodeMap::new(); @ParseSess { cm: cm, - span_diagnostic: mk_span_handler(mk_handler(demitter), cm), + span_diagnostic: mk_span_handler(mk_handler(), cm), included_mod_stack: RefCell::new(~[]), } } @@ -261,7 +261,7 @@ pub fn filemap_to_tts(sess: @ParseSess, filemap: @FileMap) // parsing tt's probably shouldn't require a parser at all. let cfg = ~[]; let srdr = lexer::new_string_reader(sess.span_diagnostic, filemap); - let mut p1 = Parser(sess, cfg, srdr as @lexer::Reader); + let mut p1 = Parser(sess, cfg, ~srdr); p1.parse_all_token_trees() } @@ -270,7 +270,7 @@ pub fn tts_to_parser(sess: @ParseSess, tts: ~[ast::TokenTree], cfg: ast::CrateConfig) -> Parser { let trdr = lexer::new_tt_reader(sess.span_diagnostic, None, tts); - Parser(sess, cfg, trdr as @lexer::Reader) + Parser(sess, cfg, ~trdr) } // abort if necessary diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs index b80c222d4dc..e1cbdd12bd3 100644 --- a/src/libsyntax/parse/parser.rs +++ b/src/libsyntax/parse/parser.rs @@ -48,7 +48,7 @@ use ast::{RetStyle, Return, BiShl, BiShr, Stmt, StmtDecl}; use ast::{StmtExpr, StmtSemi, StmtMac, StructDef, StructField}; use ast::{StructVariantKind, BiSub}; use ast::StrStyle; -use ast::{SelfBox, SelfRegion, SelfStatic, SelfUniq, SelfValue}; +use ast::{SelfRegion, SelfStatic, SelfUniq, SelfValue}; use ast::{TokenTree, TraitMethod, TraitRef, TTDelim, TTSeq, TTTok}; use ast::{TTNonterminal, TupleVariantKind, Ty, Ty_, TyBot, TyBox}; use ast::{TypeField, TyFixedLengthVec, TyClosure, TyBareFn, TyTypeof}; @@ -285,7 +285,7 @@ struct ParsedItemsAndViewItems { /* ident is handled by common.rs */ -pub fn Parser(sess: @ParseSess, cfg: ast::CrateConfig, rdr: @Reader) +pub fn Parser(sess: @ParseSess, cfg: ast::CrateConfig, rdr: ~Reader:) -> Parser { let tok0 = rdr.next_token(); let interner = get_ident_interner(); @@ -339,7 +339,7 @@ pub struct Parser { tokens_consumed: uint, restriction: restriction, quote_depth: uint, // not (yet) related to the quasiquoter - reader: @Reader, + reader: ~Reader:, interner: @token::IdentInterner, /// The set of seen errors about obsolete syntax. Used to suppress /// extra detail when the same error is seen twice @@ -3580,19 +3580,6 @@ impl Parser { // that may have a self type. fn parse_fn_decl_with_self(&mut self, parse_arg_fn: |&mut Parser| -> Arg) -> (ExplicitSelf, P<FnDecl>) { - fn maybe_parse_explicit_self(explicit_self: ast::ExplicitSelf_, - p: &mut Parser) - -> ast::ExplicitSelf_ { - // We need to make sure it isn't a type - if p.look_ahead(1, |t| token::is_keyword(keywords::Self, t)) { - p.bump(); - p.expect_self_ident(); - explicit_self - } else { - SelfStatic - } - } - fn maybe_parse_borrowed_explicit_self(this: &mut Parser) -> ast::ExplicitSelf_ { // The following things are possible to see here: @@ -3650,11 +3637,15 @@ impl Parser { token::BINOP(token::AND) => { maybe_parse_borrowed_explicit_self(self) } - token::AT => { - maybe_parse_explicit_self(SelfBox, self) - } token::TILDE => { - maybe_parse_explicit_self(SelfUniq, self) + // We need to make sure it isn't a type + if self.look_ahead(1, |t| token::is_keyword(keywords::Self, t)) { + self.bump(); + self.expect_self_ident(); + SelfUniq + } else { + SelfStatic + } } token::IDENT(..) if self.is_self_ident() => { self.bump(); |
