From d963042ca9da93be8d5922ce46ea26dc6a79c929 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Thu, 27 Dec 2018 20:07:21 +0300 Subject: introduce hir::Name --- crates/ra_hir/src/name.rs | 56 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 crates/ra_hir/src/name.rs (limited to 'crates/ra_hir/src/name.rs') diff --git a/crates/ra_hir/src/name.rs b/crates/ra_hir/src/name.rs new file mode 100644 index 000000000..7f42c9f04 --- /dev/null +++ b/crates/ra_hir/src/name.rs @@ -0,0 +1,56 @@ +use std::fmt; + +use ra_syntax::{ast, SmolStr}; + +/// `Name` is a wrapper around string, which is used in hir for both references +/// and declarations. In theory, names should also carry hygene info, but we are +/// not there yet! +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +pub struct Name { + text: SmolStr, +} + +impl fmt::Display for Name { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + fmt::Display::fmt(&self.text, f) + } +} + +impl Name { + // TODO: get rid of this? + pub(crate) fn as_str(&self) -> &str { + self.text.as_str() + } + + #[cfg(not(test))] + fn new(text: SmolStr) -> Name { + Name { text } + } + + #[cfg(test)] + pub(crate) fn new(text: SmolStr) -> Name { + Name { text } + } +} + +pub(crate) trait AsName { + fn as_name(&self) -> Name; +} + +impl AsName for ast::NameRef<'_> { + fn as_name(&self) -> Name { + Name::new(self.text()) + } +} + +impl AsName for ast::Name<'_> { + fn as_name(&self) -> Name { + Name::new(self.text()) + } +} + +impl AsName for ra_db::Dependency { + fn as_name(&self) -> Name { + Name::new(self.name.clone()) + } +} -- cgit v1.2.3