Skip to content

Commit 9a8a046

Browse files
committed
syntax: Put the main parser interface in mod parse
1 parent 2c0cb90 commit 9a8a046

File tree

15 files changed

+214
-199
lines changed

15 files changed

+214
-199
lines changed

src/cargo/cargo.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
// cargo.rs - Rust package manager
22

33
import rustc::syntax::{ast, codemap};
4-
import rustc::syntax::parse::parser;
4+
import rustc::syntax::parse;
55
import rustc::util::filesearch::{get_cargo_root, get_cargo_root_nearest,
66
get_cargo_sysroot, libdir};
77
import rustc::driver::diagnostic;
@@ -119,7 +119,7 @@ fn load_pkg(filename: str) -> option<pkg> {
119119
mut chpos: 0u,
120120
mut byte_pos: 0u
121121
};
122-
let c = parser::parse_crate_from_crate_file(filename, [], sess);
122+
let c = parse::parse_crate_from_crate_file(filename, [], sess);
123123

124124
let mut name = none;
125125
let mut vers = none;

src/fuzzer/fuzzer.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import io::writer_util;
22

33
import rustc::syntax::{ast, ast_util, fold, visit, codemap};
4-
import rustc::syntax::parse::parser;
4+
import rustc::syntax::parse;
55
import rustc::syntax::print::pprust;
66
import rustc::driver::diagnostic;
77

