Skip to content

Commit 49fd6a5

Browse files
committed
Split Declaration out into it's own type
1 parent cc96ddf commit 49fd6a5

File tree

2 files changed

+55
-49
lines changed

2 files changed

+55
-49
lines changed

crates/ra_ide/src/lib.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,9 @@ pub use crate::{
7575
inlay_hints::{InlayHint, InlayKind},
7676
line_index::{LineCol, LineIndex},
7777
line_index_utils::translate_offset_with_edit,
78-
references::{Reference, ReferenceAccess, ReferenceKind, ReferenceSearchResult, SearchScope},
78+
references::{
79+
Declaration, Reference, ReferenceAccess, ReferenceKind, ReferenceSearchResult, SearchScope,
80+
},
7981
runnables::{Runnable, RunnableKind},
8082
source_change::{FileSystemEdit, SourceChange, SourceFileEdit},
8183
syntax_highlighting::HighlightedRange,

crates/ra_ide/src/references.rs

Lines changed: 52 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -37,11 +37,17 @@ pub use self::search_scope::SearchScope;
3737

3838
#[derive(Debug, Clone)]
3939
pub struct ReferenceSearchResult {
40-
declaration: NavigationTarget,
41-
declaration_kind: ReferenceKind,
40+
declaration: Declaration,
4241
references: Vec<Reference>,
4342
}
4443

44+
#[derive(Debug, Clone)]
45+
pub struct Declaration {
46+
pub nav: NavigationTarget,
47+
pub kind: ReferenceKind,
48+
pub access: Option<ReferenceAccess>,
49+
}
50+
4551
#[derive(Debug, Clone)]
4652
pub struct Reference {
4753
pub file_range: FileRange,
@@ -62,10 +68,14 @@ pub enum ReferenceAccess {
6268
}
6369

6470
impl ReferenceSearchResult {
65-
pub fn declaration(&self) -> &NavigationTarget {
71+
pub fn declaration(&self) -> &Declaration {
6672
&self.declaration
6773
}
6874

75+
pub fn decl_target(&self) -> &NavigationTarget {
76+
&self.declaration.nav
77+
}
78+
6979
pub fn references(&self) -> &[Reference] {
7080
&self.references
7181
}
@@ -88,11 +98,11 @@ impl IntoIterator for ReferenceSearchResult {
8898
let mut v = Vec::with_capacity(self.len());
8999
v.push(Reference {
90100
file_range: FileRange {
91-
file_id: self.declaration.file_id(),
92-
range: self.declaration.range(),
101+
file_id: self.declaration.nav.file_id(),
102+
range: self.declaration.nav.range(),
93103
},
94-
kind: self.declaration_kind,
95-
access: None,
104+
kind: self.declaration.kind,
105+
access: self.declaration.access,
96106
});
97107
v.append(&mut self.references);
98108
v.into_iter()
@@ -139,15 +149,14 @@ pub(crate) fn find_all_refs(
139149
}
140150
};
141151

152+
let declaration = Declaration { nav: declaration, kind: ReferenceKind::Other, access: None };
153+
142154
let references = process_definition(db, def, name, search_scope)
143155
.into_iter()
144156
.filter(|r| search_kind == ReferenceKind::Other || search_kind == r.kind)
145157
.collect();
146158

147-
Some(RangeInfo::new(
148-
range,
149-
ReferenceSearchResult { declaration, references, declaration_kind: ReferenceKind::Other },
150-
))
159+
Some(RangeInfo::new(range, ReferenceSearchResult { declaration, references }))
151160
}
152161

153162
fn find_name<'a>(
@@ -259,7 +268,7 @@ fn access_mode(kind: NameKind, name_ref: &ast::NameRef) -> Option<ReferenceAcces
259268
mod tests {
260269
use crate::{
261270
mock_analysis::{analysis_and_position, single_file_with_position, MockAnalysis},
262-
Reference, ReferenceKind, ReferenceSearchResult, SearchScope,
271+
Declaration, Reference, ReferenceSearchResult, SearchScope,
263272
};
264273

265274
#[test]
@@ -279,8 +288,7 @@ mod tests {
279288
let refs = get_all_refs(code);
280289
check_result(
281290
refs,
282-
"Foo STRUCT_DEF FileId(1) [5; 39) [12; 15)",
283-
ReferenceKind::Other,
291+
"Foo STRUCT_DEF FileId(1) [5; 39) [12; 15) Other",
284292
&["FileId(1) [142; 145) StructLiteral"],
285293
);
286294
}
@@ -303,8 +311,7 @@ mod tests {
303311
let refs = get_all_refs(code);
304312
check_result(
305313
refs,
306-
"i BIND_PAT FileId(1) [33; 34)",
307-
ReferenceKind::Other,
314+
"i BIND_PAT FileId(1) [33; 34) Other",
308315
&[
309316
"FileId(1) [67; 68) Other Write",
310317
"FileId(1) [71; 72) Other Read",
@@ -324,8 +331,7 @@ mod tests {
324331
let refs = get_all_refs(code);
325332
check_result(
326333
refs,
327-
"i BIND_PAT FileId(1) [12; 13)",
328-
ReferenceKind::Other,
334+
"i BIND_PAT FileId(1) [12; 13) Other",
329335
&["FileId(1) [38; 39) Other Read"],
330336
);
331337
}
@@ -340,8 +346,7 @@ mod tests {
340346
let refs = get_all_refs(code);
341347
check_result(
342348
refs,
343-
"i BIND_PAT FileId(1) [12; 13)",
344-
ReferenceKind::Other,
349+
"i BIND_PAT FileId(1) [12; 13) Other",
345350
&["FileId(1) [38; 39) Other Read"],
346351
);
347352
}
@@ -362,8 +367,7 @@ mod tests {
362367
let refs = get_all_refs(code);
363368
check_result(
364369
refs,
365-
"spam RECORD_FIELD_DEF FileId(1) [66; 79) [70; 74)",
366-
ReferenceKind::Other,
370+
"spam RECORD_FIELD_DEF FileId(1) [66; 79) [70; 74) Other",
367371
&["FileId(1) [152; 156) Other Read"],
368372
);
369373
}
@@ -379,7 +383,7 @@ mod tests {
379383
"#;
380384

381385
let refs = get_all_refs(code);
382-
check_result(refs, "f FN_DEF FileId(1) [88; 104) [91; 92)", ReferenceKind::Other, &[]);
386+
check_result(refs, "f FN_DEF FileId(1) [88; 104) [91; 92) Other", &[]);
383387
}
384388

385389
#[test]
@@ -394,7 +398,7 @@ mod tests {
394398
"#;
395399

396400
let refs = get_all_refs(code);
397-
check_result(refs, "B ENUM_VARIANT FileId(1) [83; 84) [83; 84)", ReferenceKind::Other, &[]);
401+
check_result(refs, "B ENUM_VARIANT FileId(1) [83; 84) [83; 84) Other", &[]);
398402
}
399403

400404
#[test]
@@ -435,8 +439,7 @@ mod tests {
435439
let refs = analysis.find_all_refs(pos, None).unwrap().unwrap();
436440
check_result(
437441
refs,
438-
"Foo STRUCT_DEF FileId(2) [16; 50) [27; 30)",
439-
ReferenceKind::Other,
442+
"Foo STRUCT_DEF FileId(2) [16; 50) [27; 30) Other",
440443
&["FileId(1) [52; 55) StructLiteral", "FileId(3) [77; 80) StructLiteral"],
441444
);
442445
}
@@ -466,8 +469,7 @@ mod tests {
466469
let refs = analysis.find_all_refs(pos, None).unwrap().unwrap();
467470
check_result(
468471
refs,
469-
"foo SOURCE_FILE FileId(2) [0; 35)",
470-
ReferenceKind::Other,
472+
"foo SOURCE_FILE FileId(2) [0; 35) Other",
471473
&["FileId(1) [13; 16) Other"],
472474
);
473475
}
@@ -496,8 +498,7 @@ mod tests {
496498
let refs = analysis.find_all_refs(pos, None).unwrap().unwrap();
497499
check_result(
498500
refs,
499-
"Foo STRUCT_DEF FileId(3) [0; 41) [18; 21)",
500-
ReferenceKind::Other,
501+
"Foo STRUCT_DEF FileId(3) [0; 41) [18; 21) Other",
501502
&["FileId(2) [20; 23) Other", "FileId(2) [46; 49) StructLiteral"],
502503
);
503504
}
@@ -525,17 +526,15 @@ mod tests {
525526
let refs = analysis.find_all_refs(pos, None).unwrap().unwrap();
526527
check_result(
527528
refs,
528-
"quux FN_DEF FileId(1) [18; 34) [25; 29)",
529-
ReferenceKind::Other,
529+
"quux FN_DEF FileId(1) [18; 34) [25; 29) Other",
530530
&["FileId(2) [16; 20) Other", "FileId(3) [16; 20) Other"],
531531
);
532532

533533
let refs =
534534
analysis.find_all_refs(pos, Some(SearchScope::single_file(bar))).unwrap().unwrap();
535535
check_result(
536536
refs,
537-
"quux FN_DEF FileId(1) [18; 34) [25; 29)",
538-
ReferenceKind::Other,
537+
"quux FN_DEF FileId(1) [18; 34) [25; 29) Other",
539538
&["FileId(3) [16; 20) Other"],
540539
);
541540
}
@@ -554,8 +553,7 @@ mod tests {
554553
let refs = get_all_refs(code);
555554
check_result(
556555
refs,
557-
"m1 MACRO_CALL FileId(1) [9; 63) [46; 48)",
558-
ReferenceKind::Other,
556+
"m1 MACRO_CALL FileId(1) [9; 63) [46; 48) Other",
559557
&["FileId(1) [96; 98) Other", "FileId(1) [114; 116) Other"],
560558
);
561559
}
@@ -571,8 +569,7 @@ mod tests {
571569
let refs = get_all_refs(code);
572570
check_result(
573571
refs,
574-
"i BIND_PAT FileId(1) [36; 37)",
575-
ReferenceKind::Other,
572+
"i BIND_PAT FileId(1) [36; 37) Other",
576573
&["FileId(1) [55; 56) Other Write", "FileId(1) [59; 60) Other Read"],
577574
);
578575
}
@@ -592,8 +589,7 @@ mod tests {
592589
let refs = get_all_refs(code);
593590
check_result(
594591
refs,
595-
"f RECORD_FIELD_DEF FileId(1) [32; 38) [32; 33)",
596-
ReferenceKind::Other,
592+
"f RECORD_FIELD_DEF FileId(1) [32; 38) [32; 33) Other",
597593
&["FileId(1) [96; 97) Other Read", "FileId(1) [117; 118) Other Write"],
598594
);
599595
}
@@ -603,19 +599,27 @@ mod tests {
603599
analysis.find_all_refs(position, None).unwrap().unwrap()
604600
}
605601

606-
fn check_result(
607-
res: ReferenceSearchResult,
608-
expected_decl: &str,
609-
decl_kind: ReferenceKind,
610-
expected_refs: &[&str],
611-
) {
602+
fn check_result(res: ReferenceSearchResult, expected_decl: &str, expected_refs: &[&str]) {
612603
res.declaration().assert_match(expected_decl);
613-
assert_eq!(res.declaration_kind, decl_kind);
614-
615604
assert_eq!(res.references.len(), expected_refs.len());
616605
res.references().iter().enumerate().for_each(|(i, r)| r.assert_match(expected_refs[i]));
617606
}
618607

608+
impl Declaration {
609+
fn debug_render(&self) -> String {
610+
let mut s = format!("{} {:?}", self.nav.debug_render(), self.kind);
611+
if let Some(access) = self.access {
612+
s.push_str(&format!(" {:?}", access));
613+
}
614+
s
615+
}
616+
617+
fn assert_match(&self, expected: &str) {
618+
let actual = self.debug_render();
619+
test_utils::assert_eq_text!(expected.trim(), actual.trim(),);
620+
}
621+
}
622+
619623
impl Reference {
620624
fn debug_render(&self) -> String {
621625
let mut s = format!(

0 commit comments

Comments
 (0)