|  | //! Yet another version of owned string, backed by a syntax tree token. | 
|  |  | 
|  | use std::{cmp::Ordering, fmt, ops}; | 
|  |  | 
|  | use rowan::GreenToken; | 
|  | use smol_str::SmolStr; | 
|  |  | 
|  | pub struct TokenText<'a>(pub(crate) Repr<'a>); | 
|  |  | 
|  | pub(crate) enum Repr<'a> { | 
|  | Borrowed(&'a str), | 
|  | Owned(GreenToken), | 
|  | } | 
|  |  | 
|  | impl<'a> TokenText<'a> { | 
|  | pub fn borrowed(text: &'a str) -> Self { | 
|  | TokenText(Repr::Borrowed(text)) | 
|  | } | 
|  |  | 
|  | pub(crate) fn owned(green: GreenToken) -> Self { | 
|  | TokenText(Repr::Owned(green)) | 
|  | } | 
|  |  | 
|  | pub fn as_str(&self) -> &str { | 
|  | match &self.0 { | 
|  | &Repr::Borrowed(it) => it, | 
|  | Repr::Owned(green) => green.text(), | 
|  | } | 
|  | } | 
|  | } | 
|  |  | 
|  | impl ops::Deref for TokenText<'_> { | 
|  | type Target = str; | 
|  |  | 
|  | fn deref(&self) -> &str { | 
|  | self.as_str() | 
|  | } | 
|  | } | 
|  | impl AsRef<str> for TokenText<'_> { | 
|  | fn as_ref(&self) -> &str { | 
|  | self.as_str() | 
|  | } | 
|  | } | 
|  |  | 
|  | impl From<TokenText<'_>> for String { | 
|  | fn from(token_text: TokenText<'_>) -> Self { | 
|  | token_text.as_str().into() | 
|  | } | 
|  | } | 
|  |  | 
|  | impl From<TokenText<'_>> for SmolStr { | 
|  | fn from(token_text: TokenText<'_>) -> Self { | 
|  | SmolStr::new(token_text.as_str()) | 
|  | } | 
|  | } | 
|  |  | 
|  | impl PartialEq<&'_ str> for TokenText<'_> { | 
|  | fn eq(&self, other: &&str) -> bool { | 
|  | self.as_str() == *other | 
|  | } | 
|  | } | 
|  | impl PartialEq<TokenText<'_>> for &'_ str { | 
|  | fn eq(&self, other: &TokenText<'_>) -> bool { | 
|  | other == self | 
|  | } | 
|  | } | 
|  | impl PartialEq<String> for TokenText<'_> { | 
|  | fn eq(&self, other: &String) -> bool { | 
|  | self.as_str() == other.as_str() | 
|  | } | 
|  | } | 
|  | impl PartialEq<TokenText<'_>> for String { | 
|  | fn eq(&self, other: &TokenText<'_>) -> bool { | 
|  | other == self | 
|  | } | 
|  | } | 
|  | impl PartialEq for TokenText<'_> { | 
|  | fn eq(&self, other: &TokenText<'_>) -> bool { | 
|  | self.as_str() == other.as_str() | 
|  | } | 
|  | } | 
|  | impl Eq for TokenText<'_> {} | 
|  | impl Ord for TokenText<'_> { | 
|  | fn cmp(&self, other: &Self) -> Ordering { | 
|  | self.as_str().cmp(other.as_str()) | 
|  | } | 
|  | } | 
|  | impl PartialOrd for TokenText<'_> { | 
|  | fn partial_cmp(&self, other: &Self) -> Option<Ordering> { | 
|  | Some(self.cmp(other)) | 
|  | } | 
|  | } | 
|  | impl fmt::Display for TokenText<'_> { | 
|  | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { | 
|  | fmt::Display::fmt(self.as_str(), f) | 
|  | } | 
|  | } | 
|  | impl fmt::Debug for TokenText<'_> { | 
|  | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { | 
|  | fmt::Debug::fmt(self.as_str(), f) | 
|  | } | 
|  | } |