mirror of
https://github.com/rust-lang/rust-analyzer
synced 2024-12-25 12:33:33 +00:00
Rewrite goto definition tests
This commit is contained in:
parent
d34e725f09
commit
4484908a86
5 changed files with 484 additions and 611 deletions
|
@ -80,7 +80,7 @@ pub struct FilePosition {
|
|||
pub offset: TextSize,
|
||||
}
|
||||
|
||||
#[derive(Clone, Copy, Debug)]
|
||||
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
|
||||
pub struct FileRange {
|
||||
pub file_id: FileId,
|
||||
pub range: TextRange,
|
||||
|
|
|
@ -64,6 +64,7 @@ impl NavigationTarget {
|
|||
self.file_id
|
||||
}
|
||||
|
||||
// TODO: inconsistent
|
||||
pub fn file_range(&self) -> FileRange {
|
||||
FileRange { file_id: self.file_id, range: self.full_range }
|
||||
}
|
||||
|
@ -283,11 +284,13 @@ impl ToNav for hir::ImplDef {
|
|||
} else {
|
||||
original_range(db, src.as_ref().map(|it| it.syntax()))
|
||||
};
|
||||
let focus_range =
|
||||
src.value.target_type().map(|ty| original_range(db, src.with_value(ty.syntax())).range);
|
||||
|
||||
NavigationTarget::from_syntax(
|
||||
frange.file_id,
|
||||
"impl".into(),
|
||||
None,
|
||||
focus_range,
|
||||
frange.range,
|
||||
src.value.syntax().kind(),
|
||||
)
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -3,11 +3,15 @@ use std::sync::Arc;
|
|||
|
||||
use ra_cfg::CfgOptions;
|
||||
use ra_db::{CrateName, Env, FileSet, SourceRoot, VfsPath};
|
||||
use test_utils::{extract_range_or_offset, Fixture, RangeOrOffset, CURSOR_MARKER};
|
||||
use test_utils::{
|
||||
extract_annotations, extract_range_or_offset, Fixture, RangeOrOffset, CURSOR_MARKER,
|
||||
};
|
||||
|
||||
use crate::{
|
||||
Analysis, AnalysisChange, AnalysisHost, CrateGraph, Edition, FileId, FilePosition, FileRange,
|
||||
};
|
||||
use ra_syntax::TextRange;
|
||||
use rustc_hash::FxHashMap;
|
||||
|
||||
/// Mock analysis is used in test to bootstrap an AnalysisHost/Analysis
|
||||
/// from a set of in-memory files.
|
||||
|
@ -77,6 +81,28 @@ impl MockAnalysis {
|
|||
.expect("no file in this mock");
|
||||
FileId(idx as u32 + 1)
|
||||
}
|
||||
pub fn annotations(&self) -> FxHashMap<FileId, Vec<(TextRange, String)>> {
|
||||
self.files
|
||||
.iter()
|
||||
.enumerate()
|
||||
.filter_map(|(idx, fixture)| {
|
||||
let file_id = FileId(idx as u32 + 1);
|
||||
let annotations = extract_annotations(&fixture.text);
|
||||
if annotations.is_empty() {
|
||||
return None;
|
||||
}
|
||||
Some((file_id, annotations))
|
||||
})
|
||||
.collect()
|
||||
}
|
||||
pub fn annotation(&self) -> (FileRange, String) {
|
||||
let all = self.annotations();
|
||||
assert_eq!(all.len(), 1);
|
||||
let (file_id, mut for_file) = all.into_iter().next().unwrap();
|
||||
assert_eq!(for_file.len(), 1);
|
||||
let (range, data) = for_file.pop().unwrap();
|
||||
(FileRange { file_id, range}, data)
|
||||
}
|
||||
pub fn analysis_host(self) -> AnalysisHost {
|
||||
let mut host = AnalysisHost::default();
|
||||
let mut change = AnalysisChange::new();
|
||||
|
|
|
@ -177,6 +177,9 @@ There are many benefits to this:
|
|||
* less stuff printed during printf-debugging
|
||||
* less time to run test
|
||||
|
||||
It also makes sense to format snippets more compactly (for example, by placing enum defitions like `enum E { Foo, Bar }` on a single line),
|
||||
as long as they are still readable.
|
||||
|
||||
## Order of Imports
|
||||
|
||||
We separate import groups with blank lines
|
||||
|
|
Loading…
Reference in a new issue