Skip to content

Commit ed39523

Browse files
committed
Auto merge of #51278 - EPashkin:fix_mod_with_multilevel_paths_on_windows, r=nikomatsakis
Fix processing mod with multi-level path on Windows Fix error in [rustfmt](rust-lang/rustfmt#1754) because libsyntax can not handle `mod` with multilevel path on Windows. Alternative is do almost same in https://github.com/rust-lang/rust/blob/master/src/libstd/sys/windows/fs.rs#L717 to allow work on paths with different separators, Ex. "\\\\?\\c:\\windows/temp"
2 parents fc19590 + cb5e973 commit ed39523

File tree

4 files changed

+62
-1
lines changed

4 files changed

+62
-1
lines changed

src/libsyntax/parse/parser.rs

+13-1
Original file line numberDiff line numberDiff line change
@@ -6128,7 +6128,19 @@ impl<'a> Parser<'a> {
61286128
}
61296129

61306130
pub fn submod_path_from_attr(attrs: &[Attribute], dir_path: &Path) -> Option<PathBuf> {
6131-
attr::first_attr_value_str_by_name(attrs, "path").map(|d| dir_path.join(&d.as_str()))
6131+
if let Some(s) = attr::first_attr_value_str_by_name(attrs, "path") {
6132+
let s = s.as_str();
6133+
6134+
// On windows, the base path might have the form
6135+
// `\\?\foo\bar` in which case it does not tolerate
6136+
// mixed `/` and `\` separators, so canonicalize
6137+
// `/` to `\`.
6138+
#[cfg(windows)]
6139+
let s = s.replace("/", "\\");
6140+
Some(dir_path.join(s))
6141+
} else {
6142+
None
6143+
}
61326144
}
61336145

61346146
/// Returns either a path to a module, or .
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
// Copyright 2012-2014 The Rust Project Developers. See the COPYRIGHT
2+
// file at the top-level directory of this distribution and at
3+
// http://rust-lang.org/COPYRIGHT.
4+
//
5+
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6+
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7+
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8+
// option. This file may not be copied, modified, or distributed
9+
// except according to those terms.
10+
11+
// Testing that a libsyntax can parse modules with canonicalized base path
12+
// ignore-cross-compile
13+
14+
#![feature(rustc_private)]
15+
16+
extern crate syntax;
17+
18+
use std::path::Path;
19+
use syntax::codemap::FilePathMapping;
20+
use syntax::parse::{self, ParseSess};
21+
22+
#[path = "mod_dir_simple/test.rs"]
23+
mod gravy;
24+
25+
pub fn main() {
26+
syntax::with_globals(|| parse());
27+
28+
assert_eq!(gravy::foo(), 10);
29+
}
30+
31+
fn parse() {
32+
let parse_session = ParseSess::new(FilePathMapping::empty());
33+
34+
let path = Path::new(file!());
35+
let path = path.canonicalize().unwrap();
36+
let mut parser = parse::new_parser_from_file(&parse_session, &path);
37+
let _ = parser.parse_crate_mod();
38+
}

src/test/run-pass-fulldeps/mod_dir_simple/compiletest-ignore-dir

Whitespace-only changes.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
// Copyright 2012 The Rust Project Developers. See the COPYRIGHT
2+
// file at the top-level directory of this distribution and at
3+
// http://rust-lang.org/COPYRIGHT.
4+
//
5+
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6+
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7+
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8+
// option. This file may not be copied, modified, or distributed
9+
// except according to those terms.
10+
11+
pub fn foo() -> isize { 10 }

0 commit comments

Comments
 (0)