summary refs log tree commit diff
path: root/src/libsyntax/parse.rs
diff options
context:
space:
mode:
authorBrian Anderson <banderson@mozilla.com>2012-11-18 14:14:40 -0800
committerBrian Anderson <banderson@mozilla.com>2012-11-18 18:09:41 -0800
commit74b2e9979738ce413209aa4342fc35afe68c68de (patch)
tree1a6c24b0e8ea072cb651f60170e420e1a64686ae /src/libsyntax/parse.rs
parent72cc1aca175044ceb003a8b270940bec1da85460 (diff)
downloadrust-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.rs59
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,