From 8069d2f266b5e5f21d9cc846b0b8b8daa1812dcc Mon Sep 17 00:00:00 2001 From: Brian Anderson Date: Wed, 14 Nov 2012 16:34:18 -0800 Subject: Track character and byte positions together in the parser --- src/libsyntax/parse/comments.rs | 10 +++++++--- src/libsyntax/parse/eval.rs | 14 ++++++++++---- 2 files changed, 17 insertions(+), 7 deletions(-) (limited to 'src/libsyntax/parse') diff --git a/src/libsyntax/parse/comments.rs b/src/libsyntax/parse/comments.rs index 06b042a468a..ba36e6f88e2 100644 --- a/src/libsyntax/parse/comments.rs +++ b/src/libsyntax/parse/comments.rs @@ -292,9 +292,13 @@ fn gather_comments_and_literals(span_diagnostic: diagnostic::span_handler, {cmnts: ~[cmnt], lits: ~[lit]} { let src = @str::from_bytes(srdr.read_whole_stream()); let itr = parse::token::mk_fake_ident_interner(); - let rdr = lexer::new_low_level_string_reader - (span_diagnostic, @FileMap::new(path, src, - CharPos(0u), BytePos(0u)), itr); + let filemap = @FileMap::new(path, src, + FilePos { + ch: CharPos(0u), + byte: BytePos(0u) + }); + let rdr = lexer::new_low_level_string_reader( + span_diagnostic, filemap, itr); let mut comments: ~[cmnt] = ~[]; let mut literals: ~[lit] = ~[]; diff --git a/src/libsyntax/parse/eval.rs b/src/libsyntax/parse/eval.rs index 56c9d4de9f3..bfbec5c530f 100644 --- a/src/libsyntax/parse/eval.rs +++ b/src/libsyntax/parse/eval.rs @@ -2,6 +2,7 @@ use parser::{Parser, SOURCE_FILE}; use attr::parser_attr; export eval_crate_directives_to_mod; +export update_parse_sess_position; type ctx = @{sess: parse::parse_sess, @@ -66,14 +67,20 @@ fn parse_companion_mod(cx: ctx, prefix: &Path, suffix: &Option) modpath, SOURCE_FILE); let inner_attrs = p0.parse_inner_attrs_and_next(); let m0 = p0.parse_mod_items(token::EOF, inner_attrs.next); - cx.sess.chpos = r0.chpos; - cx.sess.byte_pos = cx.sess.byte_pos + r0.pos; + update_parse_sess_position(&cx.sess, &r0); return (m0.view_items, m0.items, inner_attrs.inner); } else { return (~[], ~[], ~[]); } } +fn update_parse_sess_position(sess: &parse_sess, r: &lexer::string_reader) { + sess.pos = FilePos { + ch: r.chpos, + byte: sess.pos.byte + r.pos + }; +} + fn cdir_path_opt(default: ~str, attrs: ~[ast::attribute]) -> ~str { match ::attr::first_attr_value_str_by_name(attrs, ~"path") { Some(d) => d, @@ -105,8 +112,7 @@ fn eval_crate_directive(cx: ctx, cdir: @ast::crate_directive, prefix: &Path, /* FIXME (#2543) */ copy id, ast::item_mod(m0), vis, mod_attrs); // Thread defids, chpos and byte_pos through the parsers - cx.sess.chpos = r0.chpos; - cx.sess.byte_pos = cx.sess.byte_pos + r0.pos; + update_parse_sess_position(&cx.sess, &r0); items.push(i); } ast::cdir_dir_mod(vis, id, cdirs, attrs) => { -- cgit 1.4.1-3-g733a5