Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/syntax/src/ast/node_ext.rs')
-rw-r--r--crates/syntax/src/ast/node_ext.rs34
1 files changed, 31 insertions, 3 deletions
diff --git a/crates/syntax/src/ast/node_ext.rs b/crates/syntax/src/ast/node_ext.rs
index a7e4899fb7..8618018c0b 100644
--- a/crates/syntax/src/ast/node_ext.rs
+++ b/crates/syntax/src/ast/node_ext.rs
@@ -14,6 +14,8 @@ use crate::{
ted, NodeOrToken, SmolStr, SyntaxElement, SyntaxToken, TokenText, T,
};
+use super::{RangeItem, RangeOp};
+
impl ast::Lifetime {
pub fn text(&self) -> TokenText<'_> {
text_of_first_token(self.syntax())
@@ -875,8 +877,10 @@ impl ast::Module {
}
}
-impl ast::RangePat {
- pub fn start(&self) -> Option<ast::Pat> {
+impl RangeItem for ast::RangePat {
+ type Bound = ast::Pat;
+
+ fn start(&self) -> Option<ast::Pat> {
self.syntax()
.children_with_tokens()
.take_while(|it| !(it.kind() == T![..] || it.kind() == T![..=]))
@@ -884,13 +888,37 @@ impl ast::RangePat {
.find_map(ast::Pat::cast)
}
- pub fn end(&self) -> Option<ast::Pat> {
+ fn end(&self) -> Option<ast::Pat> {
self.syntax()
.children_with_tokens()
.skip_while(|it| !(it.kind() == T![..] || it.kind() == T![..=]))
.filter_map(|it| it.into_node())
.find_map(ast::Pat::cast)
}
+
+ fn op_token(&self) -> Option<SyntaxToken> {
+ self.syntax().children_with_tokens().find_map(|it| {
+ let token = it.into_token()?;
+
+ match token.kind() {
+ T![..] => Some(token),
+ T![..=] => Some(token),
+ _ => None,
+ }
+ })
+ }
+
+ fn op_kind(&self) -> Option<RangeOp> {
+ self.syntax().children_with_tokens().find_map(|it| {
+ let token = it.into_token()?;
+
+ match token.kind() {
+ T![..] => Some(RangeOp::Exclusive),
+ T![..=] => Some(RangeOp::Inclusive),
+ _ => None,
+ }
+ })
+ }
}
impl ast::TokenTree {