@@ -429,7 +429,7 @@ fn parse_and_print(code: @str) -> str {
429429
mut byte_pos: 0u
430430
};
431431
write_file(filename, *code);
432-
let crate = parser::parse_crate_from_source_str(
432+
let crate = parse::parse_crate_from_source_str(
433433
filename, code, [], sess);
434434
io::with_str_reader(*code) { |rdr|
435435
as_str(bind pprust::print_crate(sess.cm,
@@ -579,7 +579,7 @@ fn check_variants(files: [str], cx: context) {
579579
mut byte_pos: 0u
580580
};
581581
let crate =
582-
parser::parse_crate_from_source_str(
582+
parse::parse_crate_from_source_str(
583583
file,
584584
s, [], sess);
585585
io::with_str_reader(*s) { |rdr|

src/librustsyntax/ext/base.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ fn syntax_expander_table() -> hashmap<str, syntax_extension> {
4646

4747
iface ext_ctxt {
4848
fn codemap() -> codemap;
49-
fn parse_sess() -> parser::parse_sess;
49+
fn parse_sess() -> parse::parse_sess;
5050
fn cfg() -> ast::crate_cfg;
5151
fn print_backtrace();
5252
fn backtrace() -> expn_info;
@@ -60,14 +60,14 @@ iface ext_ctxt {
6060
fn next_id() -> ast::node_id;
6161
}
6262

63-
fn mk_ctxt(parse_sess: parser::parse_sess,
63+
fn mk_ctxt(parse_sess: parse::parse_sess,
6464
cfg: ast::crate_cfg) -> ext_ctxt {
65-
type ctxt_repr = {parse_sess: parser::parse_sess,
65+
type ctxt_repr = {parse_sess: parse::parse_sess,
6666
cfg: ast::crate_cfg,
6767
mut backtrace: expn_info};
6868
impl of ext_ctxt for ctxt_repr {
6969
fn codemap() -> codemap { self.parse_sess.cm }
70-
fn parse_sess() -> parser::parse_sess { self.parse_sess }
70+
fn parse_sess() -> parse::parse_sess { self.parse_sess }
7171
fn cfg() -> ast::crate_cfg { self.cfg }
7272
fn print_backtrace() { }
7373
fn backtrace() -> expn_info { self.backtrace }
@@ -111,7 +111,7 @@ fn mk_ctxt(parse_sess: parser::parse_sess,
111111
self.parse_sess.span_diagnostic.handler().bug(msg);
112112
}
113113
fn next_id() -> ast::node_id {
114-
ret parser::next_node_id(self.parse_sess);
114+
ret parse::next_node_id(self.parse_sess);
115115
}
116116
}
117117
let imp : ctxt_repr = {

src/librustsyntax/ext/expand.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import fold::*;
55
import ext::base::*;
66
import ext::qquote::{qq_helper};
77
import parse::parser;
8-
import parse::parser::parse_expr_from_source_str;
8+
import parse::parse_expr_from_source_str;
99

1010

1111
import codemap::{span, expanded_from};
@@ -110,7 +110,7 @@ fn core_macros() -> str {
110110
}";
111111
}
112112

113-
fn expand_crate(parse_sess: parser::parse_sess,
113+
fn expand_crate(parse_sess: parse::parse_sess,
114114
cfg: ast::crate_cfg, c: @crate) -> @crate {
115115
let exts = syntax_expander_table();
116116
let afp = default_ast_fold();

src/librustsyntax/ext/qquote.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import visit::*;
55
import ext::base::*;
66
import ext::build::*;
77
import parse::parser;
8-
import parse::parser::{parser, parse_from_source_str};
8+
import parse::parser::parse_from_source_str;
99

1010
import print::*;
1111
import io::*;

src/librustsyntax/parse.rs

Lines changed: 166 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,166 @@
1+
export parse_sess;
2+
export next_node_id;
3+
export new_parser_from_file;
4+
export new_parser_from_source_str;
5+
export parse_crate_from_file;
6+
export parse_crate_from_crate_file;
7+
export parse_crate_from_source_str;
8+
export parse_expr_from_source_str;
9+
export parse_from_source_str;
10+
11+
import parser::parser;
12+
import ast::node_id;
13+
import util::interner;
14+
import lexer::reader;
15+
16+
type parse_sess = @{
17+
cm: codemap::codemap,
18+
mut next_id: node_id,
19+
span_diagnostic: diagnostic::span_handler,
20+
// these two must be kept up to date
21+
mut chpos: uint,
22+
mut byte_pos: uint
23+
};
24+
25+
fn next_node_id(sess: parse_sess) -> node_id {
26+
let rv = sess.next_id;
27+
sess.next_id += 1;
28+
// ID 0 is reserved for the crate and doesn't actually exist in the AST
29+
assert rv != 0;
30+
ret rv;
31+
}
32+
33+
fn new_parser_from_file(sess: parse_sess, cfg: ast::crate_cfg, path: str,
34+
ftype: parser::file_type) ->
35+
parser {
36+
let src = alt io::read_whole_file_str(path) {
37+
result::ok(src) {
38+
// FIXME: This copy is unfortunate
39+
@src
40+
}
41+
result::err(e) {
42+
sess.span_diagnostic.handler().fatal(e)
43+
}
44+
};
45+
let filemap = codemap::new_filemap(path, src,
46+
sess.chpos, sess.byte_pos);
47+
sess.cm.files += [filemap];
48+
let itr = @interner::mk(str::hash, str::eq);
49+
let rdr = lexer::new_reader(sess.span_diagnostic, filemap, itr);
50+
ret new_parser(sess, cfg, rdr, ftype);
51+
}
52+
53+
fn new_parser_from_source_str(sess: parse_sess, cfg: ast::crate_cfg,
54+
name: str, ss: codemap::file_substr,
55+
source: @str) -> parser {
56+
let ftype = parser::SOURCE_FILE;
57+
let filemap = codemap::new_filemap_w_substr
58+
(name, ss, source, sess.chpos, sess.byte_pos);
59+
sess.cm.files += [filemap];
60+
let itr = @interner::mk(str::hash, str::eq);
61+
let rdr = lexer::new_reader(sess.span_diagnostic,
62+
filemap, itr);
63+
ret new_parser(sess, cfg, rdr, ftype);
64+
}
65+
66+
fn new_parser(sess: parse_sess, cfg: ast::crate_cfg, rdr: lexer::reader,
67+
ftype: parser::file_type) -> parser {
68+
let tok0 = lexer::next_token(rdr);
69+
let span0 = ast_util::mk_sp(tok0.chpos, rdr.chpos);
70+
@{sess: sess,
71+
cfg: cfg,
72+
file_type: ftype,
73+
mut token: tok0.tok,
74+
mut span: span0,
75+
mut last_span: span0,
76+
mut buffer: [],
77+
mut restriction: parser::UNRESTRICTED,
78+
reader: rdr,
79+
binop_precs: prec::binop_prec_table(),
80+
bad_expr_words: token::bad_expr_word_table()}
81+
}
82+
83+
fn parse_crate_from_crate_file(input: str, cfg: ast::crate_cfg,
84+
sess: parse_sess) -> @ast::crate {
85+
let p = new_parser_from_file(sess, cfg, input, parser::CRATE_FILE);
86+
let lo = p.span.lo;
87+
let prefix = path::dirname(p.reader.filemap.name);
88+
let leading_attrs = parser::parse_inner_attrs_and_next(p);
89+
let crate_attrs = leading_attrs.inner;
90+
let first_cdir_attr = leading_attrs.next;
91+
let cdirs = parser::parse_crate_directives(
92+
p, token::EOF, first_cdir_attr);
93+
sess.chpos = p.reader.chpos;
94+
sess.byte_pos = sess.byte_pos + p.reader.pos;
95+
let cx =
96+
@{p: p,
97+
sess: sess,
98+
cfg: p.cfg};
99+
let (companionmod, _) = path::splitext(path::basename(input));
100+
let (m, attrs) = eval::eval_crate_directives_to_mod(
101+
cx, cdirs, prefix, option::some(companionmod));
102+
let mut hi = p.span.hi;
103+
parser::expect(p, token::EOF);
104+
ret @ast_util::respan(ast_util::mk_sp(lo, hi),
105+
{directives: cdirs,
106+
module: m,
107+
attrs: crate_attrs + attrs,
108+
config: p.cfg});
109+
}
110+
111+
fn parse_crate_from_file(input: str, cfg: ast::crate_cfg, sess: parse_sess) ->
112+
@ast::crate {
113+
if str::ends_with(input, ".rc") {
114+
parse_crate_from_crate_file(input, cfg, sess)
115+
} else if str::ends_with(input, ".rs") {
116+
parse_crate_from_source_file(input, cfg, sess)
117+
} else {
118+
sess.span_diagnostic.handler().fatal("unknown input file type: " +
119+
input)
120+
}
121+
}
122+
123+
fn parse_crate_from_source_file(input: str, cfg: ast::crate_cfg,
124+
sess: parse_sess) -> @ast::crate {
125+
let p = new_parser_from_file(sess, cfg, input, parser::SOURCE_FILE);
126+
let r = parser::parse_crate_mod(p, cfg);
127+
sess.chpos = p.reader.chpos;
128+
sess.byte_pos = sess.byte_pos + p.reader.pos;
129+
ret r;
130+
}
131+
132+
fn parse_expr_from_source_str(name: str, source: @str, cfg: ast::crate_cfg,
133+
sess: parse_sess) -> @ast::expr {
134+
let p = new_parser_from_source_str(
135+
sess, cfg, name, codemap::fss_none, source);
136+
let r = parser::parse_expr(p);
137+
sess.chpos = p.reader.chpos;
138+
sess.byte_pos = sess.byte_pos + p.reader.pos;
139+
ret r;
140+
}
141+
142+
fn parse_crate_from_source_str(name: str, source: @str, cfg: ast::crate_cfg,
143+
sess: parse_sess) -> @ast::crate {
144+
let p = new_parser_from_source_str(
145+
sess, cfg, name, codemap::fss_none, source);
146+
let r = parser::parse_crate_mod(p, cfg);
147+
sess.chpos = p.reader.chpos;
148+
sess.byte_pos = sess.byte_pos + p.reader.pos;
149+
ret r;
150+
}
151+
152+
fn parse_from_source_str<T>(f: fn (p: parser) -> T,
153+
name: str, ss: codemap::file_substr,
154+
source: @str, cfg: ast::crate_cfg,
155+
sess: parse_sess)
156+
-> T
157+
{
158+
let p = new_parser_from_source_str(sess, cfg, name, ss, source);
159+
let r = f(p);
160+
if !p.reader.is_eof() {
161+
p.reader.fatal("expected end-of-string");
162+
}
163+
sess.chpos = p.reader.chpos;
164+
sess.byte_pos = sess.byte_pos + p.reader.pos;
165+
ret r;
166+
}

src/librustsyntax/parse/eval.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
import attr;
2-
import parser::{parser, new_parser_from_file,
2+
import parser::{parser,
33
parse_inner_attrs_and_next,
44
parse_mod_items, SOURCE_FILE};
55

66
export eval_crate_directives_to_mod;
77

88
type ctx =
99
@{p: parser,
10-
sess: parser::parse_sess,
10+
sess: parse::parse_sess,
1111
cfg: ast::crate_cfg};
1212

1313
fn eval_crate_directives(cx: ctx, cdirs: [@ast::crate_directive], prefix: str,

0 commit comments

Comments
 (0)