diff options
Diffstat (limited to 'crates/ra_ide/src/syntax_highlighting')
-rw-r--r-- | crates/ra_ide/src/syntax_highlighting/html.rs | 2 | ||||
-rw-r--r-- | crates/ra_ide/src/syntax_highlighting/injection.rs | 22 | ||||
-rw-r--r-- | crates/ra_ide/src/syntax_highlighting/tags.rs | 5 | ||||
-rw-r--r-- | crates/ra_ide/src/syntax_highlighting/tests.rs | 36 |
4 files changed, 43 insertions, 22 deletions
diff --git a/crates/ra_ide/src/syntax_highlighting/html.rs b/crates/ra_ide/src/syntax_highlighting/html.rs index 99b6b25ab..0c74f7370 100644 --- a/crates/ra_ide/src/syntax_highlighting/html.rs +++ b/crates/ra_ide/src/syntax_highlighting/html.rs | |||
@@ -64,6 +64,8 @@ pre { color: #DCDCCC; background: #3F3F3F; font-size: 22px; padd | |||
64 | 64 | ||
65 | .lifetime { color: #DFAF8F; font-style: italic; } | 65 | .lifetime { color: #DFAF8F; font-style: italic; } |
66 | .comment { color: #7F9F7F; } | 66 | .comment { color: #7F9F7F; } |
67 | .documentation { color: #629755; } | ||
68 | .injected { opacity: 0.65 ; } | ||
67 | .struct, .enum { color: #7CB8BB; } | 69 | .struct, .enum { color: #7CB8BB; } |
68 | .enum_variant { color: #BDE0F3; } | 70 | .enum_variant { color: #BDE0F3; } |
69 | .string_literal { color: #CC9393; } | 71 | .string_literal { color: #CC9393; } |
diff --git a/crates/ra_ide/src/syntax_highlighting/injection.rs b/crates/ra_ide/src/syntax_highlighting/injection.rs index 415f24a6d..181c21256 100644 --- a/crates/ra_ide/src/syntax_highlighting/injection.rs +++ b/crates/ra_ide/src/syntax_highlighting/injection.rs | |||
@@ -8,8 +8,8 @@ use ra_syntax::{ast, AstToken, SyntaxNode, SyntaxToken, TextRange, TextSize}; | |||
8 | use stdx::SepBy; | 8 | use stdx::SepBy; |
9 | 9 | ||
10 | use crate::{ | 10 | use crate::{ |
11 | call_info::ActiveParameter, Analysis, HighlightModifier, HighlightTag, HighlightedRange, | 11 | call_info::ActiveParameter, Analysis, Highlight, HighlightModifier, HighlightTag, |
12 | RootDatabase, | 12 | HighlightedRange, RootDatabase, |
13 | }; | 13 | }; |
14 | 14 | ||
15 | use super::HighlightedRangeStack; | 15 | use super::HighlightedRangeStack; |
@@ -155,19 +155,24 @@ pub(super) fn highlight_doc_comment( | |||
155 | let mut start_offset = None; | 155 | let mut start_offset = None; |
156 | let mut end_offset = None; | 156 | let mut end_offset = None; |
157 | for (line_start, orig_line_start) in range_mapping.range(..h.range.end()).rev() { | 157 | for (line_start, orig_line_start) in range_mapping.range(..h.range.end()).rev() { |
158 | // It's possible for orig_line_start - line_start to be negative. Add h.range.start() | ||
159 | // here and remove it from the end range after the loop below so that the values are | ||
160 | // always non-negative. | ||
161 | let offset = h.range.start() + orig_line_start - line_start; | ||
158 | if line_start <= &h.range.start() { | 162 | if line_start <= &h.range.start() { |
159 | start_offset.get_or_insert(orig_line_start - line_start); | 163 | start_offset.get_or_insert(offset); |
160 | break; | 164 | break; |
161 | } else { | 165 | } else { |
162 | end_offset.get_or_insert(orig_line_start - line_start); | 166 | end_offset.get_or_insert(offset); |
163 | } | 167 | } |
164 | } | 168 | } |
165 | if let Some(start_offset) = start_offset { | 169 | if let Some(start_offset) = start_offset { |
166 | h.range = TextRange::new( | 170 | h.range = TextRange::new( |
167 | h.range.start() + start_offset, | 171 | start_offset, |
168 | h.range.end() + end_offset.unwrap_or(start_offset), | 172 | h.range.end() + end_offset.unwrap_or(start_offset) - h.range.start(), |
169 | ); | 173 | ); |
170 | 174 | ||
175 | h.highlight |= HighlightModifier::Injected; | ||
171 | stack.add(h); | 176 | stack.add(h); |
172 | } | 177 | } |
173 | } | 178 | } |
@@ -177,6 +182,7 @@ pub(super) fn highlight_doc_comment( | |||
177 | for comment in new_comments { | 182 | for comment in new_comments { |
178 | stack.add(comment); | 183 | stack.add(comment); |
179 | } | 184 | } |
180 | stack.pop_and_inject(false); | 185 | stack.pop_and_inject(None); |
181 | stack.pop_and_inject(true); | 186 | stack |
187 | .pop_and_inject(Some(Highlight::from(HighlightTag::Generic) | HighlightModifier::Injected)); | ||
182 | } | 188 | } |
diff --git a/crates/ra_ide/src/syntax_highlighting/tags.rs b/crates/ra_ide/src/syntax_highlighting/tags.rs index 93bbb4b4d..e8e251cfc 100644 --- a/crates/ra_ide/src/syntax_highlighting/tags.rs +++ b/crates/ra_ide/src/syntax_highlighting/tags.rs | |||
@@ -27,6 +27,7 @@ pub enum HighlightTag { | |||
27 | Field, | 27 | Field, |
28 | FormatSpecifier, | 28 | FormatSpecifier, |
29 | Function, | 29 | Function, |
30 | Generic, | ||
30 | Keyword, | 31 | Keyword, |
31 | Lifetime, | 32 | Lifetime, |
32 | Macro, | 33 | Macro, |
@@ -57,6 +58,7 @@ pub enum HighlightModifier { | |||
57 | /// not. | 58 | /// not. |
58 | Definition, | 59 | Definition, |
59 | Documentation, | 60 | Documentation, |
61 | Injected, | ||
60 | Mutable, | 62 | Mutable, |
61 | Unsafe, | 63 | Unsafe, |
62 | } | 64 | } |
@@ -77,6 +79,7 @@ impl HighlightTag { | |||
77 | HighlightTag::Field => "field", | 79 | HighlightTag::Field => "field", |
78 | HighlightTag::FormatSpecifier => "format_specifier", | 80 | HighlightTag::FormatSpecifier => "format_specifier", |
79 | HighlightTag::Function => "function", | 81 | HighlightTag::Function => "function", |
82 | HighlightTag::Generic => "generic", | ||
80 | HighlightTag::Keyword => "keyword", | 83 | HighlightTag::Keyword => "keyword", |
81 | HighlightTag::Lifetime => "lifetime", | 84 | HighlightTag::Lifetime => "lifetime", |
82 | HighlightTag::Macro => "macro", | 85 | HighlightTag::Macro => "macro", |
@@ -110,6 +113,7 @@ impl HighlightModifier { | |||
110 | HighlightModifier::ControlFlow, | 113 | HighlightModifier::ControlFlow, |
111 | HighlightModifier::Definition, | 114 | HighlightModifier::Definition, |
112 | HighlightModifier::Documentation, | 115 | HighlightModifier::Documentation, |
116 | HighlightModifier::Injected, | ||
113 | HighlightModifier::Mutable, | 117 | HighlightModifier::Mutable, |
114 | HighlightModifier::Unsafe, | 118 | HighlightModifier::Unsafe, |
115 | ]; | 119 | ]; |
@@ -120,6 +124,7 @@ impl HighlightModifier { | |||
120 | HighlightModifier::ControlFlow => "control", | 124 | HighlightModifier::ControlFlow => "control", |
121 | HighlightModifier::Definition => "declaration", | 125 | HighlightModifier::Definition => "declaration", |
122 | HighlightModifier::Documentation => "documentation", | 126 | HighlightModifier::Documentation => "documentation", |
127 | HighlightModifier::Injected => "injected", | ||
123 | HighlightModifier::Mutable => "mutable", | 128 | HighlightModifier::Mutable => "mutable", |
124 | HighlightModifier::Unsafe => "unsafe", | 129 | HighlightModifier::Unsafe => "unsafe", |
125 | } | 130 | } |
diff --git a/crates/ra_ide/src/syntax_highlighting/tests.rs b/crates/ra_ide/src/syntax_highlighting/tests.rs index b4d56a7a0..b7fad9719 100644 --- a/crates/ra_ide/src/syntax_highlighting/tests.rs +++ b/crates/ra_ide/src/syntax_highlighting/tests.rs | |||
@@ -2,10 +2,7 @@ use std::fs; | |||
2 | 2 | ||
3 | use test_utils::{assert_eq_text, project_dir, read_text}; | 3 | use test_utils::{assert_eq_text, project_dir, read_text}; |
4 | 4 | ||
5 | use crate::{ | 5 | use crate::{mock_analysis::single_file, FileRange, TextRange}; |
6 | mock_analysis::{single_file, MockAnalysis}, | ||
7 | FileRange, TextRange, | ||
8 | }; | ||
9 | 6 | ||
10 | #[test] | 7 | #[test] |
11 | fn test_highlighting() { | 8 | fn test_highlighting() { |
@@ -127,12 +124,10 @@ fn accidentally_quadratic() { | |||
127 | let file = project_dir().join("crates/ra_syntax/test_data/accidentally_quadratic"); | 124 | let file = project_dir().join("crates/ra_syntax/test_data/accidentally_quadratic"); |
128 | let src = fs::read_to_string(file).unwrap(); | 125 | let src = fs::read_to_string(file).unwrap(); |
129 | 126 | ||
130 | let mut mock = MockAnalysis::new(); | 127 | let (analysis, file_id) = single_file(&src); |
131 | let file_id = mock.add_file("/main.rs", &src); | ||
132 | let host = mock.analysis_host(); | ||
133 | 128 | ||
134 | // let t = std::time::Instant::now(); | 129 | // let t = std::time::Instant::now(); |
135 | let _ = host.analysis().highlight(file_id).unwrap(); | 130 | let _ = analysis.highlight(file_id).unwrap(); |
136 | // eprintln!("elapsed: {:?}", t.elapsed()); | 131 | // eprintln!("elapsed: {:?}", t.elapsed()); |
137 | } | 132 | } |
138 | 133 | ||
@@ -140,16 +135,17 @@ fn accidentally_quadratic() { | |||
140 | fn test_ranges() { | 135 | fn test_ranges() { |
141 | let (analysis, file_id) = single_file( | 136 | let (analysis, file_id) = single_file( |
142 | r#" | 137 | r#" |
143 | #[derive(Clone, Debug)] | 138 | #[derive(Clone, Debug)] |
144 | struct Foo { | 139 | struct Foo { |
145 | pub x: i32, | 140 | pub x: i32, |
146 | pub y: i32, | 141 | pub y: i32, |
147 | }"#, | 142 | } |
143 | "#, | ||
148 | ); | 144 | ); |
149 | 145 | ||
150 | // The "x" | 146 | // The "x" |
151 | let highlights = &analysis | 147 | let highlights = &analysis |
152 | .highlight_range(FileRange { file_id, range: TextRange::at(82.into(), 1.into()) }) | 148 | .highlight_range(FileRange { file_id, range: TextRange::at(45.into(), 1.into()) }) |
153 | .unwrap(); | 149 | .unwrap(); |
154 | 150 | ||
155 | assert_eq!(&highlights[0].highlight.to_string(), "field.declaration"); | 151 | assert_eq!(&highlights[0].highlight.to_string(), "field.declaration"); |
@@ -291,6 +287,9 @@ fn main() { | |||
291 | fn test_highlight_doctest() { | 287 | fn test_highlight_doctest() { |
292 | check_highlighting( | 288 | check_highlighting( |
293 | r#" | 289 | r#" |
290 | /// ``` | ||
291 | /// let _ = "early doctests should not go boom"; | ||
292 | /// ``` | ||
294 | struct Foo { | 293 | struct Foo { |
295 | bar: bool, | 294 | bar: bool, |
296 | } | 295 | } |
@@ -344,6 +343,15 @@ impl Foo { | |||
344 | true | 343 | true |
345 | } | 344 | } |
346 | } | 345 | } |
346 | |||
347 | /// ``` | ||
348 | /// noop!(1); | ||
349 | /// ``` | ||
350 | macro_rules! noop { | ||
351 | ($expr:expr) => { | ||
352 | $expr | ||
353 | } | ||
354 | } | ||
347 | "# | 355 | "# |
348 | .trim(), | 356 | .trim(), |
349 | "crates/ra_ide/src/snapshots/highlight_doctest.html", | 357 | "crates/ra_ide/src/snapshots/highlight_doctest.html", |