libsyntax: De-`@mut` `StringReader`, `TtReader`, and `reader`
This commit is contained in:
parent
2b83377b29
commit
7e1b535eb1
|
@ -25,7 +25,7 @@ pub fn expand_trace_macros(cx: &mut ExtCtxt,
|
||||||
let tt_rdr = new_tt_reader(cx.parse_sess().span_diagnostic,
|
let tt_rdr = new_tt_reader(cx.parse_sess().span_diagnostic,
|
||||||
None,
|
None,
|
||||||
tt.to_owned());
|
tt.to_owned());
|
||||||
let rdr = tt_rdr as @mut reader;
|
let rdr = tt_rdr as @reader;
|
||||||
let mut rust_parser = Parser(sess, cfg.clone(), rdr.dup());
|
let mut rust_parser = Parser(sess, cfg.clone(), rdr.dup());
|
||||||
|
|
||||||
if rust_parser.is_keyword(keywords::True) {
|
if rust_parser.is_keyword(keywords::True) {
|
||||||
|
|
|
@ -221,12 +221,11 @@ pub enum parse_result {
|
||||||
error(codemap::Span, ~str)
|
error(codemap::Span, ~str)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn parse_or_else(
|
pub fn parse_or_else(sess: @ParseSess,
|
||||||
sess: @ParseSess,
|
cfg: ast::CrateConfig,
|
||||||
cfg: ast::CrateConfig,
|
rdr: @reader,
|
||||||
rdr: @mut reader,
|
ms: ~[matcher])
|
||||||
ms: ~[matcher]
|
-> HashMap<Ident, @named_match> {
|
||||||
) -> HashMap<Ident, @named_match> {
|
|
||||||
match parse(sess, cfg, rdr, ms) {
|
match parse(sess, cfg, rdr, ms) {
|
||||||
success(m) => m,
|
success(m) => m,
|
||||||
failure(sp, str) => sess.span_diagnostic.span_fatal(sp, str),
|
failure(sp, str) => sess.span_diagnostic.span_fatal(sp, str),
|
||||||
|
@ -245,7 +244,7 @@ pub fn token_name_eq(t1 : &Token, t2 : &Token) -> bool {
|
||||||
|
|
||||||
pub fn parse(sess: @ParseSess,
|
pub fn parse(sess: @ParseSess,
|
||||||
cfg: ast::CrateConfig,
|
cfg: ast::CrateConfig,
|
||||||
rdr: @mut reader,
|
rdr: @reader,
|
||||||
ms: &[matcher])
|
ms: &[matcher])
|
||||||
-> parse_result {
|
-> parse_result {
|
||||||
let mut cur_eis = ~[];
|
let mut cur_eis = ~[];
|
||||||
|
|
|
@ -130,11 +130,7 @@ fn generic_extension(cx: &ExtCtxt,
|
||||||
match *lhs {
|
match *lhs {
|
||||||
@matched_nonterminal(nt_matchers(ref mtcs)) => {
|
@matched_nonterminal(nt_matchers(ref mtcs)) => {
|
||||||
// `none` is because we're not interpolating
|
// `none` is because we're not interpolating
|
||||||
let arg_rdr = new_tt_reader(
|
let arg_rdr = new_tt_reader(s_d, None, arg.to_owned()) as @reader;
|
||||||
s_d,
|
|
||||||
None,
|
|
||||||
arg.to_owned()
|
|
||||||
) as @mut reader;
|
|
||||||
match parse(cx.parse_sess(), cx.cfg(), arg_rdr, *mtcs) {
|
match parse(cx.parse_sess(), cx.cfg(), arg_rdr, *mtcs) {
|
||||||
success(named_matches) => {
|
success(named_matches) => {
|
||||||
let rhs = match rhses[i] {
|
let rhs = match rhses[i] {
|
||||||
|
@ -154,10 +150,7 @@ fn generic_extension(cx: &ExtCtxt,
|
||||||
// rhs has holes ( `$id` and `$(...)` that need filled)
|
// rhs has holes ( `$id` and `$(...)` that need filled)
|
||||||
let trncbr = new_tt_reader(s_d, Some(named_matches),
|
let trncbr = new_tt_reader(s_d, Some(named_matches),
|
||||||
rhs);
|
rhs);
|
||||||
let p = Parser(cx.parse_sess(),
|
let p = Parser(cx.parse_sess(), cx.cfg(), trncbr as @reader);
|
||||||
cx.cfg(),
|
|
||||||
trncbr as @mut reader);
|
|
||||||
|
|
||||||
// Let the context choose how to interpret the result.
|
// Let the context choose how to interpret the result.
|
||||||
// Weird, but useful for X-macros.
|
// Weird, but useful for X-macros.
|
||||||
return MRAny(@ParserAnyMacro {
|
return MRAny(@ParserAnyMacro {
|
||||||
|
@ -218,7 +211,7 @@ pub fn add_new_extension(cx: &mut ExtCtxt,
|
||||||
arg.clone());
|
arg.clone());
|
||||||
let argument_map = parse_or_else(cx.parse_sess(),
|
let argument_map = parse_or_else(cx.parse_sess(),
|
||||||
cx.cfg(),
|
cx.cfg(),
|
||||||
arg_reader as @mut reader,
|
arg_reader as @reader,
|
||||||
argument_gram);
|
argument_gram);
|
||||||
|
|
||||||
// Extract the arguments:
|
// Extract the arguments:
|
||||||
|
|
|
@ -49,8 +49,8 @@ pub struct TtReader {
|
||||||
pub fn new_tt_reader(sp_diag: @mut SpanHandler,
|
pub fn new_tt_reader(sp_diag: @mut SpanHandler,
|
||||||
interp: Option<HashMap<Ident,@named_match>>,
|
interp: Option<HashMap<Ident,@named_match>>,
|
||||||
src: ~[ast::token_tree])
|
src: ~[ast::token_tree])
|
||||||
-> @mut TtReader {
|
-> @TtReader {
|
||||||
let r = @mut TtReader {
|
let r = @TtReader {
|
||||||
sp_diag: sp_diag,
|
sp_diag: sp_diag,
|
||||||
stack: RefCell::new(@mut TtFrame {
|
stack: RefCell::new(@mut TtFrame {
|
||||||
forest: @src,
|
forest: @src,
|
||||||
|
@ -86,8 +86,8 @@ fn dup_tt_frame(f: @mut TtFrame) -> @mut TtFrame {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn dup_tt_reader(r: @mut TtReader) -> @mut TtReader {
|
pub fn dup_tt_reader(r: @TtReader) -> @TtReader {
|
||||||
@mut TtReader {
|
@TtReader {
|
||||||
sp_diag: r.sp_diag,
|
sp_diag: r.sp_diag,
|
||||||
stack: RefCell::new(dup_tt_frame(r.stack.get())),
|
stack: RefCell::new(dup_tt_frame(r.stack.get())),
|
||||||
repeat_idx: r.repeat_idx.clone(),
|
repeat_idx: r.repeat_idx.clone(),
|
||||||
|
@ -99,9 +99,8 @@ pub fn dup_tt_reader(r: @mut TtReader) -> @mut TtReader {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
fn lookup_cur_matched_by_matched(r: &mut TtReader,
|
fn lookup_cur_matched_by_matched(r: &TtReader, start: @named_match)
|
||||||
start: @named_match)
|
-> @named_match {
|
||||||
-> @named_match {
|
|
||||||
fn red(ad: @named_match, idx: &uint) -> @named_match {
|
fn red(ad: @named_match, idx: &uint) -> @named_match {
|
||||||
match *ad {
|
match *ad {
|
||||||
matched_nonterminal(_) => {
|
matched_nonterminal(_) => {
|
||||||
|
@ -115,7 +114,7 @@ fn lookup_cur_matched_by_matched(r: &mut TtReader,
|
||||||
repeat_idx.get().iter().fold(start, red)
|
repeat_idx.get().iter().fold(start, red)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn lookup_cur_matched(r: &mut TtReader, name: Ident) -> @named_match {
|
fn lookup_cur_matched(r: &TtReader, name: Ident) -> @named_match {
|
||||||
let matched_opt = {
|
let matched_opt = {
|
||||||
let interpolations = r.interpolations.borrow();
|
let interpolations = r.interpolations.borrow();
|
||||||
interpolations.get().find_copy(&name)
|
interpolations.get().find_copy(&name)
|
||||||
|
@ -137,7 +136,7 @@ enum lis {
|
||||||
lis_contradiction(~str),
|
lis_contradiction(~str),
|
||||||
}
|
}
|
||||||
|
|
||||||
fn lockstep_iter_size(t: &token_tree, r: &mut TtReader) -> lis {
|
fn lockstep_iter_size(t: &token_tree, r: &TtReader) -> lis {
|
||||||
fn lis_merge(lhs: lis, rhs: lis) -> lis {
|
fn lis_merge(lhs: lis, rhs: lis) -> lis {
|
||||||
match lhs {
|
match lhs {
|
||||||
lis_unconstrained => rhs.clone(),
|
lis_unconstrained => rhs.clone(),
|
||||||
|
@ -173,7 +172,7 @@ fn lockstep_iter_size(t: &token_tree, r: &mut TtReader) -> lis {
|
||||||
|
|
||||||
// return the next token from the TtReader.
|
// return the next token from the TtReader.
|
||||||
// EFFECT: advances the reader's token field
|
// EFFECT: advances the reader's token field
|
||||||
pub fn tt_next_token(r: &mut TtReader) -> TokenAndSpan {
|
pub fn tt_next_token(r: &TtReader) -> TokenAndSpan {
|
||||||
// XXX(pcwalton): Bad copy?
|
// XXX(pcwalton): Bad copy?
|
||||||
let ret_val = TokenAndSpan {
|
let ret_val = TokenAndSpan {
|
||||||
tok: r.cur_tok.get(),
|
tok: r.cur_tok.get(),
|
||||||
|
|
|
@ -135,7 +135,7 @@ pub fn strip_doc_comment_decoration(comment: &str) -> ~str {
|
||||||
fail!("not a doc-comment: {}", comment);
|
fail!("not a doc-comment: {}", comment);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn read_to_eol(rdr: @mut StringReader) -> ~str {
|
fn read_to_eol(rdr: @StringReader) -> ~str {
|
||||||
let mut val = ~"";
|
let mut val = ~"";
|
||||||
while rdr.curr.get() != '\n' && !is_eof(rdr) {
|
while rdr.curr.get() != '\n' && !is_eof(rdr) {
|
||||||
val.push_char(rdr.curr.get());
|
val.push_char(rdr.curr.get());
|
||||||
|
@ -145,21 +145,21 @@ fn read_to_eol(rdr: @mut StringReader) -> ~str {
|
||||||
return val;
|
return val;
|
||||||
}
|
}
|
||||||
|
|
||||||
fn read_one_line_comment(rdr: @mut StringReader) -> ~str {
|
fn read_one_line_comment(rdr: @StringReader) -> ~str {
|
||||||
let val = read_to_eol(rdr);
|
let val = read_to_eol(rdr);
|
||||||
assert!((val[0] == '/' as u8 && val[1] == '/' as u8) ||
|
assert!((val[0] == '/' as u8 && val[1] == '/' as u8) ||
|
||||||
(val[0] == '#' as u8 && val[1] == '!' as u8));
|
(val[0] == '#' as u8 && val[1] == '!' as u8));
|
||||||
return val;
|
return val;
|
||||||
}
|
}
|
||||||
|
|
||||||
fn consume_non_eol_whitespace(rdr: @mut StringReader) {
|
fn consume_non_eol_whitespace(rdr: @StringReader) {
|
||||||
while is_whitespace(rdr.curr.get()) && rdr.curr.get() != '\n' &&
|
while is_whitespace(rdr.curr.get()) && rdr.curr.get() != '\n' &&
|
||||||
!is_eof(rdr) {
|
!is_eof(rdr) {
|
||||||
bump(rdr);
|
bump(rdr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn push_blank_line_comment(rdr: @mut StringReader, comments: &mut ~[cmnt]) {
|
fn push_blank_line_comment(rdr: @StringReader, comments: &mut ~[cmnt]) {
|
||||||
debug!(">>> blank-line comment");
|
debug!(">>> blank-line comment");
|
||||||
let v: ~[~str] = ~[];
|
let v: ~[~str] = ~[];
|
||||||
comments.push(cmnt {
|
comments.push(cmnt {
|
||||||
|
@ -169,7 +169,7 @@ fn push_blank_line_comment(rdr: @mut StringReader, comments: &mut ~[cmnt]) {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
fn consume_whitespace_counting_blank_lines(rdr: @mut StringReader,
|
fn consume_whitespace_counting_blank_lines(rdr: @StringReader,
|
||||||
comments: &mut ~[cmnt]) {
|
comments: &mut ~[cmnt]) {
|
||||||
while is_whitespace(rdr.curr.get()) && !is_eof(rdr) {
|
while is_whitespace(rdr.curr.get()) && !is_eof(rdr) {
|
||||||
if rdr.col.get() == CharPos(0u) && rdr.curr.get() == '\n' {
|
if rdr.col.get() == CharPos(0u) && rdr.curr.get() == '\n' {
|
||||||
|
@ -180,7 +180,7 @@ fn consume_whitespace_counting_blank_lines(rdr: @mut StringReader,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
fn read_shebang_comment(rdr: @mut StringReader, code_to_the_left: bool,
|
fn read_shebang_comment(rdr: @StringReader, code_to_the_left: bool,
|
||||||
comments: &mut ~[cmnt]) {
|
comments: &mut ~[cmnt]) {
|
||||||
debug!(">>> shebang comment");
|
debug!(">>> shebang comment");
|
||||||
let p = rdr.last_pos.get();
|
let p = rdr.last_pos.get();
|
||||||
|
@ -192,7 +192,7 @@ fn read_shebang_comment(rdr: @mut StringReader, code_to_the_left: bool,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
fn read_line_comments(rdr: @mut StringReader, code_to_the_left: bool,
|
fn read_line_comments(rdr: @StringReader, code_to_the_left: bool,
|
||||||
comments: &mut ~[cmnt]) {
|
comments: &mut ~[cmnt]) {
|
||||||
debug!(">>> line comments");
|
debug!(">>> line comments");
|
||||||
let p = rdr.last_pos.get();
|
let p = rdr.last_pos.get();
|
||||||
|
@ -249,7 +249,7 @@ fn trim_whitespace_prefix_and_push_line(lines: &mut ~[~str],
|
||||||
lines.push(s1);
|
lines.push(s1);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn read_block_comment(rdr: @mut StringReader,
|
fn read_block_comment(rdr: @StringReader,
|
||||||
code_to_the_left: bool,
|
code_to_the_left: bool,
|
||||||
comments: &mut ~[cmnt]) {
|
comments: &mut ~[cmnt]) {
|
||||||
debug!(">>> block comment");
|
debug!(">>> block comment");
|
||||||
|
@ -280,7 +280,7 @@ fn read_block_comment(rdr: @mut StringReader,
|
||||||
while level > 0 {
|
while level > 0 {
|
||||||
debug!("=== block comment level {}", level);
|
debug!("=== block comment level {}", level);
|
||||||
if is_eof(rdr) {
|
if is_eof(rdr) {
|
||||||
(rdr as @mut reader).fatal(~"unterminated block comment");
|
(rdr as @reader).fatal(~"unterminated block comment");
|
||||||
}
|
}
|
||||||
if rdr.curr.get() == '\n' {
|
if rdr.curr.get() == '\n' {
|
||||||
trim_whitespace_prefix_and_push_line(&mut lines, curr_line,
|
trim_whitespace_prefix_and_push_line(&mut lines, curr_line,
|
||||||
|
@ -318,13 +318,13 @@ fn read_block_comment(rdr: @mut StringReader,
|
||||||
comments.push(cmnt {style: style, lines: lines, pos: p});
|
comments.push(cmnt {style: style, lines: lines, pos: p});
|
||||||
}
|
}
|
||||||
|
|
||||||
fn peeking_at_comment(rdr: @mut StringReader) -> bool {
|
fn peeking_at_comment(rdr: @StringReader) -> bool {
|
||||||
return ((rdr.curr.get() == '/' && nextch(rdr) == '/') ||
|
return ((rdr.curr.get() == '/' && nextch(rdr) == '/') ||
|
||||||
(rdr.curr.get() == '/' && nextch(rdr) == '*')) ||
|
(rdr.curr.get() == '/' && nextch(rdr) == '*')) ||
|
||||||
(rdr.curr.get() == '#' && nextch(rdr) == '!');
|
(rdr.curr.get() == '#' && nextch(rdr) == '!');
|
||||||
}
|
}
|
||||||
|
|
||||||
fn consume_comment(rdr: @mut StringReader,
|
fn consume_comment(rdr: @StringReader,
|
||||||
code_to_the_left: bool,
|
code_to_the_left: bool,
|
||||||
comments: &mut ~[cmnt]) {
|
comments: &mut ~[cmnt]) {
|
||||||
debug!(">>> consume comment");
|
debug!(">>> consume comment");
|
||||||
|
|
|
@ -26,12 +26,12 @@ use std::util;
|
||||||
pub use ext::tt::transcribe::{TtReader, new_tt_reader};
|
pub use ext::tt::transcribe::{TtReader, new_tt_reader};
|
||||||
|
|
||||||
pub trait reader {
|
pub trait reader {
|
||||||
fn is_eof(@mut self) -> bool;
|
fn is_eof(@self) -> bool;
|
||||||
fn next_token(@mut self) -> TokenAndSpan;
|
fn next_token(@self) -> TokenAndSpan;
|
||||||
fn fatal(@mut self, ~str) -> !;
|
fn fatal(@self, ~str) -> !;
|
||||||
fn span_diag(@mut self) -> @mut SpanHandler;
|
fn span_diag(@self) -> @mut SpanHandler;
|
||||||
fn peek(@mut self) -> TokenAndSpan;
|
fn peek(@self) -> TokenAndSpan;
|
||||||
fn dup(@mut self) -> @mut reader;
|
fn dup(@self) -> @reader;
|
||||||
}
|
}
|
||||||
|
|
||||||
#[deriving(Clone, Eq)]
|
#[deriving(Clone, Eq)]
|
||||||
|
@ -59,7 +59,7 @@ pub struct StringReader {
|
||||||
|
|
||||||
pub fn new_string_reader(span_diagnostic: @mut SpanHandler,
|
pub fn new_string_reader(span_diagnostic: @mut SpanHandler,
|
||||||
filemap: @codemap::FileMap)
|
filemap: @codemap::FileMap)
|
||||||
-> @mut StringReader {
|
-> @StringReader {
|
||||||
let r = new_low_level_string_reader(span_diagnostic, filemap);
|
let r = new_low_level_string_reader(span_diagnostic, filemap);
|
||||||
string_advance_token(r); /* fill in peek_* */
|
string_advance_token(r); /* fill in peek_* */
|
||||||
return r;
|
return r;
|
||||||
|
@ -68,10 +68,10 @@ pub fn new_string_reader(span_diagnostic: @mut SpanHandler,
|
||||||
/* For comments.rs, which hackily pokes into 'pos' and 'curr' */
|
/* For comments.rs, which hackily pokes into 'pos' and 'curr' */
|
||||||
pub fn new_low_level_string_reader(span_diagnostic: @mut SpanHandler,
|
pub fn new_low_level_string_reader(span_diagnostic: @mut SpanHandler,
|
||||||
filemap: @codemap::FileMap)
|
filemap: @codemap::FileMap)
|
||||||
-> @mut StringReader {
|
-> @StringReader {
|
||||||
// Force the initial reader bump to start on a fresh line
|
// Force the initial reader bump to start on a fresh line
|
||||||
let initial_char = '\n';
|
let initial_char = '\n';
|
||||||
let r = @mut StringReader {
|
let r = @StringReader {
|
||||||
span_diagnostic: span_diagnostic,
|
span_diagnostic: span_diagnostic,
|
||||||
src: filemap.src,
|
src: filemap.src,
|
||||||
pos: Cell::new(filemap.start_pos),
|
pos: Cell::new(filemap.start_pos),
|
||||||
|
@ -90,8 +90,8 @@ pub fn new_low_level_string_reader(span_diagnostic: @mut SpanHandler,
|
||||||
// duplicating the string reader is probably a bad idea, in
|
// duplicating the string reader is probably a bad idea, in
|
||||||
// that using them will cause interleaved pushes of line
|
// that using them will cause interleaved pushes of line
|
||||||
// offsets to the underlying filemap...
|
// offsets to the underlying filemap...
|
||||||
fn dup_string_reader(r: @mut StringReader) -> @mut StringReader {
|
fn dup_string_reader(r: @StringReader) -> @StringReader {
|
||||||
@mut StringReader {
|
@StringReader {
|
||||||
span_diagnostic: r.span_diagnostic,
|
span_diagnostic: r.span_diagnostic,
|
||||||
src: r.src,
|
src: r.src,
|
||||||
pos: Cell::new(r.pos.get()),
|
pos: Cell::new(r.pos.get()),
|
||||||
|
@ -105,9 +105,9 @@ fn dup_string_reader(r: @mut StringReader) -> @mut StringReader {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl reader for StringReader {
|
impl reader for StringReader {
|
||||||
fn is_eof(@mut self) -> bool { is_eof(self) }
|
fn is_eof(@self) -> bool { is_eof(self) }
|
||||||
// return the next token. EFFECT: advances the string_reader.
|
// return the next token. EFFECT: advances the string_reader.
|
||||||
fn next_token(@mut self) -> TokenAndSpan {
|
fn next_token(@self) -> TokenAndSpan {
|
||||||
let ret_val = {
|
let ret_val = {
|
||||||
let mut peek_tok = self.peek_tok.borrow_mut();
|
let mut peek_tok = self.peek_tok.borrow_mut();
|
||||||
TokenAndSpan {
|
TokenAndSpan {
|
||||||
|
@ -118,45 +118,45 @@ impl reader for StringReader {
|
||||||
string_advance_token(self);
|
string_advance_token(self);
|
||||||
ret_val
|
ret_val
|
||||||
}
|
}
|
||||||
fn fatal(@mut self, m: ~str) -> ! {
|
fn fatal(@self, m: ~str) -> ! {
|
||||||
self.span_diagnostic.span_fatal(self.peek_span.get(), m)
|
self.span_diagnostic.span_fatal(self.peek_span.get(), m)
|
||||||
}
|
}
|
||||||
fn span_diag(@mut self) -> @mut SpanHandler { self.span_diagnostic }
|
fn span_diag(@self) -> @mut SpanHandler { self.span_diagnostic }
|
||||||
fn peek(@mut self) -> TokenAndSpan {
|
fn peek(@self) -> TokenAndSpan {
|
||||||
// XXX(pcwalton): Bad copy!
|
// XXX(pcwalton): Bad copy!
|
||||||
TokenAndSpan {
|
TokenAndSpan {
|
||||||
tok: self.peek_tok.get(),
|
tok: self.peek_tok.get(),
|
||||||
sp: self.peek_span.get(),
|
sp: self.peek_span.get(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
fn dup(@mut self) -> @mut reader { dup_string_reader(self) as @mut reader }
|
fn dup(@self) -> @reader { dup_string_reader(self) as @reader }
|
||||||
}
|
}
|
||||||
|
|
||||||
impl reader for TtReader {
|
impl reader for TtReader {
|
||||||
fn is_eof(@mut self) -> bool {
|
fn is_eof(@self) -> bool {
|
||||||
let cur_tok = self.cur_tok.borrow();
|
let cur_tok = self.cur_tok.borrow();
|
||||||
*cur_tok.get() == token::EOF
|
*cur_tok.get() == token::EOF
|
||||||
}
|
}
|
||||||
fn next_token(@mut self) -> TokenAndSpan {
|
fn next_token(@self) -> TokenAndSpan {
|
||||||
let r = tt_next_token(self);
|
let r = tt_next_token(self);
|
||||||
debug!("TtReader: r={:?}", r);
|
debug!("TtReader: r={:?}", r);
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
fn fatal(@mut self, m: ~str) -> ! {
|
fn fatal(@self, m: ~str) -> ! {
|
||||||
self.sp_diag.span_fatal(self.cur_span.get(), m);
|
self.sp_diag.span_fatal(self.cur_span.get(), m);
|
||||||
}
|
}
|
||||||
fn span_diag(@mut self) -> @mut SpanHandler { self.sp_diag }
|
fn span_diag(@self) -> @mut SpanHandler { self.sp_diag }
|
||||||
fn peek(@mut self) -> TokenAndSpan {
|
fn peek(@self) -> TokenAndSpan {
|
||||||
TokenAndSpan {
|
TokenAndSpan {
|
||||||
tok: self.cur_tok.get(),
|
tok: self.cur_tok.get(),
|
||||||
sp: self.cur_span.get(),
|
sp: self.cur_span.get(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
fn dup(@mut self) -> @mut reader { dup_tt_reader(self) as @mut reader }
|
fn dup(@self) -> @reader { dup_tt_reader(self) as @reader }
|
||||||
}
|
}
|
||||||
|
|
||||||
// report a lexical error spanning [`from_pos`, `to_pos`)
|
// report a lexical error spanning [`from_pos`, `to_pos`)
|
||||||
fn fatal_span(rdr: @mut StringReader,
|
fn fatal_span(rdr: @StringReader,
|
||||||
from_pos: BytePos,
|
from_pos: BytePos,
|
||||||
to_pos: BytePos,
|
to_pos: BytePos,
|
||||||
m: ~str)
|
m: ~str)
|
||||||
|
@ -167,7 +167,7 @@ fn fatal_span(rdr: @mut StringReader,
|
||||||
|
|
||||||
// report a lexical error spanning [`from_pos`, `to_pos`), appending an
|
// report a lexical error spanning [`from_pos`, `to_pos`), appending an
|
||||||
// escaped character to the error message
|
// escaped character to the error message
|
||||||
fn fatal_span_char(rdr: @mut StringReader,
|
fn fatal_span_char(rdr: @StringReader,
|
||||||
from_pos: BytePos,
|
from_pos: BytePos,
|
||||||
to_pos: BytePos,
|
to_pos: BytePos,
|
||||||
m: ~str,
|
m: ~str,
|
||||||
|
@ -181,7 +181,7 @@ fn fatal_span_char(rdr: @mut StringReader,
|
||||||
|
|
||||||
// report a lexical error spanning [`from_pos`, `to_pos`), appending the
|
// report a lexical error spanning [`from_pos`, `to_pos`), appending the
|
||||||
// offending string to the error message
|
// offending string to the error message
|
||||||
fn fatal_span_verbose(rdr: @mut StringReader,
|
fn fatal_span_verbose(rdr: @StringReader,
|
||||||
from_pos: BytePos,
|
from_pos: BytePos,
|
||||||
to_pos: BytePos,
|
to_pos: BytePos,
|
||||||
m: ~str)
|
m: ~str)
|
||||||
|
@ -197,7 +197,7 @@ fn fatal_span_verbose(rdr: @mut StringReader,
|
||||||
|
|
||||||
// EFFECT: advance peek_tok and peek_span to refer to the next token.
|
// EFFECT: advance peek_tok and peek_span to refer to the next token.
|
||||||
// EFFECT: update the interner, maybe.
|
// EFFECT: update the interner, maybe.
|
||||||
fn string_advance_token(r: @mut StringReader) {
|
fn string_advance_token(r: @StringReader) {
|
||||||
match (consume_whitespace_and_comments(r)) {
|
match (consume_whitespace_and_comments(r)) {
|
||||||
Some(comment) => {
|
Some(comment) => {
|
||||||
r.peek_span.set(comment.sp);
|
r.peek_span.set(comment.sp);
|
||||||
|
@ -224,7 +224,7 @@ fn byte_offset(rdr: &StringReader, pos: BytePos) -> BytePos {
|
||||||
/// up to but excluding `rdr.last_pos`, meaning the slice does not include
|
/// up to but excluding `rdr.last_pos`, meaning the slice does not include
|
||||||
/// the character `rdr.curr`.
|
/// the character `rdr.curr`.
|
||||||
pub fn with_str_from<T>(
|
pub fn with_str_from<T>(
|
||||||
rdr: @mut StringReader,
|
rdr: @StringReader,
|
||||||
start: BytePos,
|
start: BytePos,
|
||||||
f: |s: &str| -> T)
|
f: |s: &str| -> T)
|
||||||
-> T {
|
-> T {
|
||||||
|
@ -234,7 +234,7 @@ pub fn with_str_from<T>(
|
||||||
/// Calls `f` with astring slice of the source text spanning from `start`
|
/// Calls `f` with astring slice of the source text spanning from `start`
|
||||||
/// up to but excluding `end`.
|
/// up to but excluding `end`.
|
||||||
fn with_str_from_to<T>(
|
fn with_str_from_to<T>(
|
||||||
rdr: @mut StringReader,
|
rdr: @StringReader,
|
||||||
start: BytePos,
|
start: BytePos,
|
||||||
end: BytePos,
|
end: BytePos,
|
||||||
f: |s: &str| -> T)
|
f: |s: &str| -> T)
|
||||||
|
@ -246,7 +246,7 @@ fn with_str_from_to<T>(
|
||||||
|
|
||||||
// EFFECT: advance the StringReader by one character. If a newline is
|
// EFFECT: advance the StringReader by one character. If a newline is
|
||||||
// discovered, add it to the FileMap's list of line start offsets.
|
// discovered, add it to the FileMap's list of line start offsets.
|
||||||
pub fn bump(rdr: &mut StringReader) {
|
pub fn bump(rdr: &StringReader) {
|
||||||
rdr.last_pos.set(rdr.pos.get());
|
rdr.last_pos.set(rdr.pos.get());
|
||||||
let current_byte_offset = byte_offset(rdr, rdr.pos.get()).to_uint();
|
let current_byte_offset = byte_offset(rdr, rdr.pos.get()).to_uint();
|
||||||
if current_byte_offset < (rdr.src).len() {
|
if current_byte_offset < (rdr.src).len() {
|
||||||
|
@ -272,10 +272,10 @@ pub fn bump(rdr: &mut StringReader) {
|
||||||
rdr.curr.set(unsafe { transmute(-1u32) }); // FIXME: #8971: unsound
|
rdr.curr.set(unsafe { transmute(-1u32) }); // FIXME: #8971: unsound
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
pub fn is_eof(rdr: @mut StringReader) -> bool {
|
pub fn is_eof(rdr: @StringReader) -> bool {
|
||||||
rdr.curr.get() == unsafe { transmute(-1u32) } // FIXME: #8971: unsound
|
rdr.curr.get() == unsafe { transmute(-1u32) } // FIXME: #8971: unsound
|
||||||
}
|
}
|
||||||
pub fn nextch(rdr: @mut StringReader) -> char {
|
pub fn nextch(rdr: @StringReader) -> char {
|
||||||
let offset = byte_offset(rdr, rdr.pos.get()).to_uint();
|
let offset = byte_offset(rdr, rdr.pos.get()).to_uint();
|
||||||
if offset < (rdr.src).len() {
|
if offset < (rdr.src).len() {
|
||||||
return rdr.src.char_at(offset);
|
return rdr.src.char_at(offset);
|
||||||
|
@ -306,7 +306,7 @@ fn is_hex_digit(c: char) -> bool {
|
||||||
|
|
||||||
// EFFECT: eats whitespace and comments.
|
// EFFECT: eats whitespace and comments.
|
||||||
// returns a Some(sugared-doc-attr) if one exists, None otherwise.
|
// returns a Some(sugared-doc-attr) if one exists, None otherwise.
|
||||||
fn consume_whitespace_and_comments(rdr: @mut StringReader)
|
fn consume_whitespace_and_comments(rdr: @StringReader)
|
||||||
-> Option<TokenAndSpan> {
|
-> Option<TokenAndSpan> {
|
||||||
while is_whitespace(rdr.curr.get()) { bump(rdr); }
|
while is_whitespace(rdr.curr.get()) { bump(rdr); }
|
||||||
return consume_any_line_comment(rdr);
|
return consume_any_line_comment(rdr);
|
||||||
|
@ -319,7 +319,7 @@ pub fn is_line_non_doc_comment(s: &str) -> bool {
|
||||||
// PRECONDITION: rdr.curr is not whitespace
|
// PRECONDITION: rdr.curr is not whitespace
|
||||||
// EFFECT: eats any kind of comment.
|
// EFFECT: eats any kind of comment.
|
||||||
// returns a Some(sugared-doc-attr) if one exists, None otherwise
|
// returns a Some(sugared-doc-attr) if one exists, None otherwise
|
||||||
fn consume_any_line_comment(rdr: @mut StringReader)
|
fn consume_any_line_comment(rdr: @StringReader)
|
||||||
-> Option<TokenAndSpan> {
|
-> Option<TokenAndSpan> {
|
||||||
if rdr.curr.get() == '/' {
|
if rdr.curr.get() == '/' {
|
||||||
match nextch(rdr) {
|
match nextch(rdr) {
|
||||||
|
@ -377,8 +377,7 @@ pub fn is_block_non_doc_comment(s: &str) -> bool {
|
||||||
}
|
}
|
||||||
|
|
||||||
// might return a sugared-doc-attr
|
// might return a sugared-doc-attr
|
||||||
fn consume_block_comment(rdr: @mut StringReader)
|
fn consume_block_comment(rdr: @StringReader) -> Option<TokenAndSpan> {
|
||||||
-> Option<TokenAndSpan> {
|
|
||||||
// block comments starting with "/**" or "/*!" are doc-comments
|
// block comments starting with "/**" or "/*!" are doc-comments
|
||||||
let is_doc_comment = rdr.curr.get() == '*' || rdr.curr.get() == '!';
|
let is_doc_comment = rdr.curr.get() == '*' || rdr.curr.get() == '!';
|
||||||
let start_bpos = rdr.pos.get() - BytePos(if is_doc_comment {3} else {2});
|
let start_bpos = rdr.pos.get() - BytePos(if is_doc_comment {3} else {2});
|
||||||
|
@ -425,7 +424,7 @@ fn consume_block_comment(rdr: @mut StringReader)
|
||||||
if res.is_some() { res } else { consume_whitespace_and_comments(rdr) }
|
if res.is_some() { res } else { consume_whitespace_and_comments(rdr) }
|
||||||
}
|
}
|
||||||
|
|
||||||
fn scan_exponent(rdr: @mut StringReader, start_bpos: BytePos) -> Option<~str> {
|
fn scan_exponent(rdr: @StringReader, start_bpos: BytePos) -> Option<~str> {
|
||||||
let mut c = rdr.curr.get();
|
let mut c = rdr.curr.get();
|
||||||
let mut rslt = ~"";
|
let mut rslt = ~"";
|
||||||
if c == 'e' || c == 'E' {
|
if c == 'e' || c == 'E' {
|
||||||
|
@ -446,7 +445,7 @@ fn scan_exponent(rdr: @mut StringReader, start_bpos: BytePos) -> Option<~str> {
|
||||||
} else { return None::<~str>; }
|
} else { return None::<~str>; }
|
||||||
}
|
}
|
||||||
|
|
||||||
fn scan_digits(rdr: @mut StringReader, radix: uint) -> ~str {
|
fn scan_digits(rdr: @StringReader, radix: uint) -> ~str {
|
||||||
let mut rslt = ~"";
|
let mut rslt = ~"";
|
||||||
loop {
|
loop {
|
||||||
let c = rdr.curr.get();
|
let c = rdr.curr.get();
|
||||||
|
@ -461,7 +460,7 @@ fn scan_digits(rdr: @mut StringReader, radix: uint) -> ~str {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
fn scan_number(c: char, rdr: @mut StringReader) -> token::Token {
|
fn scan_number(c: char, rdr: @StringReader) -> token::Token {
|
||||||
let mut num_str;
|
let mut num_str;
|
||||||
let mut base = 10u;
|
let mut base = 10u;
|
||||||
let mut c = c;
|
let mut c = c;
|
||||||
|
@ -597,7 +596,7 @@ fn scan_number(c: char, rdr: @mut StringReader) -> token::Token {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn scan_numeric_escape(rdr: @mut StringReader, n_hex_digits: uint) -> char {
|
fn scan_numeric_escape(rdr: @StringReader, n_hex_digits: uint) -> char {
|
||||||
let mut accum_int = 0;
|
let mut accum_int = 0;
|
||||||
let mut i = n_hex_digits;
|
let mut i = n_hex_digits;
|
||||||
let start_bpos = rdr.last_pos.get();
|
let start_bpos = rdr.last_pos.get();
|
||||||
|
@ -638,7 +637,7 @@ fn ident_continue(c: char) -> bool {
|
||||||
// return the next token from the string
|
// return the next token from the string
|
||||||
// EFFECT: advances the input past that token
|
// EFFECT: advances the input past that token
|
||||||
// EFFECT: updates the interner
|
// EFFECT: updates the interner
|
||||||
fn next_token_inner(rdr: @mut StringReader) -> token::Token {
|
fn next_token_inner(rdr: @StringReader) -> token::Token {
|
||||||
let c = rdr.curr.get();
|
let c = rdr.curr.get();
|
||||||
if ident_start(c) && nextch(rdr) != '"' && nextch(rdr) != '#' {
|
if ident_start(c) && nextch(rdr) != '"' && nextch(rdr) != '#' {
|
||||||
// Note: r as in r" or r#" is part of a raw string literal,
|
// Note: r as in r" or r#" is part of a raw string literal,
|
||||||
|
@ -663,7 +662,7 @@ fn next_token_inner(rdr: @mut StringReader) -> token::Token {
|
||||||
if is_dec_digit(c) {
|
if is_dec_digit(c) {
|
||||||
return scan_number(c, rdr);
|
return scan_number(c, rdr);
|
||||||
}
|
}
|
||||||
fn binop(rdr: @mut StringReader, op: token::binop) -> token::Token {
|
fn binop(rdr: @StringReader, op: token::binop) -> token::Token {
|
||||||
bump(rdr);
|
bump(rdr);
|
||||||
if rdr.curr.get() == '=' {
|
if rdr.curr.get() == '=' {
|
||||||
bump(rdr);
|
bump(rdr);
|
||||||
|
@ -951,7 +950,7 @@ fn next_token_inner(rdr: @mut StringReader) -> token::Token {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn consume_whitespace(rdr: @mut StringReader) {
|
fn consume_whitespace(rdr: @StringReader) {
|
||||||
while is_whitespace(rdr.curr.get()) && !is_eof(rdr) { bump(rdr); }
|
while is_whitespace(rdr.curr.get()) && !is_eof(rdr) { bump(rdr); }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -966,7 +965,7 @@ mod test {
|
||||||
|
|
||||||
// represents a testing reader (incl. both reader and interner)
|
// represents a testing reader (incl. both reader and interner)
|
||||||
struct Env {
|
struct Env {
|
||||||
string_reader: @mut StringReader
|
string_reader: @StringReader
|
||||||
}
|
}
|
||||||
|
|
||||||
// open a string reader for the given string
|
// open a string reader for the given string
|
||||||
|
|
|
@ -312,7 +312,7 @@ pub fn filemap_to_tts(sess: @ParseSess, filemap: @FileMap)
|
||||||
// parsing tt's probably shouldn't require a parser at all.
|
// parsing tt's probably shouldn't require a parser at all.
|
||||||
let cfg = ~[];
|
let cfg = ~[];
|
||||||
let srdr = lexer::new_string_reader(sess.span_diagnostic, filemap);
|
let srdr = lexer::new_string_reader(sess.span_diagnostic, filemap);
|
||||||
let mut p1 = Parser(sess, cfg, srdr as @mut reader);
|
let mut p1 = Parser(sess, cfg, srdr as @reader);
|
||||||
p1.parse_all_token_trees()
|
p1.parse_all_token_trees()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -321,7 +321,7 @@ pub fn tts_to_parser(sess: @ParseSess,
|
||||||
tts: ~[ast::token_tree],
|
tts: ~[ast::token_tree],
|
||||||
cfg: ast::CrateConfig) -> Parser {
|
cfg: ast::CrateConfig) -> Parser {
|
||||||
let trdr = lexer::new_tt_reader(sess.span_diagnostic, None, tts);
|
let trdr = lexer::new_tt_reader(sess.span_diagnostic, None, tts);
|
||||||
Parser(sess, cfg, trdr as @mut reader)
|
Parser(sess, cfg, trdr as @reader)
|
||||||
}
|
}
|
||||||
|
|
||||||
// abort if necessary
|
// abort if necessary
|
||||||
|
|
|
@ -286,7 +286,7 @@ struct ParsedItemsAndViewItems {
|
||||||
|
|
||||||
/* ident is handled by common.rs */
|
/* ident is handled by common.rs */
|
||||||
|
|
||||||
pub fn Parser(sess: @ParseSess, cfg: ast::CrateConfig, rdr: @mut reader)
|
pub fn Parser(sess: @ParseSess, cfg: ast::CrateConfig, rdr: @reader)
|
||||||
-> Parser {
|
-> Parser {
|
||||||
let tok0 = rdr.next_token();
|
let tok0 = rdr.next_token();
|
||||||
let interner = get_ident_interner();
|
let interner = get_ident_interner();
|
||||||
|
@ -340,7 +340,7 @@ pub struct Parser {
|
||||||
tokens_consumed: uint,
|
tokens_consumed: uint,
|
||||||
restriction: restriction,
|
restriction: restriction,
|
||||||
quote_depth: uint, // not (yet) related to the quasiquoter
|
quote_depth: uint, // not (yet) related to the quasiquoter
|
||||||
reader: @mut reader,
|
reader: @reader,
|
||||||
interner: @token::ident_interner,
|
interner: @token::ident_interner,
|
||||||
/// The set of seen errors about obsolete syntax. Used to suppress
|
/// The set of seen errors about obsolete syntax. Used to suppress
|
||||||
/// extra detail when the same error is seen twice
|
/// extra detail when the same error is seen twice
|
||||||
|
|
Loading…
Reference in New Issue