From a3711e08dc4e393957dff136218c47d8b77da14f Mon Sep 17 00:00:00 2001 From: Wilco Kusee Date: Sat, 23 Mar 2019 17:34:49 +0100 Subject: Move highlighting and matching_brace --- crates/ra_ide_api/src/matching_brace.rs | 45 +++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 crates/ra_ide_api/src/matching_brace.rs (limited to 'crates/ra_ide_api/src/matching_brace.rs') diff --git a/crates/ra_ide_api/src/matching_brace.rs b/crates/ra_ide_api/src/matching_brace.rs new file mode 100644 index 000000000..d1405f14f --- /dev/null +++ b/crates/ra_ide_api/src/matching_brace.rs @@ -0,0 +1,45 @@ +use ra_syntax::{ + SourceFile, TextUnit, + algo::find_leaf_at_offset, + SyntaxKind::{self, *}, + ast::AstNode, +}; + +pub fn matching_brace(file: &SourceFile, offset: TextUnit) -> Option { + const BRACES: &[SyntaxKind] = + &[L_CURLY, R_CURLY, L_BRACK, R_BRACK, L_PAREN, R_PAREN, L_ANGLE, R_ANGLE]; + let (brace_node, brace_idx) = find_leaf_at_offset(file.syntax(), offset) + .filter_map(|node| { + let idx = BRACES.iter().position(|&brace| brace == node.kind())?; + Some((node, idx)) + }) + .next()?; + let parent = brace_node.parent()?; + let matching_kind = BRACES[brace_idx ^ 1]; + let matching_node = parent.children().find(|node| node.kind() == matching_kind)?; + Some(matching_node.range().start()) +} + +#[cfg(test)] +mod tests { + use test_utils::{add_cursor, assert_eq_text, extract_offset}; + + use super::*; + + #[test] + fn test_matching_brace() { + fn do_check(before: &str, after: &str) { + let (pos, before) = extract_offset(before); + let file = SourceFile::parse(&before); + let new_pos = match matching_brace(&file, pos) { + None => pos, + Some(pos) => pos, + }; + let actual = add_cursor(&before, new_pos); + assert_eq_text!(after, &actual); + } + + do_check("struct Foo { a: i32, }<|>", "struct Foo <|>{ a: i32, }"); + } + +} -- cgit v1.2.3