From dc4fa504ea2723bd5083284cabf81b4c5806ed4b Mon Sep 17 00:00:00 2001 From: Dawer <7803845+iDawer@users.noreply.github.com> Date: Thu, 6 May 2021 10:06:52 +0500 Subject: Adapt to a new rowan borrowing node API. --- crates/syntax/src/ast/make.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'crates/syntax/src/ast') diff --git a/crates/syntax/src/ast/make.rs b/crates/syntax/src/ast/make.rs index 42da09606..4bcea28cc 100644 --- a/crates/syntax/src/ast/make.rs +++ b/crates/syntax/src/ast/make.rs @@ -572,7 +572,7 @@ fn ast_from_text(text: &str) -> N { } fn unroot(n: SyntaxNode) -> SyntaxNode { - SyntaxNode::new_root(n.green()) + SyntaxNode::new_root(n.green().into()) } pub mod tokens { -- cgit v1.2.3 From d7e169fe55a15dd684e7a93dd111c66ed49ed949 Mon Sep 17 00:00:00 2001 From: Dawer <7803845+iDawer@users.noreply.github.com> Date: Thu, 6 May 2021 10:07:06 +0500 Subject: Borrow text from nodes of immutable syntax trees --- crates/syntax/src/ast/node_ext.rs | 36 +++++++++++++++++++++++++++--------- 1 file changed, 27 insertions(+), 9 deletions(-) (limited to 'crates/syntax/src/ast') diff --git a/crates/syntax/src/ast/node_ext.rs b/crates/syntax/src/ast/node_ext.rs index 492fbc4a0..8e6d7b092 100644 --- a/crates/syntax/src/ast/node_ext.rs +++ b/crates/syntax/src/ast/node_ext.rs @@ -1,10 +1,11 @@ //! Various extension methods to ast Nodes, which are hard to code-generate. //! Extensions for various expressions live in a sibling `expr_extensions` module. -use std::{fmt, iter::successors}; +use std::{borrow::Cow, fmt, iter::successors}; use itertools::Itertools; use parser::SyntaxKind; +use rowan::{GreenNodeData, GreenTokenData, NodeOrToken}; use crate::{ ast::{self, support, AstNode, AstToken, AttrsOwner, NameOwner, SyntaxNode}, @@ -12,19 +13,19 @@ use crate::{ }; impl ast::Lifetime { - pub fn text(&self) -> TokenText { + pub fn text(&self) -> TokenText<'_> { text_of_first_token(self.syntax()) } } impl ast::Name { - pub fn text(&self) -> TokenText { + pub fn text(&self) -> TokenText<'_> { text_of_first_token(self.syntax()) } } impl ast::NameRef { - pub fn text(&self) -> TokenText { + pub fn text(&self) -> TokenText<'_> { text_of_first_token(self.syntax()) } @@ -33,11 +34,28 @@ impl ast::NameRef { } } -fn text_of_first_token(node: &SyntaxNode) -> TokenText { - let first_token = - node.green().children().next().and_then(|it| it.into_token()).unwrap().to_owned(); +fn _text_of_first_token(node: &SyntaxNode) -> Cow<'_, str> { + fn cow_map &str>(green: Cow, f: F) -> Cow { + match green { + Cow::Borrowed(green_ref) => Cow::Borrowed(f(green_ref)), + Cow::Owned(green) => Cow::Owned(f(&green).to_owned()), + } + } + + cow_map(node.green(), |green_ref| { + green_ref.children().next().and_then(NodeOrToken::into_token).unwrap().text() + }) +} - TokenText(first_token) +fn text_of_first_token(node: &SyntaxNode) -> TokenText<'_> { + fn first_token(green_ref: &GreenNodeData) -> &GreenTokenData { + green_ref.children().next().and_then(NodeOrToken::into_token).unwrap() + } + + match node.green() { + Cow::Borrowed(green_ref) => TokenText::Borrowed(first_token(green_ref).text()), + Cow::Owned(green) => TokenText::Owned(first_token(&green).to_owned()), + } } #[derive(Debug, PartialEq, Eq, Clone)] @@ -412,7 +430,7 @@ impl fmt::Display for NameOrNameRef { } impl NameOrNameRef { - pub fn text(&self) -> TokenText { + pub fn text(&self) -> TokenText<'_> { match self { NameOrNameRef::Name(name) => name.text(), NameOrNameRef::NameRef(name_ref) => name_ref.text(), -- cgit v1.2.3 From d9b4ac81285985f384d1a9f0708ba54434b7f231 Mon Sep 17 00:00:00 2001 From: Dawer <7803845+iDawer@users.noreply.github.com> Date: Thu, 6 May 2021 10:07:06 +0500 Subject: Clean up --- crates/syntax/src/ast/node_ext.rs | 17 ++--------------- 1 file changed, 2 insertions(+), 15 deletions(-) (limited to 'crates/syntax/src/ast') diff --git a/crates/syntax/src/ast/node_ext.rs b/crates/syntax/src/ast/node_ext.rs index 8e6d7b092..88f9a0e97 100644 --- a/crates/syntax/src/ast/node_ext.rs +++ b/crates/syntax/src/ast/node_ext.rs @@ -5,11 +5,11 @@ use std::{borrow::Cow, fmt, iter::successors}; use itertools::Itertools; use parser::SyntaxKind; -use rowan::{GreenNodeData, GreenTokenData, NodeOrToken}; +use rowan::{GreenNodeData, GreenTokenData}; use crate::{ ast::{self, support, AstNode, AstToken, AttrsOwner, NameOwner, SyntaxNode}, - SmolStr, SyntaxElement, SyntaxToken, TokenText, T, + NodeOrToken, SmolStr, SyntaxElement, SyntaxToken, TokenText, T, }; impl ast::Lifetime { @@ -34,19 +34,6 @@ impl ast::NameRef { } } -fn _text_of_first_token(node: &SyntaxNode) -> Cow<'_, str> { - fn cow_map &str>(green: Cow, f: F) -> Cow { - match green { - Cow::Borrowed(green_ref) => Cow::Borrowed(f(green_ref)), - Cow::Owned(green) => Cow::Owned(f(&green).to_owned()), - } - } - - cow_map(node.green(), |green_ref| { - green_ref.children().next().and_then(NodeOrToken::into_token).unwrap().text() - }) -} - fn text_of_first_token(node: &SyntaxNode) -> TokenText<'_> { fn first_token(green_ref: &GreenNodeData) -> &GreenTokenData { green_ref.children().next().and_then(NodeOrToken::into_token).unwrap() -- cgit v1.2.3 From 0a156c80af8df24543323bdf47d75c5a339cfe48 Mon Sep 17 00:00:00 2001 From: Dawer <7803845+iDawer@users.noreply.github.com> Date: Thu, 6 May 2021 10:07:06 +0500 Subject: Hide implementation details of TokenText --- crates/syntax/src/ast/node_ext.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'crates/syntax/src/ast') diff --git a/crates/syntax/src/ast/node_ext.rs b/crates/syntax/src/ast/node_ext.rs index 88f9a0e97..bef49238f 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()), } } -- cgit v1.2.3