use ra_syntax::{ ast::{self, NameOwner, VisibilityOwner, TypeAscriptionOwner, AstNode}, }; pub(crate) trait ShortLabel { fn short_label(&self) -> Option; } impl ShortLabel for ast::FnDef { fn short_label(&self) -> Option { Some(crate::display::function_label(self)) } } impl ShortLabel for ast::StructDef { fn short_label(&self) -> Option { short_label_from_node(self, "struct ") } } impl ShortLabel for ast::EnumDef { fn short_label(&self) -> Option { short_label_from_node(self, "enum ") } } impl ShortLabel for ast::TraitDef { fn short_label(&self) -> Option { short_label_from_node(self, "trait ") } } impl ShortLabel for ast::Module { fn short_label(&self) -> Option { short_label_from_node(self, "mod ") } } impl ShortLabel for ast::TypeAliasDef { fn short_label(&self) -> Option { short_label_from_node(self, "type ") } } impl ShortLabel for ast::ConstDef { fn short_label(&self) -> Option { short_label_from_ascribed_node(self, "const ") } } impl ShortLabel for ast::StaticDef { fn short_label(&self) -> Option { short_label_from_ascribed_node(self, "static ") } } impl ShortLabel for ast::NamedFieldDef { fn short_label(&self) -> Option { short_label_from_ascribed_node(self, "") } } impl ShortLabel for ast::EnumVariant { fn short_label(&self) -> Option { Some(self.name()?.text().to_string()) } } fn short_label_from_ascribed_node(node: &T, prefix: &str) -> Option where T: NameOwner + VisibilityOwner + TypeAscriptionOwner, { let mut buf = short_label_from_node(node, prefix)?; if let Some(type_ref) = node.ascribed_type() { buf.push_str(": "); type_ref.syntax().text().push_to(&mut buf); } Some(buf) } fn short_label_from_node(node: &T, label: &str) -> Option where T: NameOwner + VisibilityOwner, { let mut buf = node.visibility().map(|v| format!("{} ", v.syntax().text())).unwrap_or_default(); buf.push_str(label); buf.push_str(node.name()?.text().as_str()); Some(buf) }