auto merge of #7926 : brson/rust/issue-4116, r=graydon
When loading a module the parser will look for either foo.rs or foo/mod.rs and generate an error when both are found.
This commit is contained in:
commit
7b2218d248
@ -3996,37 +3996,50 @@ impl Parser {
|
||||
let prefix = prefix.dir_path();
|
||||
let mod_path_stack = &*self.mod_path_stack;
|
||||
let mod_path = Path(".").push_many(*mod_path_stack);
|
||||
let dir_path = prefix.push_many(mod_path.components);
|
||||
let file_path = match ::attr::first_attr_value_str_by_name(
|
||||
outer_attrs, "path") {
|
||||
Some(d) => {
|
||||
let path = Path(d);
|
||||
if !path.is_absolute {
|
||||
mod_path.push(d)
|
||||
dir_path.push(d)
|
||||
} else {
|
||||
path
|
||||
}
|
||||
}
|
||||
None => mod_path.push(token::interner_get(id.name) + ".rs") // default
|
||||
None => {
|
||||
let mod_name = token::interner_get(id.name).to_owned();
|
||||
let default_path_str = mod_name + ".rs";
|
||||
let secondary_path_str = mod_name + "/mod.rs";
|
||||
let default_path = dir_path.push(default_path_str);
|
||||
let secondary_path = dir_path.push(secondary_path_str);
|
||||
let default_exists = default_path.exists();
|
||||
let secondary_exists = secondary_path.exists();
|
||||
match (default_exists, secondary_exists) {
|
||||
(true, false) => default_path,
|
||||
(false, true) => secondary_path,
|
||||
(false, false) => {
|
||||
self.span_fatal(id_sp, fmt!("file not found for module `%s`", mod_name));
|
||||
}
|
||||
(true, true) => {
|
||||
self.span_fatal(id_sp,
|
||||
fmt!("file for module `%s` found at both %s and %s",
|
||||
mod_name, default_path_str, secondary_path_str));
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
self.eval_src_mod_from_path(prefix,
|
||||
file_path,
|
||||
self.eval_src_mod_from_path(file_path,
|
||||
outer_attrs.to_owned(),
|
||||
id_sp)
|
||||
}
|
||||
|
||||
fn eval_src_mod_from_path(&self,
|
||||
prefix: Path,
|
||||
path: Path,
|
||||
outer_attrs: ~[ast::Attribute],
|
||||
id_sp: span) -> (ast::item_, ~[ast::Attribute]) {
|
||||
|
||||
let full_path = if path.is_absolute {
|
||||
path
|
||||
} else {
|
||||
prefix.push_many(path.components)
|
||||
};
|
||||
let full_path = full_path.normalize();
|
||||
let full_path = path.normalize();
|
||||
|
||||
let maybe_i = do self.sess.included_mod_stack.iter().position |p| { *p == full_path };
|
||||
match maybe_i {
|
||||
|
15
src/test/compile-fail/mod_file_disambig.rs
Normal file
15
src/test/compile-fail/mod_file_disambig.rs
Normal file
@ -0,0 +1,15 @@
|
||||
// Copyright 2012 The Rust Project Developers. See the COPYRIGHT
|
||||
// file at the top-level directory of this distribution and at
|
||||
// http://rust-lang.org/COPYRIGHT.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
mod mod_file_disambig_aux; //~ ERROR file for module `mod_file_disambig_aux` found at both
|
||||
|
||||
fn main() {
|
||||
assert_eq!(mod_file_aux::bar(), 10);
|
||||
}
|
@ -8,6 +8,4 @@
|
||||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
// error-pattern:error opening
|
||||
|
||||
mod doesnotexist;
|
||||
// xfail-test not a test. aux file
|
11
src/test/compile-fail/mod_file_disambig_aux/mod.rs
Normal file
11
src/test/compile-fail/mod_file_disambig_aux/mod.rs
Normal file
@ -0,0 +1,11 @@
|
||||
// Copyright 2012 The Rust Project Developers. See the COPYRIGHT
|
||||
// file at the top-level directory of this distribution and at
|
||||
// http://rust-lang.org/COPYRIGHT.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
// xfail-test not a test. aux file
|
@ -8,7 +8,7 @@
|
||||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
mod not_a_real_file; //~ ERROR not_a_real_file.rs
|
||||
mod not_a_real_file; //~ ERROR file not found for module `not_a_real_file`
|
||||
|
||||
fn main() {
|
||||
assert_eq!(mod_file_aux::bar(), 10);
|
||||
|
18
src/test/run-pass/mod_dir_implicit.rs
Normal file
18
src/test/run-pass/mod_dir_implicit.rs
Normal file
@ -0,0 +1,18 @@
|
||||
// Copyright 2012 The Rust Project Developers. See the COPYRIGHT
|
||||
// file at the top-level directory of this distribution and at
|
||||
// http://rust-lang.org/COPYRIGHT.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
// xfail-pretty
|
||||
// xfail-fast
|
||||
|
||||
mod mod_dir_implicit_aux;
|
||||
|
||||
pub fn main() {
|
||||
assert_eq!(mod_dir_implicit_aux::foo(), 10);
|
||||
}
|
11
src/test/run-pass/mod_dir_implicit_aux/mod.rs
Normal file
11
src/test/run-pass/mod_dir_implicit_aux/mod.rs
Normal file
@ -0,0 +1,11 @@
|
||||
// Copyright 2012 The Rust Project Developers. See the COPYRIGHT
|
||||
// file at the top-level directory of this distribution and at
|
||||
// http://rust-lang.org/COPYRIGHT.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
pub fn foo() -> int { 10 }
|
Loading…
Reference in New Issue
Block a user