diff options
| author | Brian Anderson <banderson@mozilla.com> | 2012-11-18 14:14:40 -0800 |
|---|---|---|
| committer | Brian Anderson <banderson@mozilla.com> | 2012-11-18 18:09:41 -0800 |
| commit | 74b2e9979738ce413209aa4342fc35afe68c68de (patch) | |
| tree | 1a6c24b0e8ea072cb651f60170e420e1a64686ae /src/libsyntax/parse.rs | |
| parent | 72cc1aca175044ceb003a8b270940bec1da85460 (diff) | |
| download | rust-74b2e9979738ce413209aa4342fc35afe68c68de.tar.gz rust-74b2e9979738ce413209aa4342fc35afe68c68de.zip | |
Report errors better when failing to open files for sub-parsers
Diffstat (limited to 'src/libsyntax/parse.rs')
| -rw-r--r-- | src/libsyntax/parse.rs | 59 |
1 files changed, 44 insertions, 15 deletions
diff --git a/src/libsyntax/parse.rs b/src/libsyntax/parse.rs index 593ff6d034e..fc9474bab24 100644 --- a/src/libsyntax/parse.rs +++ b/src/libsyntax/parse.rs @@ -6,6 +6,7 @@ export next_node_id; export new_parser_from_file, new_parser_etc_from_file; export new_parser_from_source_str; export new_parser_from_tt; +export new_sub_parser_from_file; export parse_crate_from_file, parse_crate_from_crate_file; export parse_crate_from_source_str; export parse_expr_from_source_str, parse_item_from_source_str; @@ -20,7 +21,7 @@ use util::interner; use diagnostic::{span_handler, mk_span_handler, mk_handler, emitter}; use lexer::{reader, string_reader}; use parse::token::{ident_interner, mk_ident_interner}; -use codemap::{CodeMap, FileMap, CharPos, BytePos}; +use codemap::{span, CodeMap, FileMap, CharPos, BytePos}; type parse_sess = @{ cm: @codemap::CodeMap, @@ -61,8 +62,8 @@ fn parse_crate_from_file(input: &Path, cfg: ast::crate_cfg, fn parse_crate_from_crate_file(input: &Path, cfg: ast::crate_cfg, sess: parse_sess) -> @ast::crate { - let p = new_parser_from_file(sess, cfg, input, - parser::CRATE_FILE); + let p = new_crate_parser_from_file(sess, cfg, input, + parser::CRATE_FILE); let lo = p.span.lo; let prefix = input.dir_path(); let leading_attrs = p.parse_inner_attrs_and_next(); @@ -84,8 +85,8 @@ fn parse_crate_from_crate_file(input: &Path, cfg: ast::crate_cfg, fn parse_crate_from_source_file(input: &Path, cfg: ast::crate_cfg, sess: parse_sess) -> @ast::crate { - let p = new_parser_from_file(sess, cfg, input, - parser::SOURCE_FILE); + let p = new_crate_parser_from_file(sess, cfg, input, + parser::SOURCE_FILE); let r = p.parse_crate_mod(cfg); return r; } @@ -163,17 +164,45 @@ fn new_parser_from_source_str(sess: parse_sess, cfg: ast::crate_cfg, } fn new_parser_from_file(sess: parse_sess, cfg: ast::crate_cfg, - path: &Path, ftype: parser::file_type) -> Parser { - let res = io::read_whole_file_str(path); - match res { - result::Ok(_) => { /* Continue. */ } - result::Err(e) => sess.span_diagnostic.handler().fatal(e) + path: &Path, + ftype: parser::file_type) -> Result<Parser, ~str> { + match io::read_whole_file_str(path) { + result::Ok(move src) => { + let filemap = sess.cm.new_filemap(path.to_str(), @move src); + let srdr = lexer::new_string_reader(sess.span_diagnostic, filemap, + sess.interner); + + Ok(Parser(sess, cfg, srdr as reader, ftype)) + + } + result::Err(move e) => Err(move e) + } +} + +/// Create a new parser for an entire crate, handling errors as appropriate +/// if the file doesn't exist +fn new_crate_parser_from_file(sess: parse_sess, cfg: ast::crate_cfg, + path: &Path, + ftype: parser::file_type) -> Parser { + match new_parser_from_file(sess, cfg, path, ftype) { + Ok(move parser) => move parser, + Err(move e) => { + sess.span_diagnostic.handler().fatal(e) + } + } +} + +/// Create a new parser based on a span from an existing parser. Handles +/// error messages correctly when the file does not exist. +fn new_sub_parser_from_file(sess: parse_sess, cfg: ast::crate_cfg, + path: &Path, ftype: parser::file_type, + sp: span) -> Parser { + match new_parser_from_file(sess, cfg, path, ftype) { + Ok(move parser) => move parser, + Err(move e) => { + sess.span_diagnostic.span_fatal(sp, e) + } } - let src = @result::unwrap(res); - let filemap = sess.cm.new_filemap(path.to_str(), src); - let srdr = lexer::new_string_reader(sess.span_diagnostic, filemap, - sess.interner); - return Parser(sess, cfg, srdr as reader, ftype); } fn new_parser_from_tt(sess: parse_sess, cfg: ast::crate_cfg, |
