Skip to content

Commit 8069d2f

Browse files
committed
Track character and byte positions together in the parser
1 parent f67bfe9 commit 8069d2f

File tree

4 files changed

+42
-34
lines changed

4 files changed

+42
-34
lines changed

src/libsyntax/codemap.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -184,20 +184,20 @@ pub struct FileMap {
184184
pub impl FileMap {
185185
static fn new_w_substr(+filename: FileName, +substr: FileSubstr,
186186
src: @~str,
187-
+start_pos_ch: CharPos, +start_pos_byte: BytePos)
187+
+start_pos: FilePos)
188188
-> FileMap {
189189
return FileMap {
190190
name: filename, substr: substr, src: src,
191-
start_pos: FilePos {ch: start_pos_ch, byte: start_pos_byte},
192-
mut lines: ~[FilePos {ch: start_pos_ch, byte: start_pos_byte}]
191+
start_pos: start_pos,
192+
mut lines: ~[start_pos]
193193
};
194194
}
195195

196196
static fn new(+filename: FileName, src: @~str,
197-
+start_pos_ch: CharPos, +start_pos_byte: BytePos)
197+
+start_pos: FilePos)
198198
-> FileMap {
199199
return FileMap::new_w_substr(filename, FssNone, src,
200-
start_pos_ch, start_pos_byte);
200+
start_pos);
201201
}
202202

203203
fn next_line(@self, +chpos: CharPos, +byte_pos: BytePos) {

src/libsyntax/parse.rs

Lines changed: 20 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -20,16 +20,15 @@ use util::interner;
2020
use diagnostic::{span_handler, mk_span_handler, mk_handler, emitter};
2121
use lexer::{reader, string_reader};
2222
use parse::token::{ident_interner, mk_ident_interner};
23-
use codemap::{CodeMap, FileMap, CharPos, BytePos};
23+
use codemap::{CodeMap, FileMap, CharPos, BytePos, FilePos};
2424

2525
type parse_sess = @{
2626
cm: @codemap::CodeMap,
2727
mut next_id: node_id,
2828
span_diagnostic: span_handler,
2929
interner: @ident_interner,
30-
// these two must be kept up to date
31-
mut chpos: CharPos,
32-
mut byte_pos: BytePos
30+
// must be kept up to date
31+
mut pos: FilePos
3332
};
3433

3534
fn new_parse_sess(demitter: Option<emitter>) -> parse_sess {
@@ -38,7 +37,10 @@ fn new_parse_sess(demitter: Option<emitter>) -> parse_sess {
3837
mut next_id: 1,
3938
span_diagnostic: mk_span_handler(mk_handler(demitter), cm),
4039
interner: mk_ident_interner(),
41-
mut chpos: CharPos(0u), mut byte_pos: BytePos(0u)};
40+
mut pos: FilePos {
41+
ch: CharPos(0u),
42+
byte: BytePos(0u)
43+
}};
4244
}
4345

4446
fn new_parse_sess_special_handler(sh: span_handler, cm: @codemap::CodeMap)
@@ -47,7 +49,10 @@ fn new_parse_sess_special_handler(sh: span_handler, cm: @codemap::CodeMap)
4749
mut next_id: 1,
4850
span_diagnostic: sh,
4951
interner: mk_ident_interner(),
50-
mut chpos: CharPos(0u), mut byte_pos: BytePos(0u)};
52+
mut pos: FilePos {
53+
ch: CharPos(0u),
54+
byte: BytePos(0u)
55+
}};
5156
}
5257

5358
fn parse_crate_from_file(input: &Path, cfg: ast::crate_cfg,
@@ -71,8 +76,7 @@ fn parse_crate_from_crate_file(input: &Path, cfg: ast::crate_cfg,
7176
let leading_attrs = p.parse_inner_attrs_and_next();
7277
let { inner: crate_attrs, next: first_cdir_attr } = leading_attrs;
7378
let cdirs = p.parse_crate_directives(token::EOF, first_cdir_attr);
74-
sess.chpos = rdr.chpos;
75-
sess.byte_pos = sess.byte_pos + rdr.pos;
79+
eval::update_parse_sess_position(&sess, &rdr);
7680
let cx = @{sess: sess, cfg: /* FIXME (#2543) */ copy p.cfg};
7781
let companionmod = input.filestem().map(|s| Path(*s));
7882
let (m, attrs) = eval::eval_crate_directives_to_mod(
@@ -92,8 +96,7 @@ fn parse_crate_from_source_file(input: &Path, cfg: ast::crate_cfg,
9296
let (p, rdr) = new_parser_etc_from_file(sess, cfg, input,
9397
parser::SOURCE_FILE);
9498
let r = p.parse_crate_mod(cfg);
95-
sess.chpos = rdr.chpos;
96-
sess.byte_pos = sess.byte_pos + rdr.pos;
99+
eval::update_parse_sess_position(&sess, &rdr);
97100
return r;
98101
}
99102
@@ -103,8 +106,7 @@ fn parse_crate_from_source_str(name: ~str, source: @~str, cfg: ast::crate_cfg,
103106
codemap::FssNone, source);
104107
let r = p.parse_crate_mod(cfg);
105108
p.abort_if_errors();
106-
sess.chpos = rdr.chpos;
107-
sess.byte_pos = sess.byte_pos + rdr.pos;
109+
eval::update_parse_sess_position(&sess, &rdr);
108110
return r;
109111
}
110112
@@ -114,8 +116,7 @@ fn parse_expr_from_source_str(name: ~str, source: @~str, cfg: ast::crate_cfg,
114116
codemap::FssNone, source);
115117
let r = p.parse_expr();
116118
p.abort_if_errors();
117-
sess.chpos = rdr.chpos;
118-
sess.byte_pos = sess.byte_pos + rdr.pos;
119+
eval::update_parse_sess_position(&sess, &rdr);
119120
return r;
120121
}
121122
@@ -126,8 +127,7 @@ fn parse_item_from_source_str(name: ~str, source: @~str, cfg: ast::crate_cfg,
126127
codemap::FssNone, source);
127128
let r = p.parse_item(attrs);
128129
p.abort_if_errors();
129-
sess.chpos = rdr.chpos;
130-
sess.byte_pos = sess.byte_pos + rdr.pos;
130+
eval::update_parse_sess_position(&sess, &rdr);
131131
return r;
132132
}
133133
@@ -138,8 +138,7 @@ fn parse_stmt_from_source_str(name: ~str, source: @~str, cfg: ast::crate_cfg,
138138
codemap::FssNone, source);
139139
let r = p.parse_stmt(attrs);
140140
p.abort_if_errors();
141-
sess.chpos = rdr.chpos;
142-
sess.byte_pos = sess.byte_pos + rdr.pos;
141+
eval::update_parse_sess_position(&sess, &rdr);
143142
return r;
144143
}
145144
@@ -156,8 +155,7 @@ fn parse_from_source_str<T>(f: fn (p: Parser) -> T,
156155
p.reader.fatal(~"expected end-of-string");
157156
}
158157
p.abort_if_errors();
159-
sess.chpos = rdr.chpos;
160-
sess.byte_pos = sess.byte_pos + rdr.pos;
158+
eval::update_parse_sess_position(&sess, &rdr);
161159
move r
162160
}
163161

