From f1e8ebfbeb5f84405fb609e3841df02e270037c4 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Mon, 31 Dec 2018 19:01:51 +0300 Subject: generalize extend selection to work with nodes --- crates/ra_analysis/src/extend_selection.rs | 29 +++++++++++++++++------------ crates/ra_cli/src/main.rs | 2 +- crates/ra_editor/src/extend_selection.rs | 12 ++++-------- 3 files changed, 22 insertions(+), 21 deletions(-) diff --git a/crates/ra_analysis/src/extend_selection.rs b/crates/ra_analysis/src/extend_selection.rs index cde6ee101..805e9059e 100644 --- a/crates/ra_analysis/src/extend_selection.rs +++ b/crates/ra_analysis/src/extend_selection.rs @@ -1,6 +1,6 @@ use ra_db::SyntaxDatabase; use ra_syntax::{ - SyntaxNodeRef, AstNode, + SyntaxNodeRef, AstNode, SourceFileNode, ast, algo::find_covering_node, }; @@ -11,18 +11,23 @@ use crate::{ pub(crate) fn extend_selection(db: &RootDatabase, frange: FileRange) -> TextRange { let source_file = db.source_file(frange.file_id); - if let Some(macro_call) = find_macro_call(source_file.syntax(), frange.range) { - if let Some(exp) = crate::macros::expand(db, frange.file_id, macro_call) { - if let Some(dst_range) = exp.map_range_forward(frange.range) { - if let Some(dst_range) = ra_editor::extend_selection(exp.source_file(), dst_range) { - if let Some(src_range) = exp.map_range_back(dst_range) { - return src_range; - } - } - } - } + if let Some(range) = extend_selection_in_macro(db, &source_file, frange) { + return range; } - ra_editor::extend_selection(&source_file, frange.range).unwrap_or(frange.range) + ra_editor::extend_selection(source_file.syntax(), frange.range).unwrap_or(frange.range) +} + +fn extend_selection_in_macro( + db: &RootDatabase, + source_file: &SourceFileNode, + frange: FileRange, +) -> Option { + let macro_call = find_macro_call(source_file.syntax(), frange.range)?; + let exp = crate::macros::expand(db, frange.file_id, macro_call)?; + let dst_range = exp.map_range_forward(frange.range)?; + let dst_range = ra_editor::extend_selection(exp.source_file().syntax(), dst_range)?; + let src_range = exp.map_range_back(dst_range)?; + Some(src_range) } fn find_macro_call(node: SyntaxNodeRef, range: TextRange) -> Option { diff --git a/crates/ra_cli/src/main.rs b/crates/ra_cli/src/main.rs index 939f7fe77..a3b856aa9 100644 --- a/crates/ra_cli/src/main.rs +++ b/crates/ra_cli/src/main.rs @@ -102,7 +102,7 @@ fn selections(file: &SourceFileNode, start: u32, end: u32) -> String { let mut cur = Some(TextRange::from_to((start - 1).into(), (end - 1).into())); while let Some(r) = cur { ranges.push(r); - cur = extend_selection(&file, r); + cur = extend_selection(file.syntax(), r); } let ranges = ranges .iter() diff --git a/crates/ra_editor/src/extend_selection.rs b/crates/ra_editor/src/extend_selection.rs index 4665a336a..bf0727dde 100644 --- a/crates/ra_editor/src/extend_selection.rs +++ b/crates/ra_editor/src/extend_selection.rs @@ -1,16 +1,11 @@ use ra_syntax::{ algo::{find_covering_node, find_leaf_at_offset, LeafAtOffset}, - Direction, SourceFileNode, + Direction, SyntaxKind::*, SyntaxNodeRef, TextRange, TextUnit, }; -pub fn extend_selection(file: &SourceFileNode, range: TextRange) -> Option { - let syntax = file.syntax(); - extend(syntax.borrowed(), range) -} - -pub(crate) fn extend(root: SyntaxNodeRef, range: TextRange) -> Option { +pub fn extend_selection(root: SyntaxNodeRef, range: TextRange) -> Option { if range.is_empty() { let offset = range.start(); let mut leaves = find_leaf_at_offset(root, offset); @@ -126,6 +121,7 @@ fn adj_comments(node: SyntaxNodeRef, dir: Direction) -> SyntaxNodeRef { #[cfg(test)] mod tests { use super::*; + use ra_syntax::SourceFileNode; use test_utils::extract_offset; fn do_check(before: &str, afters: &[&str]) { @@ -133,7 +129,7 @@ mod tests { let file = SourceFileNode::parse(&before); let mut range = TextRange::offset_len(cursor, 0.into()); for &after in afters { - range = extend_selection(&file, range).unwrap(); + range = extend_selection(file.syntax(), range).unwrap(); let actual = &before[range]; assert_eq!(after, actual); } -- cgit v1.2.3 From 862c99d0d5ef7c791a9319fa76c436762d88460c Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Mon, 31 Dec 2018 19:06:00 +0300 Subject: generalize highlighting to work with nodes --- crates/ra_analysis/src/syntax_highlighting.rs | 4 ++-- crates/ra_editor/src/lib.rs | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/crates/ra_analysis/src/syntax_highlighting.rs b/crates/ra_analysis/src/syntax_highlighting.rs index 38219da71..7e9139a74 100644 --- a/crates/ra_analysis/src/syntax_highlighting.rs +++ b/crates/ra_analysis/src/syntax_highlighting.rs @@ -9,14 +9,14 @@ use crate::{ pub(crate) fn highlight(db: &RootDatabase, file_id: FileId) -> Cancelable> { let source_file = db.source_file(file_id); - let mut res = ra_editor::highlight(&source_file); + let mut res = ra_editor::highlight(source_file.syntax()); for macro_call in source_file .syntax() .descendants() .filter_map(ast::MacroCall::cast) { if let Some(exp) = crate::macros::expand(db, file_id, macro_call) { - let mapped_ranges = ra_editor::highlight(exp.source_file()) + let mapped_ranges = ra_editor::highlight(exp.source_file().syntax()) .into_iter() .filter_map(|r| { let mapped_range = exp.map_range_back(r.range)?; diff --git a/crates/ra_editor/src/lib.rs b/crates/ra_editor/src/lib.rs index a65637d52..a293fec34 100644 --- a/crates/ra_editor/src/lib.rs +++ b/crates/ra_editor/src/lib.rs @@ -79,11 +79,11 @@ pub fn matching_brace(file: &SourceFileNode, offset: TextUnit) -> Option Vec { +pub fn highlight(root: SyntaxNodeRef) -> Vec { // Visited nodes to handle highlighting priorities let mut highlighted = FxHashSet::default(); let mut res = Vec::new(); - for node in file.syntax().descendants() { + for node in root.descendants() { if highlighted.contains(&node) { continue; } @@ -178,7 +178,7 @@ fn main() {} println!("Hello, {}!", 92); "#, ); - let hls = highlight(&file); + let hls = highlight(file.syntax()); assert_eq_dbg( r#"[HighlightedRange { range: [1; 11), tag: "comment" }, HighlightedRange { range: [12; 14), tag: "keyword" }, -- cgit v1.2.3