4756: Cleanup resolution of file paths r=matklad a=matklad

bors r+
🤖

Co-authored-by: Aleksey Kladov <aleksey.kladov@gmail.com>
This commit is contained in:
bors[bot] 2020-06-05 13:15:31 +00:00 committed by GitHub
commit d06df2c3e7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 36 additions and 90 deletions

View File

@ -89,8 +89,7 @@ pub const DEFAULT_LRU_CAP: usize = 128;
pub trait FileLoader { pub trait FileLoader {
/// Text of the file. /// Text of the file.
fn file_text(&self, file_id: FileId) -> Arc<String>; fn file_text(&self, file_id: FileId) -> Arc<String>;
fn resolve_relative_path(&self, anchor: FileId, relative_path: &RelativePath) fn resolve_path(&self, anchor: FileId, path: &str) -> Option<FileId>;
-> Option<FileId>;
fn relevant_crates(&self, file_id: FileId) -> Arc<Vec<CrateId>>; fn relevant_crates(&self, file_id: FileId) -> Arc<Vec<CrateId>>;
fn resolve_extern_path( fn resolve_extern_path(
@ -155,20 +154,21 @@ impl<T: SourceDatabaseExt> FileLoader for FileLoaderDelegate<&'_ T> {
fn file_text(&self, file_id: FileId) -> Arc<String> { fn file_text(&self, file_id: FileId) -> Arc<String> {
SourceDatabaseExt::file_text(self.0, file_id) SourceDatabaseExt::file_text(self.0, file_id)
} }
fn resolve_relative_path( /// Note that we intentionally accept a `&str` and not a `&Path` here. This
&self, /// method exists to handle `#[path = "/some/path.rs"] mod foo;` and such,
anchor: FileId, /// so the input is guaranteed to be utf-8 string. We might introduce
relative_path: &RelativePath, /// `struct StrPath(str)` for clarity some day, but it's a bit messy, so we
) -> Option<FileId> { /// get by with a `&str` for the time being.
let path = { fn resolve_path(&self, anchor: FileId, path: &str) -> Option<FileId> {
let mut path = self.0.file_relative_path(anchor); let rel_path = {
assert!(path.pop()); let mut rel_path = self.0.file_relative_path(anchor);
path.push(relative_path); assert!(rel_path.pop());
path.normalize() rel_path.push(path);
rel_path.normalize()
}; };
let source_root = self.0.file_source_root(anchor); let source_root = self.0.file_source_root(anchor);
let source_root = self.0.source_root(source_root); let source_root = self.0.source_root(source_root);
source_root.file_by_relative_path(&path) source_root.file_by_relative_path(&rel_path)
} }
fn relevant_crates(&self, file_id: FileId) -> Arc<Vec<CrateId>> { fn relevant_crates(&self, file_id: FileId) -> Arc<Vec<CrateId>> {

View File

@ -61,7 +61,7 @@ impl ModDir {
}; };
for candidate in candidate_files.iter() { for candidate in candidate_files.iter() {
if let Some(file_id) = db.resolve_relative_path(file_id, candidate) { if let Some(file_id) = db.resolve_path(file_id, candidate.as_str()) {
let mut root_non_dir_owner = false; let mut root_non_dir_owner = false;
let mut mod_path = RelativePathBuf::new(); let mut mod_path = RelativePathBuf::new();
if !(candidate.ends_with("mod.rs") || attr_path.is_some()) { if !(candidate.ends_with("mod.rs") || attr_path.is_some()) {

View File

@ -58,12 +58,8 @@ impl FileLoader for TestDB {
fn file_text(&self, file_id: FileId) -> Arc<String> { fn file_text(&self, file_id: FileId) -> Arc<String> {
FileLoaderDelegate(self).file_text(file_id) FileLoaderDelegate(self).file_text(file_id)
} }
fn resolve_relative_path( fn resolve_path(&self, anchor: FileId, path: &str) -> Option<FileId> {
&self, FileLoaderDelegate(self).resolve_path(anchor, path)
anchor: FileId,
relative_path: &RelativePath,
) -> Option<FileId> {
FileLoaderDelegate(self).resolve_relative_path(anchor, relative_path)
} }
fn relevant_crates(&self, file_id: FileId) -> Arc<Vec<CrateId>> { fn relevant_crates(&self, file_id: FileId) -> Arc<Vec<CrateId>> {
FileLoaderDelegate(self).relevant_crates(file_id) FileLoaderDelegate(self).relevant_crates(file_id)

View File

@ -8,7 +8,7 @@ use crate::{
use crate::{quote, EagerMacroId, LazyMacroId, MacroCallId}; use crate::{quote, EagerMacroId, LazyMacroId, MacroCallId};
use either::Either; use either::Either;
use mbe::parse_to_token_tree; use mbe::parse_to_token_tree;
use ra_db::{FileId, RelativePath}; use ra_db::FileId;
use ra_parser::FragmentKind; use ra_parser::FragmentKind;
macro_rules! register_builtin { macro_rules! register_builtin {
@ -297,7 +297,7 @@ fn relative_file(db: &dyn AstDatabase, call_id: MacroCallId, path: &str) -> Opti
let call_site = call_id.as_file().original_file(db); let call_site = call_id.as_file().original_file(db);
// Handle trivial case // Handle trivial case
if let Some(res) = db.resolve_relative_path(call_site, &RelativePath::new(&path)) { if let Some(res) = db.resolve_path(call_site, path) {
// Prevent include itself // Prevent include itself
return if res == call_site { None } else { Some(res) }; return if res == call_site { None } else { Some(res) };
} }

View File

@ -41,12 +41,8 @@ impl FileLoader for TestDB {
fn file_text(&self, file_id: FileId) -> Arc<String> { fn file_text(&self, file_id: FileId) -> Arc<String> {
FileLoaderDelegate(self).file_text(file_id) FileLoaderDelegate(self).file_text(file_id)
} }
fn resolve_relative_path( fn resolve_path(&self, anchor: FileId, path: &str) -> Option<FileId> {
&self, FileLoaderDelegate(self).resolve_path(anchor, path)
anchor: FileId,
relative_path: &RelativePath,
) -> Option<FileId> {
FileLoaderDelegate(self).resolve_relative_path(anchor, relative_path)
} }
fn relevant_crates(&self, file_id: FileId) -> Arc<Vec<CrateId>> { fn relevant_crates(&self, file_id: FileId) -> Arc<Vec<CrateId>> {
FileLoaderDelegate(self).relevant_crates(file_id) FileLoaderDelegate(self).relevant_crates(file_id)

View File

@ -72,12 +72,8 @@ impl FileLoader for TestDB {
fn file_text(&self, file_id: FileId) -> Arc<String> { fn file_text(&self, file_id: FileId) -> Arc<String> {
FileLoaderDelegate(self).file_text(file_id) FileLoaderDelegate(self).file_text(file_id)
} }
fn resolve_relative_path( fn resolve_path(&self, anchor: FileId, path: &str) -> Option<FileId> {
&self, FileLoaderDelegate(self).resolve_path(anchor, path)
anchor: FileId,
relative_path: &RelativePath,
) -> Option<FileId> {
FileLoaderDelegate(self).resolve_relative_path(anchor, relative_path)
} }
fn relevant_crates(&self, file_id: FileId) -> Arc<Vec<CrateId>> { fn relevant_crates(&self, file_id: FileId) -> Arc<Vec<CrateId>> {
FileLoaderDelegate(self).relevant_crates(file_id) FileLoaderDelegate(self).relevant_crates(file_id)

View File

@ -57,12 +57,8 @@ impl FileLoader for RootDatabase {
fn file_text(&self, file_id: FileId) -> Arc<String> { fn file_text(&self, file_id: FileId) -> Arc<String> {
FileLoaderDelegate(self).file_text(file_id) FileLoaderDelegate(self).file_text(file_id)
} }
fn resolve_relative_path( fn resolve_path(&self, anchor: FileId, path: &str) -> Option<FileId> {
&self, FileLoaderDelegate(self).resolve_path(anchor, path)
anchor: FileId,
relative_path: &RelativePath,
) -> Option<FileId> {
FileLoaderDelegate(self).resolve_relative_path(anchor, relative_path)
} }
fn relevant_crates(&self, file_id: FileId) -> Arc<Vec<CrateId>> { fn relevant_crates(&self, file_id: FileId) -> Arc<Vec<CrateId>> {
FileLoaderDelegate(self).relevant_crates(file_id) FileLoaderDelegate(self).relevant_crates(file_id)

View File

@ -523,8 +523,6 @@ fn main() {
let vb = B; let vb = B;
message(); message();
} }
fn main() { message(); }
"###, "###,
) )
.with_config(|config| { .with_config(|config| {
@ -552,34 +550,16 @@ fn main() { message(); }
}, },
json!([{ json!([{
"originSelectionRange": { "originSelectionRange": {
"end": { "end": { "character": 10, "line": 12 },
"character": 10, "start": { "character": 8, "line": 12 }
"line": 12
},
"start": {
"character": 8,
"line": 12
}
}, },
"targetRange": { "targetRange": {
"end": { "end": { "character": 9, "line": 3 },
"character": 9, "start": { "character": 0, "line": 2 }
"line": 3
},
"start": {
"character": 0,
"line": 2
}
}, },
"targetSelectionRange": { "targetSelectionRange": {
"end": { "end": { "character": 8, "line": 3 },
"character": 8, "start": { "character": 7, "line": 3 }
"line": 3
},
"start": {
"character": 7,
"line": 3
}
}, },
"targetUri": "file:///[..]src/main.rs" "targetUri": "file:///[..]src/main.rs"
}]), }]),
@ -595,34 +575,16 @@ fn main() { message(); }
}, },
json!([{ json!([{
"originSelectionRange": { "originSelectionRange": {
"end": { "end": { "character": 10, "line": 13 },
"character": 10, "start": { "character": 8, "line":13 }
"line": 13
},
"start": {
"character": 8,
"line":13
}
}, },
"targetRange": { "targetRange": {
"end": { "end": { "character": 9, "line": 7 },
"character": 9, "start": { "character": 0, "line":6 }
"line": 7
},
"start": {
"character": 0,
"line":6
}
}, },
"targetSelectionRange": { "targetSelectionRange": {
"end": { "end": { "character": 8, "line": 7 },
"character": 8, "start": { "character": 7, "line": 7 }
"line": 7
},
"start": {
"character": 7,
"line": 7
}
}, },
"targetUri": "file:///[..]src/main.rs" "targetUri": "file:///[..]src/main.rs"
}]), }]),