aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_ide/src
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_ide/src')
-rw-r--r--crates/ra_ide/src/syntax_highlighting.rs33
1 files changed, 18 insertions, 15 deletions
diff --git a/crates/ra_ide/src/syntax_highlighting.rs b/crates/ra_ide/src/syntax_highlighting.rs
index 5f11b091c..22d0ed3e6 100644
--- a/crates/ra_ide/src/syntax_highlighting.rs
+++ b/crates/ra_ide/src/syntax_highlighting.rs
@@ -46,32 +46,35 @@ fn is_control_keyword(kind: SyntaxKind) -> bool {
46pub(crate) fn highlight( 46pub(crate) fn highlight(
47 db: &RootDatabase, 47 db: &RootDatabase,
48 file_id: FileId, 48 file_id: FileId,
49 range: Option<TextRange>, 49 range_to_highlight: Option<TextRange>,
50) -> Vec<HighlightedRange> { 50) -> Vec<HighlightedRange> {
51 let _p = profile("highlight"); 51 let _p = profile("highlight");
52 let sema = Semantics::new(db); 52 let sema = Semantics::new(db);
53 let root = sema.parse(file_id).syntax().clone(); 53
54 // Determine the root based on the given range.
55 let (root, range_to_highlight) = {
56 let source_file = sema.parse(file_id);
57 match range_to_highlight {
58 Some(range) => {
59 let node = match source_file.syntax().covering_element(range) {
60 NodeOrToken::Node(it) => it,
61 NodeOrToken::Token(it) => it.parent(),
62 };
63 (node, range)
64 }
65 None => (source_file.syntax().clone(), source_file.syntax().text_range()),
66 }
67 };
54 68
55 let mut bindings_shadow_count: FxHashMap<Name, u32> = FxHashMap::default(); 69 let mut bindings_shadow_count: FxHashMap<Name, u32> = FxHashMap::default();
56 let mut res = Vec::new(); 70 let mut res = Vec::new();
57 71
58 let mut in_macro_call = None; 72 let mut in_macro_call = None;
59 73
60 // Determine the root based on the given range.
61 let (root, highlight_range) = if let Some(range) = range {
62 let root = match root.covering_element(range) {
63 NodeOrToken::Node(node) => node,
64 NodeOrToken::Token(token) => token.parent(),
65 };
66 (root, range)
67 } else {
68 (root.clone(), root.text_range())
69 };
70
71 for event in root.preorder_with_tokens() { 74 for event in root.preorder_with_tokens() {
72 match event { 75 match event {
73 WalkEvent::Enter(node) => { 76 WalkEvent::Enter(node) => {
74 if node.text_range().intersection(&highlight_range).is_none() { 77 if node.text_range().intersection(&range_to_highlight).is_none() {
75 continue; 78 continue;
76 } 79 }
77 80
@@ -115,7 +118,7 @@ pub(crate) fn highlight(
115 } 118 }
116 } 119 }
117 WalkEvent::Leave(node) => { 120 WalkEvent::Leave(node) => {
118 if node.text_range().intersection(&highlight_range).is_none() { 121 if node.text_range().intersection(&range_to_highlight).is_none() {
119 continue; 122 continue;
120 } 123 }
121 124