about summary refs log tree commit diff
diff options
context:
space:
mode:
authorMazdak Farrokhzad <twingoow@gmail.com>2020-03-08 12:19:27 +0100
committerMazdak Farrokhzad <twingoow@gmail.com>2020-03-18 15:08:25 +0100
commit8bab88f2d9d1c81ab8d80d903359900ef106d21e (patch)
tree900f257cffb0b4d1b7c933bc6224a14906109f85
parentb9e1b2661159a9c63d47ef181c259465b90dca6d (diff)
downloadrust-8bab88f2d9d1c81ab8d80d903359900ef106d21e.tar.gz
rust-8bab88f2d9d1c81ab8d80d903359900ef106d21e.zip
de-fatalize outline module parsing
-rw-r--r--src/librustc_ast/ast.rs2
-rw-r--r--src/librustc_parse/parser/module.rs37
-rw-r--r--src/test/ui/mod/mod_file_disambig.rs1
-rw-r--r--src/test/ui/mod/mod_file_disambig.stderr11
-rw-r--r--src/test/ui/parser/circular_modules_main.rs2
-rw-r--r--src/test/ui/parser/circular_modules_main.stderr14
-rw-r--r--src/test/ui/parser/mod_file_not_exist.rs1
-rw-r--r--src/test/ui/parser/mod_file_not_exist.stderr11
8 files changed, 52 insertions, 27 deletions
diff --git a/src/librustc_ast/ast.rs b/src/librustc_ast/ast.rs
index 68960ba9fe9..e3077b9897c 100644
--- a/src/librustc_ast/ast.rs
+++ b/src/librustc_ast/ast.rs
@@ -2153,7 +2153,7 @@ impl FnRetTy {
 /// Module declaration.
 ///
 /// E.g., `mod foo;` or `mod foo { .. }`.
-#[derive(Clone, RustcEncodable, RustcDecodable, Debug)]
+#[derive(Clone, RustcEncodable, RustcDecodable, Debug, Default)]
 pub struct Mod {
     /// A span from the first token past `{` to the last token until `}`.
     /// For `mod foo;`, the inner span ranges from the first token
diff --git a/src/librustc_parse/parser/module.rs b/src/librustc_parse/parser/module.rs
index d4cf39e28b0..8f99d88b8e4 100644
--- a/src/librustc_parse/parser/module.rs
+++ b/src/librustc_parse/parser/module.rs
@@ -8,7 +8,7 @@ use rustc_ast::attr;
 use rustc_ast::token::{self, TokenKind};
 use rustc_errors::{struct_span_err, PResult};
 use rustc_session::parse::ParseSess;
-use rustc_span::source_map::{FileName, Span, DUMMY_SP};
+use rustc_span::source_map::{FileName, Span};
 use rustc_span::symbol::sym;
 
 use std::path::{self, Path, PathBuf};
@@ -24,7 +24,7 @@ pub struct ModulePath<'a> {
 // Public for rustfmt usage.
 pub struct ModulePathSuccess {
     pub path: PathBuf,
-    pub directory_ownership: DirectoryOwnership,
+    pub ownership: DirectoryOwnership,
 }
 
 impl<'a> Parser<'a> {
@@ -45,16 +45,13 @@ impl<'a> Parser<'a> {
         let (module, mut inner_attrs) = if self.eat(&token::Semi) {
             if in_cfg && self.recurse_into_file_modules {
                 // This mod is in an external file. Let's go get it!
-                let ModulePathSuccess { path, directory_ownership } = submod_path(
-                    self.sess,
-                    id,
-                    &attrs,
-                    self.directory.ownership,
-                    &self.directory.path,
-                )?;
-                eval_src_mod(self.sess, self.cfg_mods, path, directory_ownership, id)?
+                let dir = &self.directory;
+                submod_path(self.sess, id, &attrs, dir.ownership, &dir.path)
+                    .and_then(|r| eval_src_mod(self.sess, self.cfg_mods, r.path, r.ownership, id))
+                    .map_err(|mut err| err.emit())
+                    .unwrap_or_default()
             } else {
-                (ast::Mod { inner: DUMMY_SP, items: Vec::new(), inline: false }, Vec::new())
+                Default::default()
             }
         } else {
             let old_directory = self.directory.clone();
@@ -162,12 +159,12 @@ pub fn push_directory(
 fn submod_path<'a>(
     sess: &'a ParseSess,
     id: ast::Ident,
-    outer_attrs: &[Attribute],
-    directory_ownership: DirectoryOwnership,
+    attrs: &[Attribute],
+    ownership: DirectoryOwnership,
     dir_path: &Path,
 ) -> PResult<'a, ModulePathSuccess> {
-    if let Some(path) = submod_path_from_attr(outer_attrs, dir_path) {
-        let directory_ownership = match path.file_name().and_then(|s| s.to_str()) {
+    if let Some(path) = submod_path_from_attr(attrs, dir_path) {
+        let ownership = match path.file_name().and_then(|s| s.to_str()) {
             // All `#[path]` files are treated as though they are a `mod.rs` file.
             // This means that `mod foo;` declarations inside `#[path]`-included
             // files are siblings,
@@ -178,16 +175,16 @@ fn submod_path<'a>(
             Some(_) => DirectoryOwnership::Owned { relative: None },
             _ => DirectoryOwnership::UnownedViaMod,
         };
-        return Ok(ModulePathSuccess { directory_ownership, path });
+        return Ok(ModulePathSuccess { ownership, path });
     }
 
-    let relative = match directory_ownership {
+    let relative = match ownership {
         DirectoryOwnership::Owned { relative } => relative,
         DirectoryOwnership::UnownedViaBlock | DirectoryOwnership::UnownedViaMod => None,
     };
     let ModulePath { path_exists, name, result } =
         default_submod_path(sess, id, relative, dir_path);
-    match directory_ownership {
+    match ownership {
         DirectoryOwnership::Owned { .. } => Ok(result?),
         DirectoryOwnership::UnownedViaBlock => {
             let _ = result.map_err(|mut err| err.cancel());
@@ -300,11 +297,11 @@ pub fn default_submod_path<'a>(
     let result = match (default_exists, secondary_exists) {
         (true, false) => Ok(ModulePathSuccess {
             path: default_path,
-            directory_ownership: DirectoryOwnership::Owned { relative: Some(id) },
+            ownership: DirectoryOwnership::Owned { relative: Some(id) },
         }),
         (false, true) => Ok(ModulePathSuccess {
             path: secondary_path,
-            directory_ownership: DirectoryOwnership::Owned { relative: None },
+            ownership: DirectoryOwnership::Owned { relative: None },
         }),
         (false, false) => {
             let mut err = struct_span_err!(
diff --git a/src/test/ui/mod/mod_file_disambig.rs b/src/test/ui/mod/mod_file_disambig.rs
index ef203ef082b..7b182421d34 100644
--- a/src/test/ui/mod/mod_file_disambig.rs
+++ b/src/test/ui/mod/mod_file_disambig.rs
@@ -2,4 +2,5 @@ mod mod_file_disambig_aux; //~ ERROR file for module `mod_file_disambig_aux` fou
 
 fn main() {
     assert_eq!(mod_file_aux::bar(), 10);
+    //~^ ERROR failed to resolve: use of undeclared type or module `mod_file_aux`
 }
diff --git a/src/test/ui/mod/mod_file_disambig.stderr b/src/test/ui/mod/mod_file_disambig.stderr
index 2b77d866fb3..230bfa79916 100644
--- a/src/test/ui/mod/mod_file_disambig.stderr
+++ b/src/test/ui/mod/mod_file_disambig.stderr
@@ -6,6 +6,13 @@ LL | mod mod_file_disambig_aux;
    |
    = help: delete or rename one of them to remove the ambiguity
 
-error: aborting due to previous error
+error[E0433]: failed to resolve: use of undeclared type or module `mod_file_aux`
+  --> $DIR/mod_file_disambig.rs:4:16
+   |
+LL |     assert_eq!(mod_file_aux::bar(), 10);
+   |                ^^^^^^^^^^^^ use of undeclared type or module `mod_file_aux`
+
+error: aborting due to 2 previous errors
 
-For more information about this error, try `rustc --explain E0584`.
+Some errors have detailed explanations: E0433, E0584.
+For more information about an error, try `rustc --explain E0433`.
diff --git a/src/test/ui/parser/circular_modules_main.rs b/src/test/ui/parser/circular_modules_main.rs
index b85003bf091..1ae36a1f760 100644
--- a/src/test/ui/parser/circular_modules_main.rs
+++ b/src/test/ui/parser/circular_modules_main.rs
@@ -6,5 +6,5 @@ pub fn hi_str() -> String {
 }
 
 fn main() {
-    circular_modules_hello::say_hello();
+    circular_modules_hello::say_hello(); //~ ERROR cannot find function `say_hello` in module
 }
diff --git a/src/test/ui/parser/circular_modules_main.stderr b/src/test/ui/parser/circular_modules_main.stderr
index 33865fb7bca..ca84f2d2854 100644
--- a/src/test/ui/parser/circular_modules_main.stderr
+++ b/src/test/ui/parser/circular_modules_main.stderr
@@ -4,5 +4,17 @@ error: circular modules: $DIR/circular_modules_hello.rs -> $DIR/circular_modules
 LL | mod circular_modules_hello;
    |     ^^^^^^^^^^^^^^^^^^^^^^
 
-error: aborting due to previous error
+error[E0425]: cannot find function `say_hello` in module `circular_modules_hello`
+  --> $DIR/circular_modules_main.rs:9:29
+   |
+LL |     circular_modules_hello::say_hello();
+   |                             ^^^^^^^^^ not found in `circular_modules_hello`
+   |
+help: possible candidate is found in another module, you can import it into scope
+   |
+LL | use circular_modules_hello::say_hello;
+   |
+
+error: aborting due to 2 previous errors
 
+For more information about this error, try `rustc --explain E0425`.
diff --git a/src/test/ui/parser/mod_file_not_exist.rs b/src/test/ui/parser/mod_file_not_exist.rs
index 71fbc7aea45..aee778d1013 100644
--- a/src/test/ui/parser/mod_file_not_exist.rs
+++ b/src/test/ui/parser/mod_file_not_exist.rs
@@ -5,4 +5,5 @@ mod not_a_real_file; //~ ERROR file not found for module `not_a_real_file`
 
 fn main() {
     assert_eq!(mod_file_aux::bar(), 10);
+    //~^ ERROR failed to resolve: use of undeclared type or module `mod_file_aux`
 }
diff --git a/src/test/ui/parser/mod_file_not_exist.stderr b/src/test/ui/parser/mod_file_not_exist.stderr
index db3ea04ac76..c298c51c4f8 100644
--- a/src/test/ui/parser/mod_file_not_exist.stderr
+++ b/src/test/ui/parser/mod_file_not_exist.stderr
@@ -6,6 +6,13 @@ LL | mod not_a_real_file;
    |
    = help: to create the module `not_a_real_file`, create file "$DIR/not_a_real_file.rs"
 
-error: aborting due to previous error
+error[E0433]: failed to resolve: use of undeclared type or module `mod_file_aux`
+  --> $DIR/mod_file_not_exist.rs:7:16
+   |
+LL |     assert_eq!(mod_file_aux::bar(), 10);
+   |                ^^^^^^^^^^^^ use of undeclared type or module `mod_file_aux`
+
+error: aborting due to 2 previous errors
 
-For more information about this error, try `rustc --explain E0583`.
+Some errors have detailed explanations: E0433, E0583.
+For more information about an error, try `rustc --explain E0433`.