diff options
Diffstat (limited to 'crates/syntax/src/ast/node_ext.rs')
-rw-r--r-- | crates/syntax/src/ast/node_ext.rs | 25 |
1 files changed, 15 insertions, 10 deletions
diff --git a/crates/syntax/src/ast/node_ext.rs b/crates/syntax/src/ast/node_ext.rs index 492fbc4a0..bef49238f 100644 --- a/crates/syntax/src/ast/node_ext.rs +++ b/crates/syntax/src/ast/node_ext.rs | |||
@@ -1,30 +1,31 @@ | |||
1 | //! Various extension methods to ast Nodes, which are hard to code-generate. | 1 | //! Various extension methods to ast Nodes, which are hard to code-generate. |
2 | //! Extensions for various expressions live in a sibling `expr_extensions` module. | 2 | //! Extensions for various expressions live in a sibling `expr_extensions` module. |
3 | 3 | ||
4 | use std::{fmt, iter::successors}; | 4 | use std::{borrow::Cow, fmt, iter::successors}; |
5 | 5 | ||
6 | use itertools::Itertools; | 6 | use itertools::Itertools; |
7 | use parser::SyntaxKind; | 7 | use parser::SyntaxKind; |
8 | use rowan::{GreenNodeData, GreenTokenData}; | ||
8 | 9 | ||
9 | use crate::{ | 10 | use crate::{ |
10 | ast::{self, support, AstNode, AstToken, AttrsOwner, NameOwner, SyntaxNode}, | 11 | ast::{self, support, AstNode, AstToken, AttrsOwner, NameOwner, SyntaxNode}, |
11 | SmolStr, SyntaxElement, SyntaxToken, TokenText, T, | 12 | NodeOrToken, SmolStr, SyntaxElement, SyntaxToken, TokenText, T, |
12 | }; | 13 | }; |
13 | 14 | ||
14 | impl ast::Lifetime { | 15 | impl ast::Lifetime { |
15 | pub fn text(&self) -> TokenText { | 16 | pub fn text(&self) -> TokenText<'_> { |
16 | text_of_first_token(self.syntax()) | 17 | text_of_first_token(self.syntax()) |
17 | } | 18 | } |
18 | } | 19 | } |
19 | 20 | ||
20 | impl ast::Name { | 21 | impl ast::Name { |
21 | pub fn text(&self) -> TokenText { | 22 | pub fn text(&self) -> TokenText<'_> { |
22 | text_of_first_token(self.syntax()) | 23 | text_of_first_token(self.syntax()) |
23 | } | 24 | } |
24 | } | 25 | } |
25 | 26 | ||
26 | impl ast::NameRef { | 27 | impl ast::NameRef { |
27 | pub fn text(&self) -> TokenText { | 28 | pub fn text(&self) -> TokenText<'_> { |
28 | text_of_first_token(self.syntax()) | 29 | text_of_first_token(self.syntax()) |
29 | } | 30 | } |
30 | 31 | ||
@@ -33,11 +34,15 @@ impl ast::NameRef { | |||
33 | } | 34 | } |
34 | } | 35 | } |
35 | 36 | ||
36 | fn text_of_first_token(node: &SyntaxNode) -> TokenText { | 37 | fn text_of_first_token(node: &SyntaxNode) -> TokenText<'_> { |
37 | let first_token = | 38 | fn first_token(green_ref: &GreenNodeData) -> &GreenTokenData { |
38 | node.green().children().next().and_then(|it| it.into_token()).unwrap().to_owned(); | 39 | green_ref.children().next().and_then(NodeOrToken::into_token).unwrap() |
40 | } | ||
39 | 41 | ||
40 | TokenText(first_token) | 42 | match node.green() { |
43 | Cow::Borrowed(green_ref) => TokenText::borrowed(first_token(green_ref).text()), | ||
44 | Cow::Owned(green) => TokenText::owned(first_token(&green).to_owned()), | ||
45 | } | ||
41 | } | 46 | } |
42 | 47 | ||
43 | #[derive(Debug, PartialEq, Eq, Clone)] | 48 | #[derive(Debug, PartialEq, Eq, Clone)] |
@@ -412,7 +417,7 @@ impl fmt::Display for NameOrNameRef { | |||
412 | } | 417 | } |
413 | 418 | ||
414 | impl NameOrNameRef { | 419 | impl NameOrNameRef { |
415 | pub fn text(&self) -> TokenText { | 420 | pub fn text(&self) -> TokenText<'_> { |
416 | match self { | 421 | match self { |
417 | NameOrNameRef::Name(name) => name.text(), | 422 | NameOrNameRef::Name(name) => name.text(), |
418 | NameOrNameRef::NameRef(name_ref) => name_ref.text(), | 423 | NameOrNameRef::NameRef(name_ref) => name_ref.text(), |