mirror of
https://github.com/rust-lang/rust-analyzer
synced 2025-01-28 21:05:13 +00:00
1834bae5b8
This wasn't a right decision in the first place, the feature flag was broken in the last rustfmt release, and syntax highlighting of imports is more important anyway
90 lines
2.7 KiB
Rust
90 lines
2.7 KiB
Rust
use ra_db::{CrateId, FileId, FilePosition};
|
|
|
|
use crate::{db::RootDatabase, NavigationTarget};
|
|
|
|
/// This returns `Vec` because a module may be included from several places. We
|
|
/// don't handle this case yet though, so the Vec has length at most one.
|
|
pub(crate) fn parent_module(db: &RootDatabase, position: FilePosition) -> Vec<NavigationTarget> {
|
|
let module = match hir::source_binder::module_from_position(db, position) {
|
|
None => return Vec::new(),
|
|
Some(it) => it,
|
|
};
|
|
let nav = NavigationTarget::from_module_to_decl(db, module);
|
|
vec![nav]
|
|
}
|
|
|
|
/// Returns `Vec` for the same reason as `parent_module`
|
|
pub(crate) fn crate_for(db: &RootDatabase, file_id: FileId) -> Vec<CrateId> {
|
|
let module = match hir::source_binder::module_from_file_id(db, file_id) {
|
|
Some(it) => it,
|
|
None => return Vec::new(),
|
|
};
|
|
let krate = match module.krate(db) {
|
|
Some(it) => it,
|
|
None => return Vec::new(),
|
|
};
|
|
vec![krate.crate_id()]
|
|
}
|
|
|
|
#[cfg(test)]
|
|
mod tests {
|
|
use crate::{
|
|
mock_analysis::{analysis_and_position, MockAnalysis},
|
|
AnalysisChange, CrateGraph,
|
|
Edition::Edition2018,
|
|
};
|
|
|
|
#[test]
|
|
fn test_resolve_parent_module() {
|
|
let (analysis, pos) = analysis_and_position(
|
|
"
|
|
//- /lib.rs
|
|
mod foo;
|
|
//- /foo.rs
|
|
<|>// empty
|
|
",
|
|
);
|
|
let nav = analysis.parent_module(pos).unwrap().pop().unwrap();
|
|
nav.assert_match("foo MODULE FileId(1) [0; 8)");
|
|
}
|
|
|
|
#[test]
|
|
fn test_resolve_parent_module_for_inline() {
|
|
let (analysis, pos) = analysis_and_position(
|
|
"
|
|
//- /lib.rs
|
|
mod foo {
|
|
mod bar {
|
|
mod baz { <|> }
|
|
}
|
|
}
|
|
",
|
|
);
|
|
let nav = analysis.parent_module(pos).unwrap().pop().unwrap();
|
|
nav.assert_match("baz MODULE FileId(1) [32; 44)");
|
|
}
|
|
|
|
#[test]
|
|
fn test_resolve_crate_root() {
|
|
let mock = MockAnalysis::with_files(
|
|
"
|
|
//- /bar.rs
|
|
mod foo;
|
|
//- /foo.rs
|
|
// empty <|>
|
|
",
|
|
);
|
|
let root_file = mock.id_of("/bar.rs");
|
|
let mod_file = mock.id_of("/foo.rs");
|
|
let mut host = mock.analysis_host();
|
|
assert!(host.analysis().crate_for(mod_file).unwrap().is_empty());
|
|
|
|
let mut crate_graph = CrateGraph::default();
|
|
let crate_id = crate_graph.add_crate_root(root_file, Edition2018);
|
|
let mut change = AnalysisChange::new();
|
|
change.set_crate_graph(crate_graph);
|
|
host.apply_change(change);
|
|
|
|
assert_eq!(host.analysis().crate_for(mod_file).unwrap(), vec![crate_id]);
|
|
}
|
|
}
|