mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-09-30 13:51:31 +00:00
Minimize FileLoader interface
This commit is contained in:
parent
9c52f527a1
commit
bbb40d7463
6 changed files with 35 additions and 79 deletions
|
@ -89,14 +89,13 @@ pub const DEFAULT_LRU_CAP: usize = 128;
|
|||
pub trait FileLoader {
|
||||
/// Text of the file.
|
||||
fn file_text(&self, file_id: FileId) -> Arc<String>;
|
||||
/// Note that we intentionally accept a `&str` and not a `&Path` here. This
|
||||
/// method exists to handle `#[path = "/some/path.rs"] mod foo;` and such,
|
||||
/// so the input is guaranteed to be utf-8 string. We might introduce
|
||||
/// `struct StrPath(str)` for clarity some day, but it's a bit messy, so we
|
||||
/// get by with a `&str` for the time being.
|
||||
fn resolve_path(&self, anchor: FileId, path: &str) -> Option<FileId>;
|
||||
fn relevant_crates(&self, file_id: FileId) -> Arc<Vec<CrateId>>;
|
||||
|
||||
fn resolve_extern_path(
|
||||
&self,
|
||||
extern_id: ExternSourceId,
|
||||
relative_path: &RelativePath,
|
||||
) -> Option<FileId>;
|
||||
}
|
||||
|
||||
/// Database which stores all significant input facts: source code and project
|
||||
|
@ -154,34 +153,30 @@ impl<T: SourceDatabaseExt> FileLoader for FileLoaderDelegate<&'_ T> {
|
|||
fn file_text(&self, file_id: FileId) -> Arc<String> {
|
||||
SourceDatabaseExt::file_text(self.0, file_id)
|
||||
}
|
||||
/// Note that we intentionally accept a `&str` and not a `&Path` here. This
|
||||
/// method exists to handle `#[path = "/some/path.rs"] mod foo;` and such,
|
||||
/// so the input is guaranteed to be utf-8 string. We might introduce
|
||||
/// `struct StrPath(str)` for clarity some day, but it's a bit messy, so we
|
||||
/// get by with a `&str` for the time being.
|
||||
fn resolve_path(&self, anchor: FileId, path: &str) -> Option<FileId> {
|
||||
let rel_path = {
|
||||
let mut rel_path = self.0.file_relative_path(anchor);
|
||||
assert!(rel_path.pop());
|
||||
rel_path.push(path);
|
||||
rel_path.normalize()
|
||||
};
|
||||
let source_root = self.0.file_source_root(anchor);
|
||||
let source_root = self.0.source_root(source_root);
|
||||
source_root.file_by_relative_path(&rel_path)
|
||||
// FIXME: this *somehow* should be platform agnostic...
|
||||
if std::path::Path::new(path).is_absolute() {
|
||||
let krate = *self.relevant_crates(anchor).get(0)?;
|
||||
let (extern_source_id, relative_file) =
|
||||
self.0.crate_graph()[krate].extern_source.extern_path(path)?;
|
||||
|
||||
let source_root = self.0.source_root(SourceRootId(extern_source_id.0));
|
||||
source_root.file_by_relative_path(&relative_file)
|
||||
} else {
|
||||
let rel_path = {
|
||||
let mut rel_path = self.0.file_relative_path(anchor);
|
||||
assert!(rel_path.pop());
|
||||
rel_path.push(path);
|
||||
rel_path.normalize()
|
||||
};
|
||||
let source_root = self.0.file_source_root(anchor);
|
||||
let source_root = self.0.source_root(source_root);
|
||||
source_root.file_by_relative_path(&rel_path)
|
||||
}
|
||||
}
|
||||
|
||||
fn relevant_crates(&self, file_id: FileId) -> Arc<Vec<CrateId>> {
|
||||
let source_root = self.0.file_source_root(file_id);
|
||||
self.0.source_root_crates(source_root)
|
||||
}
|
||||
|
||||
fn resolve_extern_path(
|
||||
&self,
|
||||
extern_id: ExternSourceId,
|
||||
relative_path: &RelativePath,
|
||||
) -> Option<FileId> {
|
||||
let source_root = self.0.source_root(SourceRootId(extern_id.0));
|
||||
source_root.file_by_relative_path(&relative_path)
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue