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.rs | 150 |
1 files changed, 71 insertions, 79 deletions
diff --git a/crates/ide/src/annotations.rs b/crates/ide/src/annotations.rs index 47db002ef9..a7c12c1636 100644 --- a/crates/ide/src/annotations.rs +++ b/crates/ide/src/annotations.rs @@ -1,7 +1,7 @@ -use either::Either; use hir::{HasSource, InFile, Semantics}; use ide_db::{ base_db::{FileId, FilePosition, FileRange}, + defs::Definition, helpers::visit_file_defs, RootDatabase, }; @@ -62,91 +62,83 @@ pub(crate) fn annotations( } } - visit_file_defs(&Semantics::new(db), file_id, &mut |def| match def { - Either::Left(def) => { - let range = match def { - hir::ModuleDef::Const(konst) if config.annotate_references => { - konst.source(db).and_then(|node| name_range(&node, file_id)) - } - hir::ModuleDef::Trait(trait_) - if config.annotate_references || config.annotate_impls => - { - trait_.source(db).and_then(|node| name_range(&node, file_id)) - } - hir::ModuleDef::Adt(adt) => match adt { - hir::Adt::Enum(enum_) => { - if config.annotate_enum_variant_references { - enum_ - .variants(db) - .into_iter() - .map(|variant| { - variant.source(db).and_then(|node| name_range(&node, file_id)) - }) - .filter_map(std::convert::identity) - .for_each(|range| { - annotations.push(Annotation { - range, - kind: AnnotationKind::HasReferences { - position: FilePosition { - file_id, - offset: range.start(), - }, - data: None, - }, - }) + visit_file_defs(&Semantics::new(db), file_id, &mut |def| { + let range = match def { + Definition::Const(konst) if config.annotate_references => { + konst.source(db).and_then(|node| name_range(&node, file_id)) + } + Definition::Trait(trait_) if config.annotate_references || config.annotate_impls => { + trait_.source(db).and_then(|node| name_range(&node, file_id)) + } + Definition::Adt(adt) => match adt { + hir::Adt::Enum(enum_) => { + if config.annotate_enum_variant_references { + enum_ + .variants(db) + .into_iter() + .map(|variant| { + variant.source(db).and_then(|node| name_range(&node, file_id)) + }) + .filter_map(std::convert::identity) + .for_each(|range| { + annotations.push(Annotation { + range, + kind: AnnotationKind::HasReferences { + position: FilePosition { file_id, offset: range.start() }, + data: None, + }, }) - } - if config.annotate_references || config.annotate_impls { - enum_.source(db).and_then(|node| name_range(&node, file_id)) - } else { - None - } + }) + } + if config.annotate_references || config.annotate_impls { + enum_.source(db).and_then(|node| name_range(&node, file_id)) + } else { + None } - _ => { - if config.annotate_references || config.annotate_impls { - adt.source(db).and_then(|node| name_range(&node, file_id)) - } else { - None - } + } + _ => { + if config.annotate_references || config.annotate_impls { + adt.source(db).and_then(|node| name_range(&node, file_id)) + } else { + None } + } + }, + _ => None, + }; + + let (range, offset) = match range { + Some(range) => (range, range.start()), + None => return, + }; + + if config.annotate_impls && !matches!(def, Definition::Const(_)) { + annotations.push(Annotation { + range, + kind: AnnotationKind::HasImpls { + position: FilePosition { file_id, offset }, + data: None, }, - _ => None, - }; - - let (range, offset) = match range { - Some(range) => (range, range.start()), - None => return, - }; - - if config.annotate_impls && !matches!(def, hir::ModuleDef::Const(_)) { - annotations.push(Annotation { - range, - kind: AnnotationKind::HasImpls { - position: FilePosition { file_id, offset }, - data: None, - }, - }); - } - if config.annotate_references { - annotations.push(Annotation { - range, - kind: AnnotationKind::HasReferences { - position: FilePosition { file_id, offset }, - data: None, - }, - }); - } + }); + } + if config.annotate_references { + annotations.push(Annotation { + range, + kind: AnnotationKind::HasReferences { + position: FilePosition { file_id, offset }, + 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()) - } else { - // Node is outside the file we are adding annotations to (e.g. macros). - 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()) + } else { + // Node is outside the file we are adding annotations to (e.g. macros). + None } } - Either::Right(_) => (), }); if config.annotate_method_references { |