diff --git a/crates/syntax/src/ast/node_ext.rs b/crates/syntax/src/ast/node_ext.rs index 88f9a0e978..bef49238f5 100644 --- a/crates/syntax/src/ast/node_ext.rs +++ b/crates/syntax/src/ast/node_ext.rs @@ -40,8 +40,8 @@ fn text_of_first_token(node: &SyntaxNode) -> TokenText<'_> { } match node.green() { - Cow::Borrowed(green_ref) => TokenText::Borrowed(first_token(green_ref).text()), - Cow::Owned(green) => TokenText::Owned(first_token(&green).to_owned()), + Cow::Borrowed(green_ref) => TokenText::borrowed(first_token(green_ref).text()), + Cow::Owned(green) => TokenText::owned(first_token(&green).to_owned()), } } diff --git a/crates/syntax/src/token_text.rs b/crates/syntax/src/token_text.rs index e29f4eea40..f3e8b321a7 100644 --- a/crates/syntax/src/token_text.rs +++ b/crates/syntax/src/token_text.rs @@ -2,16 +2,28 @@ use std::{cmp::Ordering, fmt, ops}; -pub enum TokenText<'a> { +use rowan::GreenToken; + +pub struct TokenText<'a>(pub(crate) Repr<'a>); + +pub(crate) enum Repr<'a> { Borrowed(&'a str), - Owned(rowan::GreenToken), + Owned(GreenToken), } -impl TokenText<'_> { +impl<'a> TokenText<'a> { + pub(crate) 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 { - TokenText::Borrowed(it) => *it, - TokenText::Owned(green) => green.text(), + match self.0 { + Repr::Borrowed(it) => it, + Repr::Owned(ref green) => green.text(), } } }