Skip to content

Commit 9fe03b3

Browse files
committed
Pull lexer creation out of new_parser
This will allow custom lexers to be injected into the parser (for fuzzing)
1 parent 08f8753 commit 9fe03b3

File tree

2 files changed

+20
-15
lines changed

2 files changed

+20
-15
lines changed

src/comp/syntax/parse/eval.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import std::option::none;
77
import syntax::ast;
88
import syntax::parse::token;
99
import syntax::parse::parser::parser;
10-
import syntax::parse::parser::new_parser;
10+
import syntax::parse::parser::new_parser_from_file;
1111
import syntax::parse::parser::parse_inner_attrs_and_next;
1212
import syntax::parse::parser::parse_mod_items;
1313

@@ -57,7 +57,7 @@ fn eval_crate_directive(ctx cx, @ast::crate_directive cdir, str prefix,
5757
};
5858
if (cx.mode == mode_depend) { cx.deps += [full_path]; ret; }
5959
auto p0 =
60-
new_parser(cx.sess, cx.cfg, full_path, cx.chpos);
60+
new_parser_from_file(cx.sess, cx.cfg, full_path, cx.chpos);
6161
auto inner_attrs = parse_inner_attrs_and_next(p0);
6262
auto mod_attrs = attrs + inner_attrs._0;
6363
auto first_item_outer_attrs = inner_attrs._1;

src/comp/syntax/parse/parser.rs

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,22 @@ type parser =
5656
fn get_sess() -> parse_sess;
5757
};
5858

59-
fn new_parser(parse_sess sess, ast::crate_cfg cfg,
60-
str path, uint pos) -> parser {
59+
fn new_parser_from_file(parse_sess sess, ast::crate_cfg cfg,
60+
str path, uint pos) -> parser {
61+
auto ftype = SOURCE_FILE;
62+
if (str::ends_with(path, ".rc")) { ftype = CRATE_FILE; }
63+
auto srdr = io::file_reader(path);
64+
auto src = str::unsafe_from_bytes(srdr.read_whole_stream());
65+
auto filemap = codemap::new_filemap(path, pos);
66+
vec::push(sess.cm.files, filemap);
67+
auto itr = @interner::mk(str::hash, str::eq);
68+
auto rdr = lexer::new_reader(sess.cm, src, filemap, itr);
69+
70+
ret new_parser(sess, cfg, rdr, ftype);
71+
}
72+
73+
fn new_parser(parse_sess sess, ast::crate_cfg cfg, lexer::reader rdr,
74+
file_type ftype) -> parser {
6175
obj stdio_parser(parse_sess sess,
6276
ast::crate_cfg cfg,
6377
file_type ftype,
@@ -110,16 +124,7 @@ fn new_parser(parse_sess sess, ast::crate_cfg cfg,
110124
fn get_sess() -> parse_sess { ret sess; }
111125
}
112126

113-
auto ftype = SOURCE_FILE;
114-
if (str::ends_with(path, ".rc")) { ftype = CRATE_FILE; }
115-
auto srdr = io::file_reader(path);
116-
auto src = str::unsafe_from_bytes(srdr.read_whole_stream());
117-
auto filemap = codemap::new_filemap(path, pos);
118-
vec::push(sess.cm.files, filemap);
119-
auto itr = @interner::mk(str::hash, str::eq);
120-
auto rdr = lexer::new_reader(sess.cm, src, filemap, itr);
121127
// Make sure npos points at first actual token:
122-
123128
lexer::consume_whitespace_and_comments(rdr);
124129
auto npos = rdr.get_chpos();
125130
ret stdio_parser(sess, cfg, ftype, lexer::next_token(rdr),
@@ -2426,7 +2431,7 @@ fn parse_native_view(&parser p) -> (@ast::view_item)[] {
24262431
fn parse_crate_from_source_file(&str input, &ast::crate_cfg cfg,
24272432
&codemap::codemap cm) -> @ast::crate {
24282433
auto sess = @rec(cm=cm, mutable next_id=0);
2429-
auto p = new_parser(sess, cfg, input, 0u);
2434+
auto p = new_parser_from_file(sess, cfg, input, 0u);
24302435
auto lo = p.get_lo_pos();
24312436
auto crate_attrs = parse_inner_attrs_and_next(p);
24322437
auto first_item_outer_attrs = crate_attrs._1;
@@ -2535,7 +2540,7 @@ fn parse_crate_directives(&parser p, token::token term,
25352540
fn parse_crate_from_crate_file(&str input, &ast::crate_cfg cfg,
25362541
&codemap::codemap cm) -> @ast::crate {
25372542
auto sess = @rec(cm=cm, mutable next_id=0);
2538-
auto p = new_parser(sess, cfg, input, 0u);
2543+
auto p = new_parser_from_file(sess, cfg, input, 0u);
25392544
auto lo = p.get_lo_pos();
25402545
auto prefix = std::fs::dirname(p.get_filemap().name);
25412546
auto leading_attrs = parse_inner_attrs_and_next(p);

0 commit comments

Comments
 (0)