Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/ide/src/annotations.rs')
-rw-r--r--crates/ide/src/annotations.rs53
1 files changed, 45 insertions, 8 deletions
diff --git a/crates/ide/src/annotations.rs b/crates/ide/src/annotations.rs
index 472b396ac5..6c75bf3492 100644
--- a/crates/ide/src/annotations.rs
+++ b/crates/ide/src/annotations.rs
@@ -5,7 +5,7 @@ use ide_db::{
helpers::visit_file_defs,
RootDatabase,
};
-use syntax::{ast::HasName, AstNode, TextRange};
+use syntax::{ast::HasName, AstNode, TextRange, TextSize};
use crate::{
fn_references::find_all_methods,
@@ -40,6 +40,7 @@ pub struct AnnotationConfig {
pub annotate_impls: bool,
pub annotate_references: bool,
pub annotate_method_references: bool,
+ pub annotate_enum_variant_references: bool,
}
pub(crate) fn annotations(
@@ -63,18 +64,33 @@ pub(crate) fn annotations(
visit_file_defs(&Semantics::new(db), file_id, &mut |def| match def {
Either::Left(def) => {
- let range = match def {
+ let (range, ranges_variants) = match def {
hir::ModuleDef::Const(konst) => {
- konst.source(db).and_then(|node| name_range(&node, file_id))
+ (konst.source(db).and_then(|node| name_range(&node, file_id)), vec![None])
}
hir::ModuleDef::Trait(trait_) => {
- trait_.source(db).and_then(|node| name_range(&node, file_id))
+ (trait_.source(db).and_then(|node| name_range(&node, file_id)), vec![None])
}
- hir::ModuleDef::Adt(adt) => {
- adt.source(db).and_then(|node| name_range(&node, file_id))
- }
- _ => None,
+ hir::ModuleDef::Adt(adt) => match adt {
+ hir::Adt::Enum(enum_) => (
+ enum_.source(db).and_then(|node| name_range(&node, file_id)),
+ if config.annotate_enum_variant_references {
+ enum_
+ .variants(db)
+ .into_iter()
+ .map(|variant| {
+ variant.source(db).and_then(|node| name_range(&node, file_id))
+ })
+ .collect()
+ } else {
+ vec![None]
+ },
+ ),
+ _ => (adt.source(db).and_then(|node| name_range(&node, file_id)), vec![None]),
+ },
+ _ => (None, vec![None]),
};
+
let (range, offset) = match range {
Some(range) => (range, range.start()),
None => return,
@@ -99,6 +115,26 @@ pub(crate) fn annotations(
});
}
+ if config.annotate_enum_variant_references {
+ let mut variants_metadata: Vec<(TextRange, TextSize)> = Vec::new();
+ for range_variant in ranges_variants.into_iter() {
+ let (range, offset) = match range_variant {
+ Some(range) => (range, range.start()),
+ None => return,
+ };
+ variants_metadata.push((range, offset))
+ }
+ for variant_metadata in variants_metadata.into_iter() {
+ annotations.push(Annotation {
+ range: variant_metadata.0,
+ kind: AnnotationKind::HasReferences {
+ position: FilePosition { file_id, offset: variant_metadata.1 },
+ data: None,
+ },
+ });
+ }
+ }
+
fn name_range<T: HasName>(node: &InFile<T>, file_id: FileId) -> Option<TextRange> {
if node.file_id == file_id.into() {
node.value.name().map(|it| it.syntax().text_range())
@@ -173,6 +209,7 @@ mod tests {
annotate_impls: true,
annotate_references: true,
annotate_method_references: true,
+ annotate_enum_variant_references: true,
},
file_id,
)