diff options
Diffstat (limited to 'crates/ra_syntax')
-rw-r--r-- | crates/ra_syntax/src/algo.rs | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/crates/ra_syntax/src/algo.rs b/crates/ra_syntax/src/algo.rs index 13f50d2ef..45747e21d 100644 --- a/crates/ra_syntax/src/algo.rs +++ b/crates/ra_syntax/src/algo.rs | |||
@@ -2,7 +2,7 @@ pub mod visit; | |||
2 | 2 | ||
3 | use rowan::TransparentNewType; | 3 | use rowan::TransparentNewType; |
4 | 4 | ||
5 | use crate::{SyntaxNode, TextRange, TextUnit}; | 5 | use crate::{SyntaxNode, TextRange, TextUnit, AstNode}; |
6 | 6 | ||
7 | pub use rowan::LeafAtOffset; | 7 | pub use rowan::LeafAtOffset; |
8 | 8 | ||
@@ -16,6 +16,19 @@ pub fn find_leaf_at_offset(node: &SyntaxNode, offset: TextUnit) -> LeafAtOffset< | |||
16 | } | 16 | } |
17 | } | 17 | } |
18 | 18 | ||
19 | /// Finds a node of specific Ast type at offset. Note that this is slightly | ||
20 | /// impercise: if the cursor is strictly betwen two nodes of the desired type, | ||
21 | /// as in | ||
22 | /// | ||
23 | /// ```no-run | ||
24 | /// struct Foo {}|struct Bar; | ||
25 | /// ``` | ||
26 | /// | ||
27 | /// then the left node will be silently prefered. | ||
28 | pub fn find_node_at_offset<N: AstNode>(syntax: &SyntaxNode, offset: TextUnit) -> Option<&N> { | ||
29 | find_leaf_at_offset(syntax, offset).find_map(|leaf| leaf.ancestors().find_map(N::cast)) | ||
30 | } | ||
31 | |||
19 | pub fn find_covering_node(root: &SyntaxNode, range: TextRange) -> &SyntaxNode { | 32 | pub fn find_covering_node(root: &SyntaxNode, range: TextRange) -> &SyntaxNode { |
20 | SyntaxNode::from_repr(root.0.covering_node(range)) | 33 | SyntaxNode::from_repr(root.0.covering_node(range)) |
21 | } | 34 | } |