Skip to content

Commit fd3f4c5

Browse files
Merge #10467
10467: Optimize CodeLens for references/impls r=Veykril a=ericsampson Don't do unnecessary work. Followup to #10447 . cc `@Veykril` Co-authored-by: Eric Sampson <[email protected]>
2 parents f30b62b + efca421 commit fd3f4c5

File tree

1 file changed

+35
-27
lines changed

1 file changed

+35
-27
lines changed

crates/ide/src/annotations.rs

+35-27
Original file line numberDiff line numberDiff line change
@@ -64,31 +64,53 @@ pub(crate) fn annotations(
6464

6565
visit_file_defs(&Semantics::new(db), file_id, &mut |def| match def {
6666
Either::Left(def) => {
67-
let (range, ranges_enum_variants) = match def {
68-
hir::ModuleDef::Const(konst) => {
69-
(konst.source(db).and_then(|node| name_range(&node, file_id)), vec![])
67+
let range = match def {
68+
hir::ModuleDef::Const(konst) if config.annotate_references => {
69+
konst.source(db).and_then(|node| name_range(&node, file_id))
7070
}
71-
hir::ModuleDef::Trait(trait_) => {
72-
(trait_.source(db).and_then(|node| name_range(&node, file_id)), vec![])
71+
hir::ModuleDef::Trait(trait_)
72+
if config.annotate_references || config.annotate_impls =>
73+
{
74+
trait_.source(db).and_then(|node| name_range(&node, file_id))
7375
}
7476
hir::ModuleDef::Adt(adt) => match adt {
75-
hir::Adt::Enum(enum_) => (
76-
enum_.source(db).and_then(|node| name_range(&node, file_id)),
77+
hir::Adt::Enum(enum_) => {
7778
if config.annotate_enum_variant_references {
7879
enum_
7980
.variants(db)
8081
.into_iter()
8182
.map(|variant| {
8283
variant.source(db).and_then(|node| name_range(&node, file_id))
8384
})
84-
.collect()
85+
.filter_map(std::convert::identity)
86+
.for_each(|range| {
87+
annotations.push(Annotation {
88+
range,
89+
kind: AnnotationKind::HasReferences {
90+
position: FilePosition {
91+
file_id,
92+
offset: range.start(),
93+
},
94+
data: None,
95+
},
96+
})
97+
})
98+
}
99+
if config.annotate_references || config.annotate_impls {
100+
enum_.source(db).and_then(|node| name_range(&node, file_id))
85101
} else {
86-
vec![]
87-
},
88-
),
89-
_ => (adt.source(db).and_then(|node| name_range(&node, file_id)), vec![]),
102+
None
103+
}
104+
}
105+
_ => {
106+
if config.annotate_references || config.annotate_impls {
107+
adt.source(db).and_then(|node| name_range(&node, file_id))
108+
} else {
109+
None
110+
}
111+
}
90112
},
91-
_ => (None, vec![]),
113+
_ => None,
92114
};
93115

94116
let (range, offset) = match range {
@@ -115,20 +137,6 @@ pub(crate) fn annotations(
115137
});
116138
}
117139

118-
if config.annotate_enum_variant_references {
119-
for range_enum_variant in
120-
ranges_enum_variants.into_iter().filter_map(std::convert::identity)
121-
{
122-
annotations.push(Annotation {
123-
range: range_enum_variant,
124-
kind: AnnotationKind::HasReferences {
125-
position: FilePosition { file_id, offset: range_enum_variant.start() },
126-
data: None,
127-
},
128-
});
129-
}
130-
}
131-
132140
fn name_range<T: HasName>(node: &InFile<T>, file_id: FileId) -> Option<TextRange> {
133141
if node.file_id == file_id.into() {
134142
node.value.name().map(|it| it.syntax().text_range())

0 commit comments

Comments
 (0)