From 191a6ba330bd47fc3b9cc05d59b2d456b471eb89 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Fri, 19 Jul 2019 19:05:34 +0300 Subject: convenience api --- crates/ra_assists/src/ast_editor.rs | 8 ++-- crates/ra_ide_api/src/extend_selection.rs | 4 +- crates/ra_ide_api/src/join_lines.rs | 2 +- crates/ra_ide_api/src/syntax_highlighting.rs | 3 +- crates/ra_syntax/src/ast/expr_extensions.rs | 72 ++++++++++++++-------------- crates/ra_syntax/src/ast/extensions.rs | 8 ++-- crates/ra_syntax/src/ast/traits.rs | 2 +- crates/ra_syntax/src/syntax_node.rs | 14 ++++++ 8 files changed, 63 insertions(+), 50 deletions(-) (limited to 'crates') diff --git a/crates/ra_assists/src/ast_editor.rs b/crates/ra_assists/src/ast_editor.rs index 5fbcadfee..a35334d7e 100644 --- a/crates/ra_assists/src/ast_editor.rs +++ b/crates/ra_assists/src/ast_editor.rs @@ -299,7 +299,7 @@ mod tokens { .tree() .syntax() .descendants_with_tokens() - .filter_map(|it| it.as_token().cloned()) + .filter_map(|it| it.into_token()) .find(|it| it.kind() == T![,]) .unwrap() } @@ -309,7 +309,7 @@ mod tokens { .tree() .syntax() .descendants_with_tokens() - .filter_map(|it| it.as_token().cloned()) + .filter_map(|it| it.into_token()) .find(|it| it.kind() == WHITESPACE && it.text().as_str() == " ") .unwrap() } @@ -320,7 +320,7 @@ mod tokens { .tree() .syntax() .descendants_with_tokens() - .filter_map(|it| it.as_token().cloned()) + .filter_map(|it| it.into_token()) .find(|it| it.kind() == WHITESPACE && it.text().as_str() == "\n") .unwrap() } @@ -332,7 +332,7 @@ mod tokens { WsBuilder(SourceFile::parse(text).ok().unwrap()) } pub(crate) fn ws(&self) -> SyntaxToken { - self.0.syntax().first_child_or_token().unwrap().as_token().cloned().unwrap() + self.0.syntax().first_child_or_token().unwrap().into_token().unwrap() } } diff --git a/crates/ra_ide_api/src/extend_selection.rs b/crates/ra_ide_api/src/extend_selection.rs index 8c49960f5..292f61f4a 100644 --- a/crates/ra_ide_api/src/extend_selection.rs +++ b/crates/ra_ide_api/src/extend_selection.rs @@ -156,7 +156,7 @@ fn extend_list_item(node: &SyntaxNode) -> Option { SyntaxElement::Token(it) => is_single_line_ws(it), }) .next() - .and_then(|it| it.as_token().cloned()) + .and_then(|it| it.into_token()) .filter(|node| node.kind() == T![,]) } @@ -167,7 +167,7 @@ fn extend_list_item(node: &SyntaxNode) -> Option { // Include any following whitespace when comma if after list item. let final_node = comma_node .next_sibling_or_token() - .and_then(|it| it.as_token().cloned()) + .and_then(|it| it.into_token()) .filter(|node| is_single_line_ws(node)) .unwrap_or(comma_node); diff --git a/crates/ra_ide_api/src/join_lines.rs b/crates/ra_ide_api/src/join_lines.rs index 50bcfb5b7..9b81ad9e4 100644 --- a/crates/ra_ide_api/src/join_lines.rs +++ b/crates/ra_ide_api/src/join_lines.rs @@ -27,7 +27,7 @@ pub fn join_lines(file: &SourceFile, range: TextRange) -> TextEdit { SyntaxElement::Token(token) => token.parent(), }; let mut edit = TextEditBuilder::default(); - for token in node.descendants_with_tokens().filter_map(|it| it.as_token().cloned()) { + for token in node.descendants_with_tokens().filter_map(|it| it.into_token()) { let range = match range.intersection(&token.range()) { Some(range) => range, None => continue, diff --git a/crates/ra_ide_api/src/syntax_highlighting.rs b/crates/ra_ide_api/src/syntax_highlighting.rs index 0e5253025..477827fa7 100644 --- a/crates/ra_ide_api/src/syntax_highlighting.rs +++ b/crates/ra_ide_api/src/syntax_highlighting.rs @@ -237,8 +237,7 @@ pub(crate) fn highlight_as_html(db: &RootDatabase, file_id: FileId, rainbow: boo let mut buf = String::new(); buf.push_str(&STYLE); buf.push_str("
");
-    let tokens =
-        parse.tree().syntax().descendants_with_tokens().filter_map(|it| it.as_token().cloned());
+    let tokens = parse.tree().syntax().descendants_with_tokens().filter_map(|it| it.into_token());
     for token in tokens {
         could_intersect.retain(|it| token.range().start() <= it.range.end());
         while let Some(r) = ranges.get(frontier) {
diff --git a/crates/ra_syntax/src/ast/expr_extensions.rs b/crates/ra_syntax/src/ast/expr_extensions.rs
index ca1773908..139bd3ec0 100644
--- a/crates/ra_syntax/src/ast/expr_extensions.rs
+++ b/crates/ra_syntax/src/ast/expr_extensions.rs
@@ -60,7 +60,7 @@ impl ast::PrefixExpr {
     }
 
     pub fn op_token(&self) -> Option {
-        self.syntax().first_child_or_token()?.as_token().cloned()
+        self.syntax().first_child_or_token()?.into_token()
     }
 }
 
@@ -132,41 +132,41 @@ pub enum BinOp {
 
 impl ast::BinExpr {
     fn op_details(&self) -> Option<(SyntaxToken, BinOp)> {
-        self.syntax().children_with_tokens().filter_map(|it| it.as_token().cloned()).find_map(|c| {
-            match c.kind() {
-                T![||] => Some((c, BinOp::BooleanOr)),
-                T![&&] => Some((c, BinOp::BooleanAnd)),
-                T![==] => Some((c, BinOp::EqualityTest)),
-                T![!=] => Some((c, BinOp::NegatedEqualityTest)),
-                T![<=] => Some((c, BinOp::LesserEqualTest)),
-                T![>=] => Some((c, BinOp::GreaterEqualTest)),
-                T![<] => Some((c, BinOp::LesserTest)),
-                T![>] => Some((c, BinOp::GreaterTest)),
-                T![+] => Some((c, BinOp::Addition)),
-                T![*] => Some((c, BinOp::Multiplication)),
-                T![-] => Some((c, BinOp::Subtraction)),
-                T![/] => Some((c, BinOp::Division)),
-                T![%] => Some((c, BinOp::Remainder)),
-                T![<<] => Some((c, BinOp::LeftShift)),
-                T![>>] => Some((c, BinOp::RightShift)),
-                T![^] => Some((c, BinOp::BitwiseXor)),
-                T![|] => Some((c, BinOp::BitwiseOr)),
-                T![&] => Some((c, BinOp::BitwiseAnd)),
-                T![..] => Some((c, BinOp::RangeRightOpen)),
-                T![..=] => Some((c, BinOp::RangeRightClosed)),
-                T![=] => Some((c, BinOp::Assignment)),
-                T![+=] => Some((c, BinOp::AddAssign)),
-                T![/=] => Some((c, BinOp::DivAssign)),
-                T![*=] => Some((c, BinOp::MulAssign)),
-                T![%=] => Some((c, BinOp::RemAssign)),
-                T![>>=] => Some((c, BinOp::ShrAssign)),
-                T![<<=] => Some((c, BinOp::ShlAssign)),
-                T![-=] => Some((c, BinOp::SubAssign)),
-                T![|=] => Some((c, BinOp::BitOrAssign)),
-                T![&=] => Some((c, BinOp::BitAndAssign)),
-                T![^=] => Some((c, BinOp::BitXorAssign)),
-                _ => None,
-            }
+        self.syntax().children_with_tokens().filter_map(|it| it.into_token()).find_map(|c| match c
+            .kind()
+        {
+            T![||] => Some((c, BinOp::BooleanOr)),
+            T![&&] => Some((c, BinOp::BooleanAnd)),
+            T![==] => Some((c, BinOp::EqualityTest)),
+            T![!=] => Some((c, BinOp::NegatedEqualityTest)),
+            T![<=] => Some((c, BinOp::LesserEqualTest)),
+            T![>=] => Some((c, BinOp::GreaterEqualTest)),
+            T![<] => Some((c, BinOp::LesserTest)),
+            T![>] => Some((c, BinOp::GreaterTest)),
+            T![+] => Some((c, BinOp::Addition)),
+            T![*] => Some((c, BinOp::Multiplication)),
+            T![-] => Some((c, BinOp::Subtraction)),
+            T![/] => Some((c, BinOp::Division)),
+            T![%] => Some((c, BinOp::Remainder)),
+            T![<<] => Some((c, BinOp::LeftShift)),
+            T![>>] => Some((c, BinOp::RightShift)),
+            T![^] => Some((c, BinOp::BitwiseXor)),
+            T![|] => Some((c, BinOp::BitwiseOr)),
+            T![&] => Some((c, BinOp::BitwiseAnd)),
+            T![..] => Some((c, BinOp::RangeRightOpen)),
+            T![..=] => Some((c, BinOp::RangeRightClosed)),
+            T![=] => Some((c, BinOp::Assignment)),
+            T![+=] => Some((c, BinOp::AddAssign)),
+            T![/=] => Some((c, BinOp::DivAssign)),
+            T![*=] => Some((c, BinOp::MulAssign)),
+            T![%=] => Some((c, BinOp::RemAssign)),
+            T![>>=] => Some((c, BinOp::ShrAssign)),
+            T![<<=] => Some((c, BinOp::ShlAssign)),
+            T![-=] => Some((c, BinOp::SubAssign)),
+            T![|=] => Some((c, BinOp::BitOrAssign)),
+            T![&=] => Some((c, BinOp::BitAndAssign)),
+            T![^=] => Some((c, BinOp::BitXorAssign)),
+            _ => None,
         })
     }
 
diff --git a/crates/ra_syntax/src/ast/extensions.rs b/crates/ra_syntax/src/ast/extensions.rs
index 5420f67ff..753fc42c6 100644
--- a/crates/ra_syntax/src/ast/extensions.rs
+++ b/crates/ra_syntax/src/ast/extensions.rs
@@ -239,7 +239,7 @@ impl ast::FnDef {
     pub fn semicolon_token(&self) -> Option {
         self.syntax()
             .last_child_or_token()
-            .and_then(|it| it.as_token().cloned())
+            .and_then(|it| it.into_token())
             .filter(|it| it.kind() == T![;])
     }
 }
@@ -332,7 +332,7 @@ impl ast::SelfParam {
     pub fn self_kw_token(&self) -> SyntaxToken {
         self.syntax()
             .children_with_tokens()
-            .filter_map(|it| it.as_token().cloned())
+            .filter_map(|it| it.into_token())
             .find(|it| it.kind() == T![self])
             .expect("invalid tree: self param must have self")
     }
@@ -361,7 +361,7 @@ impl ast::LifetimeParam {
     pub fn lifetime_token(&self) -> Option {
         self.syntax()
             .children_with_tokens()
-            .filter_map(|it| it.as_token().cloned())
+            .filter_map(|it| it.into_token())
             .find(|it| it.kind() == LIFETIME)
     }
 }
@@ -370,7 +370,7 @@ impl ast::WherePred {
     pub fn lifetime_token(&self) -> Option {
         self.syntax()
             .children_with_tokens()
-            .filter_map(|it| it.as_token().cloned())
+            .filter_map(|it| it.into_token())
             .find(|it| it.kind() == LIFETIME)
     }
 }
diff --git a/crates/ra_syntax/src/ast/traits.rs b/crates/ra_syntax/src/ast/traits.rs
index ecbd2d427..6ed1b5213 100644
--- a/crates/ra_syntax/src/ast/traits.rs
+++ b/crates/ra_syntax/src/ast/traits.rs
@@ -155,7 +155,7 @@ pub struct CommentIter {
 impl Iterator for CommentIter {
     type Item = ast::Comment;
     fn next(&mut self) -> Option {
-        self.iter.by_ref().find_map(|el| el.as_token().cloned().and_then(ast::Comment::cast))
+        self.iter.by_ref().find_map(|el| el.into_token().and_then(ast::Comment::cast))
     }
 }
 
diff --git a/crates/ra_syntax/src/syntax_node.rs b/crates/ra_syntax/src/syntax_node.rs
index cf680e66a..98955832b 100644
--- a/crates/ra_syntax/src/syntax_node.rs
+++ b/crates/ra_syntax/src/syntax_node.rs
@@ -423,6 +423,13 @@ impl SyntaxElement {
         }
     }
 
+    pub fn into_node(self) -> Option {
+        match self {
+            SyntaxElement::Node(node) => Some(node),
+            SyntaxElement::Token(_) => None,
+        }
+    }
+
     pub fn as_token(&self) -> Option<&SyntaxToken> {
         match self {
             SyntaxElement::Node(_) => None,
@@ -430,6 +437,13 @@ impl SyntaxElement {
         }
     }
 
+    pub fn into_token(self) -> Option {
+        match self {
+            SyntaxElement::Node(_) => None,
+            SyntaxElement::Token(token) => Some(token),
+        }
+    }
+
     pub fn next_sibling_or_token(&self) -> Option {
         match self {
             SyntaxElement::Node(it) => it.next_sibling_or_token(),
-- 
cgit v1.2.3