From 0d77be67f7999d2032ad89dd2ad1c040a9f50388 Mon Sep 17 00:00:00 2001 From: Eric Sampson Date: Wed, 6 Oct 2021 01:16:31 -0500 Subject: [PATCH 1/2] Don't do work and then throw it away. --- crates/ide/src/annotations.rs | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/crates/ide/src/annotations.rs b/crates/ide/src/annotations.rs index 12c6852ea09..0cb069ba0ea 100644 --- a/crates/ide/src/annotations.rs +++ b/crates/ide/src/annotations.rs @@ -66,14 +66,26 @@ pub(crate) fn annotations( Either::Left(def) => { let (range, ranges_enum_variants) = match def { hir::ModuleDef::Const(konst) => { - (konst.source(db).and_then(|node| name_range(&node, file_id)), vec![]) + if config.annotate_references { + (konst.source(db).and_then(|node| name_range(&node, file_id)), vec![]) + } else { + (None, vec![]) + } } hir::ModuleDef::Trait(trait_) => { - (trait_.source(db).and_then(|node| name_range(&node, file_id)), vec![]) + if config.annotate_references || config.annotate_impls { + (trait_.source(db).and_then(|node| name_range(&node, file_id)), vec![]) + } else { + (None, vec![]) + } } hir::ModuleDef::Adt(adt) => match adt { hir::Adt::Enum(enum_) => ( - enum_.source(db).and_then(|node| name_range(&node, file_id)), + if config.annotate_references || config.annotate_impls { + enum_.source(db).and_then(|node| name_range(&node, file_id)) + } else { + None + }, if config.annotate_enum_variant_references { enum_ .variants(db) @@ -86,7 +98,13 @@ pub(crate) fn annotations( vec![] }, ), - _ => (adt.source(db).and_then(|node| name_range(&node, file_id)), vec![]), + _ => { + if config.annotate_references || config.annotate_impls { + (adt.source(db).and_then(|node| name_range(&node, file_id)), vec![]) + } else { + (None, vec![]) + } + } }, _ => (None, vec![]), }; From efca421c4365c1ab65927e388e18b8d91234d2ab Mon Sep 17 00:00:00 2001 From: Eric Sampson Date: Wed, 6 Oct 2021 16:43:37 -0500 Subject: [PATCH 2/2] Refactor to eliminate a vector allocation. --- crates/ide/src/annotations.rs | 70 +++++++++++++++-------------------- 1 file changed, 30 insertions(+), 40 deletions(-) diff --git a/crates/ide/src/annotations.rs b/crates/ide/src/annotations.rs index 0cb069ba0ea..47db002ef90 100644 --- a/crates/ide/src/annotations.rs +++ b/crates/ide/src/annotations.rs @@ -64,28 +64,17 @@ pub(crate) fn annotations( visit_file_defs(&Semantics::new(db), file_id, &mut |def| match def { Either::Left(def) => { - let (range, ranges_enum_variants) = match def { - hir::ModuleDef::Const(konst) => { - if config.annotate_references { - (konst.source(db).and_then(|node| name_range(&node, file_id)), vec![]) - } else { - (None, vec![]) - } + 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)), vec![]) - } else { - (None, vec![]) - } + 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_references || config.annotate_impls { - enum_.source(db).and_then(|node| name_range(&node, file_id)) - } else { - None - }, + hir::Adt::Enum(enum_) => { if config.annotate_enum_variant_references { enum_ .variants(db) @@ -93,20 +82,35 @@ pub(crate) fn annotations( .map(|variant| { variant.source(db).and_then(|node| name_range(&node, file_id)) }) - .collect() + .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 { - vec![] - }, - ), + None + } + } _ => { if config.annotate_references || config.annotate_impls { - (adt.source(db).and_then(|node| name_range(&node, file_id)), vec![]) + adt.source(db).and_then(|node| name_range(&node, file_id)) } else { - (None, vec![]) + None } } }, - _ => (None, vec![]), + _ => None, }; let (range, offset) = match range { @@ -133,20 +137,6 @@ pub(crate) fn annotations( }); } - if config.annotate_enum_variant_references { - for range_enum_variant in - ranges_enum_variants.into_iter().filter_map(std::convert::identity) - { - annotations.push(Annotation { - range: range_enum_variant, - kind: AnnotationKind::HasReferences { - position: FilePosition { file_id, offset: range_enum_variant.start() }, - data: None, - }, - }); - } - } - fn name_range(node: &InFile, file_id: FileId) -> Option { if node.file_id == file_id.into() { node.value.name().map(|it| it.syntax().text_range())