@@ -174,7 +172,7 @@ fn new_parser_etc_from_source_str(sess: parse_sess, cfg: ast::crate_cfg,
174172
source: @~str) -> (Parser, string_reader) {
175173
let ftype = parser::SOURCE_FILE;
176174
let filemap = @FileMap::new_w_substr
177-
(name, ss, source, sess.chpos, sess.byte_pos);
175+
(name, ss, source, sess.pos);
178176
sess.cm.files.push(filemap);
179177
let srdr = lexer::new_string_reader(sess.span_diagnostic, filemap,
180178
sess.interner);
@@ -199,7 +197,7 @@ fn new_parser_etc_from_file(sess: parse_sess, cfg: ast::crate_cfg,
199197
}
200198
let src = @result::unwrap(res);
201199
let filemap = @FileMap::new(path.to_str(), src,
202-
sess.chpos, sess.byte_pos);
200+
sess.pos);
203201
sess.cm.files.push(filemap);
204202
let srdr = lexer::new_string_reader(sess.span_diagnostic, filemap,
205203
sess.interner);

src/libsyntax/parse/comments.rs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -292,9 +292,13 @@ fn gather_comments_and_literals(span_diagnostic: diagnostic::span_handler,
292292
{cmnts: ~[cmnt], lits: ~[lit]} {
293293
let src = @str::from_bytes(srdr.read_whole_stream());
294294
let itr = parse::token::mk_fake_ident_interner();
295-
let rdr = lexer::new_low_level_string_reader
296-
(span_diagnostic, @FileMap::new(path, src,
297-
CharPos(0u), BytePos(0u)), itr);
295+
let filemap = @FileMap::new(path, src,
296+
FilePos {
297+
ch: CharPos(0u),
298+
byte: BytePos(0u)
299+
});
300+
let rdr = lexer::new_low_level_string_reader(
301+
span_diagnostic, filemap, itr);
298302
299303
let mut comments: ~[cmnt] = ~[];
300304
let mut literals: ~[lit] = ~[];

src/libsyntax/parse/eval.rs

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ use parser::{Parser, SOURCE_FILE};
22
use attr::parser_attr;
33

44
export eval_crate_directives_to_mod;
5+
export update_parse_sess_position;
56

67
type ctx =
78
@{sess: parse::parse_sess,
@@ -66,14 +67,20 @@ fn parse_companion_mod(cx: ctx, prefix: &Path, suffix: &Option<Path>)
6667
modpath, SOURCE_FILE);
6768
let inner_attrs = p0.parse_inner_attrs_and_next();
6869
let m0 = p0.parse_mod_items(token::EOF, inner_attrs.next);
69-
cx.sess.chpos = r0.chpos;
70-
cx.sess.byte_pos = cx.sess.byte_pos + r0.pos;
70+
update_parse_sess_position(&cx.sess, &r0);
7171
return (m0.view_items, m0.items, inner_attrs.inner);
7272
} else {
7373
return (~[], ~[], ~[]);
7474
}
7575
}
7676

77+
fn update_parse_sess_position(sess: &parse_sess, r: &lexer::string_reader) {
78+
sess.pos = FilePos {
79+
ch: r.chpos,
80+
byte: sess.pos.byte + r.pos
81+
};
82+
}
83+
7784
fn cdir_path_opt(default: ~str, attrs: ~[ast::attribute]) -> ~str {
7885
match ::attr::first_attr_value_str_by_name(attrs, ~"path") {
7986
Some(d) => d,
@@ -105,8 +112,7 @@ fn eval_crate_directive(cx: ctx, cdir: @ast::crate_directive, prefix: &Path,
105112
/* FIXME (#2543) */ copy id,
106113
ast::item_mod(m0), vis, mod_attrs);
107114
// Thread defids, chpos and byte_pos through the parsers
108-
cx.sess.chpos = r0.chpos;
109-
cx.sess.byte_pos = cx.sess.byte_pos + r0.pos;
115+
update_parse_sess_position(&cx.sess, &r0);
110116
items.push(i);
111117
}
112118
ast::cdir_dir_mod(vis, id, cdirs, attrs) => {

0 commit comments

Comments
 (0)