mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-10-01 11:31:15 +00:00
Merge #4756
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:
commit
d06df2c3e7
@ -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>> {
|
||||||
|
@ -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()) {
|
||||||
|
@ -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)
|
||||||
|
@ -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) };
|
||||||
}
|
}
|
||||||
|
@ -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)
|
||||||
|
@ -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)
|
||||||
|
@ -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)
|
||||||
|
@ -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"
|
||||||
}]),
|
}]),
|
||||||
|
Loading…
x
Reference in New Issue
Block a user