mirror of
https://github.com/rust-lang/rust-analyzer
synced 2024-12-26 04:53:34 +00:00
Merge #10447
10447: Add enum variant references CodeLens. r=Veykril a=ericsampson Co-authored-by: Eric Sampson <esampson@eaze.com>
This commit is contained in:
commit
5ff992465e
5 changed files with 61 additions and 13 deletions
|
@ -40,6 +40,7 @@ pub struct AnnotationConfig {
|
||||||
pub annotate_impls: bool,
|
pub annotate_impls: bool,
|
||||||
pub annotate_references: bool,
|
pub annotate_references: bool,
|
||||||
pub annotate_method_references: bool,
|
pub annotate_method_references: bool,
|
||||||
|
pub annotate_enum_variant_references: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn annotations(
|
pub(crate) fn annotations(
|
||||||
|
@ -63,18 +64,33 @@ pub(crate) fn annotations(
|
||||||
|
|
||||||
visit_file_defs(&Semantics::new(db), file_id, &mut |def| match def {
|
visit_file_defs(&Semantics::new(db), file_id, &mut |def| match def {
|
||||||
Either::Left(def) => {
|
Either::Left(def) => {
|
||||||
let range = match def {
|
let (range, ranges_enum_variants) = match def {
|
||||||
hir::ModuleDef::Const(konst) => {
|
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![])
|
||||||
}
|
}
|
||||||
hir::ModuleDef::Trait(trait_) => {
|
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![])
|
||||||
}
|
}
|
||||||
hir::ModuleDef::Adt(adt) => {
|
hir::ModuleDef::Adt(adt) => match adt {
|
||||||
adt.source(db).and_then(|node| name_range(&node, file_id))
|
hir::Adt::Enum(enum_) => (
|
||||||
}
|
enum_.source(db).and_then(|node| name_range(&node, file_id)),
|
||||||
_ => None,
|
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![]
|
||||||
|
},
|
||||||
|
),
|
||||||
|
_ => (adt.source(db).and_then(|node| name_range(&node, file_id)), vec![]),
|
||||||
|
},
|
||||||
|
_ => (None, vec![]),
|
||||||
};
|
};
|
||||||
|
|
||||||
let (range, offset) = match range {
|
let (range, offset) = match range {
|
||||||
Some(range) => (range, range.start()),
|
Some(range) => (range, range.start()),
|
||||||
None => return,
|
None => return,
|
||||||
|
@ -99,6 +115,20 @@ 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<T: HasName>(node: &InFile<T>, file_id: FileId) -> Option<TextRange> {
|
fn name_range<T: HasName>(node: &InFile<T>, file_id: FileId) -> Option<TextRange> {
|
||||||
if node.file_id == file_id.into() {
|
if node.file_id == file_id.into() {
|
||||||
node.value.name().map(|it| it.syntax().text_range())
|
node.value.name().map(|it| it.syntax().text_range())
|
||||||
|
@ -173,6 +203,7 @@ mod tests {
|
||||||
annotate_impls: true,
|
annotate_impls: true,
|
||||||
annotate_references: true,
|
annotate_references: true,
|
||||||
annotate_method_references: true,
|
annotate_method_references: true,
|
||||||
|
annotate_enum_variant_references: true,
|
||||||
},
|
},
|
||||||
file_id,
|
file_id,
|
||||||
)
|
)
|
||||||
|
|
|
@ -227,9 +227,12 @@ config_data! {
|
||||||
/// Whether to show `Method References` lens. Only applies when
|
/// Whether to show `Method References` lens. Only applies when
|
||||||
/// `#rust-analyzer.lens.enable#` is set.
|
/// `#rust-analyzer.lens.enable#` is set.
|
||||||
lens_methodReferences: bool = "false",
|
lens_methodReferences: bool = "false",
|
||||||
/// Whether to show `References` lens. Only applies when
|
/// Whether to show `References` lens for Struct, Enum, Union and Trait.
|
||||||
/// `#rust-analyzer.lens.enable#` is set.
|
/// Only applies when `#rust-analyzer.lens.enable#` is set.
|
||||||
lens_references: bool = "false",
|
lens_references: bool = "false",
|
||||||
|
/// Whether to show `References` lens for Enum Variants.
|
||||||
|
/// Only applies when `#rust-analyzer.lens.enable#` is set.
|
||||||
|
lens_enumVariantReferences: bool = "false",
|
||||||
/// Internal config: use custom client-side commands even when the
|
/// Internal config: use custom client-side commands even when the
|
||||||
/// client doesn't set the corresponding capability.
|
/// client doesn't set the corresponding capability.
|
||||||
lens_forceCustomCommands: bool = "true",
|
lens_forceCustomCommands: bool = "true",
|
||||||
|
@ -326,6 +329,7 @@ pub struct LensConfig {
|
||||||
pub implementations: bool,
|
pub implementations: bool,
|
||||||
pub method_refs: bool,
|
pub method_refs: bool,
|
||||||
pub refs: bool, // for Struct, Enum, Union and Trait
|
pub refs: bool, // for Struct, Enum, Union and Trait
|
||||||
|
pub enum_variant_refs: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl LensConfig {
|
impl LensConfig {
|
||||||
|
@ -342,7 +346,7 @@ impl LensConfig {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn references(&self) -> bool {
|
pub fn references(&self) -> bool {
|
||||||
self.method_refs || self.refs
|
self.method_refs || self.refs || self.enum_variant_refs
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -832,6 +836,7 @@ impl Config {
|
||||||
implementations: self.data.lens_enable && self.data.lens_implementations,
|
implementations: self.data.lens_enable && self.data.lens_implementations,
|
||||||
method_refs: self.data.lens_enable && self.data.lens_methodReferences,
|
method_refs: self.data.lens_enable && self.data.lens_methodReferences,
|
||||||
refs: self.data.lens_enable && self.data.lens_references,
|
refs: self.data.lens_enable && self.data.lens_references,
|
||||||
|
enum_variant_refs: self.data.lens_enable && self.data.lens_enumVariantReferences,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
pub fn hover_actions(&self) -> HoverActionsConfig {
|
pub fn hover_actions(&self) -> HoverActionsConfig {
|
||||||
|
|
|
@ -1135,6 +1135,7 @@ pub(crate) fn handle_code_lens(
|
||||||
annotate_impls: lens_config.implementations,
|
annotate_impls: lens_config.implementations,
|
||||||
annotate_references: lens_config.refs,
|
annotate_references: lens_config.refs,
|
||||||
annotate_method_references: lens_config.method_refs,
|
annotate_method_references: lens_config.method_refs,
|
||||||
|
annotate_enum_variant_references: lens_config.enum_variant_refs,
|
||||||
},
|
},
|
||||||
file_id,
|
file_id,
|
||||||
)?;
|
)?;
|
||||||
|
|
|
@ -360,8 +360,14 @@ Whether to show `Method References` lens. Only applies when
|
||||||
[[rust-analyzer.lens.references]]rust-analyzer.lens.references (default: `false`)::
|
[[rust-analyzer.lens.references]]rust-analyzer.lens.references (default: `false`)::
|
||||||
+
|
+
|
||||||
--
|
--
|
||||||
Whether to show `References` lens. Only applies when
|
Whether to show `References` lens for Struct, Enum, Union and Trait.
|
||||||
`#rust-analyzer.lens.enable#` is set.
|
Only applies when `#rust-analyzer.lens.enable#` is set.
|
||||||
|
--
|
||||||
|
[[rust-analyzer.lens.enumVariantReferences]]rust-analyzer.lens.enumVariantReferences (default: `false`)::
|
||||||
|
+
|
||||||
|
--
|
||||||
|
Whether to show `References` lens for Enum Variants.
|
||||||
|
Only applies when `#rust-analyzer.lens.enable#` is set.
|
||||||
--
|
--
|
||||||
[[rust-analyzer.lens.forceCustomCommands]]rust-analyzer.lens.forceCustomCommands (default: `true`)::
|
[[rust-analyzer.lens.forceCustomCommands]]rust-analyzer.lens.forceCustomCommands (default: `true`)::
|
||||||
+
|
+
|
||||||
|
|
|
@ -798,7 +798,12 @@
|
||||||
"type": "boolean"
|
"type": "boolean"
|
||||||
},
|
},
|
||||||
"rust-analyzer.lens.references": {
|
"rust-analyzer.lens.references": {
|
||||||
"markdownDescription": "Whether to show `References` lens. Only applies when\n`#rust-analyzer.lens.enable#` is set.",
|
"markdownDescription": "Whether to show `References` lens for Struct, Enum, Union and Trait.\nOnly applies when `#rust-analyzer.lens.enable#` is set.",
|
||||||
|
"default": false,
|
||||||
|
"type": "boolean"
|
||||||
|
},
|
||||||
|
"rust-analyzer.lens.enumVariantReferences": {
|
||||||
|
"markdownDescription": "Whether to show `References` lens for Enum Variants.\nOnly applies when `#rust-analyzer.lens.enable#` is set.",
|
||||||
"default": false,
|
"default": false,
|
||||||
"type": "boolean"
|
"type": "boolean"
|
||||||
},
|
},
|
||||||
|
|
Loading…
Reference in a new issue