diff options
Diffstat (limited to 'crates/ra_ide')
-rw-r--r-- | crates/ra_ide/src/completion/complete_postfix.rs | 206 | ||||
-rw-r--r-- | crates/ra_ide/src/completion/complete_snippet.rs | 26 | ||||
-rw-r--r-- | crates/ra_ide/src/display/navigation_target.rs | 9 | ||||
-rw-r--r-- | crates/ra_ide/src/references.rs | 25 | ||||
-rw-r--r-- | crates/ra_ide/src/snapshots/highlight_strings.html | 4 | ||||
-rw-r--r-- | crates/ra_ide/src/snapshots/highlighting.html | 23 | ||||
-rw-r--r-- | crates/ra_ide/src/syntax_highlighting.rs | 33 | ||||
-rw-r--r-- | crates/ra_ide/src/syntax_highlighting/tests.rs | 21 |
8 files changed, 336 insertions, 11 deletions
diff --git a/crates/ra_ide/src/completion/complete_postfix.rs b/crates/ra_ide/src/completion/complete_postfix.rs index 6a0f0c72e..c5c4426cc 100644 --- a/crates/ra_ide/src/completion/complete_postfix.rs +++ b/crates/ra_ide/src/completion/complete_postfix.rs | |||
@@ -14,6 +14,7 @@ use crate::{ | |||
14 | }, | 14 | }, |
15 | CompletionItem, | 15 | CompletionItem, |
16 | }; | 16 | }; |
17 | use ra_assists::utils::TryEnum; | ||
17 | 18 | ||
18 | pub(super) fn complete_postfix(acc: &mut Completions, ctx: &CompletionContext) { | 19 | pub(super) fn complete_postfix(acc: &mut Completions, ctx: &CompletionContext) { |
19 | if !ctx.config.enable_postfix_completions { | 20 | if !ctx.config.enable_postfix_completions { |
@@ -38,7 +39,52 @@ pub(super) fn complete_postfix(acc: &mut Completions, ctx: &CompletionContext) { | |||
38 | None => return, | 39 | None => return, |
39 | }; | 40 | }; |
40 | 41 | ||
41 | if receiver_ty.is_bool() || receiver_ty.is_unknown() { | 42 | if let Some(try_enum) = TryEnum::from_ty(&ctx.sema, &receiver_ty) { |
43 | match try_enum { | ||
44 | TryEnum::Result => { | ||
45 | postfix_snippet( | ||
46 | ctx, | ||
47 | cap, | ||
48 | &dot_receiver, | ||
49 | "ifl", | ||
50 | "if let Ok {}", | ||
51 | &format!("if let Ok($1) = {} {{\n $0\n}}", receiver_text), | ||
52 | ) | ||
53 | .add_to(acc); | ||
54 | |||
55 | postfix_snippet( | ||
56 | ctx, | ||
57 | cap, | ||
58 | &dot_receiver, | ||
59 | "while", | ||
60 | "while let Ok {}", | ||
61 | &format!("while let Ok($1) = {} {{\n $0\n}}", receiver_text), | ||
62 | ) | ||
63 | .add_to(acc); | ||
64 | } | ||
65 | TryEnum::Option => { | ||
66 | postfix_snippet( | ||
67 | ctx, | ||
68 | cap, | ||
69 | &dot_receiver, | ||
70 | "ifl", | ||
71 | "if let Some {}", | ||
72 | &format!("if let Some($1) = {} {{\n $0\n}}", receiver_text), | ||
73 | ) | ||
74 | .add_to(acc); | ||
75 | |||
76 | postfix_snippet( | ||
77 | ctx, | ||
78 | cap, | ||
79 | &dot_receiver, | ||
80 | "while", | ||
81 | "while let Some {}", | ||
82 | &format!("while let Some($1) = {} {{\n $0\n}}", receiver_text), | ||
83 | ) | ||
84 | .add_to(acc); | ||
85 | } | ||
86 | } | ||
87 | } else if receiver_ty.is_bool() || receiver_ty.is_unknown() { | ||
42 | postfix_snippet( | 88 | postfix_snippet( |
43 | ctx, | 89 | ctx, |
44 | cap, | 90 | cap, |
@@ -236,6 +282,164 @@ mod tests { | |||
236 | } | 282 | } |
237 | 283 | ||
238 | #[test] | 284 | #[test] |
285 | fn postfix_completion_works_for_option() { | ||
286 | assert_debug_snapshot!( | ||
287 | do_postfix_completion( | ||
288 | r#" | ||
289 | enum Option<T> { | ||
290 | Some(T), | ||
291 | None, | ||
292 | } | ||
293 | |||
294 | fn main() { | ||
295 | let bar = Option::Some(true); | ||
296 | bar.<|> | ||
297 | } | ||
298 | "#, | ||
299 | ), | ||
300 | @r###" | ||
301 | [ | ||
302 | CompletionItem { | ||
303 | label: "box", | ||
304 | source_range: 210..210, | ||
305 | delete: 206..210, | ||
306 | insert: "Box::new(bar)", | ||
307 | detail: "Box::new(expr)", | ||
308 | }, | ||
309 | CompletionItem { | ||
310 | label: "dbg", | ||
311 | source_range: 210..210, | ||
312 | delete: 206..210, | ||
313 | insert: "dbg!(bar)", | ||
314 | detail: "dbg!(expr)", | ||
315 | }, | ||
316 | CompletionItem { | ||
317 | label: "ifl", | ||
318 | source_range: 210..210, | ||
319 | delete: 206..210, | ||
320 | insert: "if let Some($1) = bar {\n $0\n}", | ||
321 | detail: "if let Some {}", | ||
322 | }, | ||
323 | CompletionItem { | ||
324 | label: "match", | ||
325 | source_range: 210..210, | ||
326 | delete: 206..210, | ||
327 | insert: "match bar {\n ${1:_} => {$0\\},\n}", | ||
328 | detail: "match expr {}", | ||
329 | }, | ||
330 | CompletionItem { | ||
331 | label: "not", | ||
332 | source_range: 210..210, | ||
333 | delete: 206..210, | ||
334 | insert: "!bar", | ||
335 | detail: "!expr", | ||
336 | }, | ||
337 | CompletionItem { | ||
338 | label: "ref", | ||
339 | source_range: 210..210, | ||
340 | delete: 206..210, | ||
341 | insert: "&bar", | ||
342 | detail: "&expr", | ||
343 | }, | ||
344 | CompletionItem { | ||
345 | label: "refm", | ||
346 | source_range: 210..210, | ||
347 | delete: 206..210, | ||
348 | insert: "&mut bar", | ||
349 | detail: "&mut expr", | ||
350 | }, | ||
351 | CompletionItem { | ||
352 | label: "while", | ||
353 | source_range: 210..210, | ||
354 | delete: 206..210, | ||
355 | insert: "while let Some($1) = bar {\n $0\n}", | ||
356 | detail: "while let Some {}", | ||
357 | }, | ||
358 | ] | ||
359 | "### | ||
360 | ); | ||
361 | } | ||
362 | |||
363 | #[test] | ||
364 | fn postfix_completion_works_for_result() { | ||
365 | assert_debug_snapshot!( | ||
366 | do_postfix_completion( | ||
367 | r#" | ||
368 | enum Result<T, E> { | ||
369 | Ok(T), | ||
370 | Err(E), | ||
371 | } | ||
372 | |||
373 | fn main() { | ||
374 | let bar = Result::Ok(true); | ||
375 | bar.<|> | ||
376 | } | ||
377 | "#, | ||
378 | ), | ||
379 | @r###" | ||
380 | [ | ||
381 | CompletionItem { | ||
382 | label: "box", | ||
383 | source_range: 211..211, | ||
384 | delete: 207..211, | ||
385 | insert: "Box::new(bar)", | ||
386 | detail: "Box::new(expr)", | ||
387 | }, | ||
388 | CompletionItem { | ||
389 | label: "dbg", | ||
390 | source_range: 211..211, | ||
391 | delete: 207..211, | ||
392 | insert: "dbg!(bar)", | ||
393 | detail: "dbg!(expr)", | ||
394 | }, | ||
395 | CompletionItem { | ||
396 | label: "ifl", | ||
397 | source_range: 211..211, | ||
398 | delete: 207..211, | ||
399 | insert: "if let Ok($1) = bar {\n $0\n}", | ||
400 | detail: "if let Ok {}", | ||
401 | }, | ||
402 | CompletionItem { | ||
403 | label: "match", | ||
404 | source_range: 211..211, | ||
405 | delete: 207..211, | ||
406 | insert: "match bar {\n ${1:_} => {$0\\},\n}", | ||
407 | detail: "match expr {}", | ||
408 | }, | ||
409 | CompletionItem { | ||
410 | label: "not", | ||
411 | source_range: 211..211, | ||
412 | delete: 207..211, | ||
413 | insert: "!bar", | ||
414 | detail: "!expr", | ||
415 | }, | ||
416 | CompletionItem { | ||
417 | label: "ref", | ||
418 | source_range: 211..211, | ||
419 | delete: 207..211, | ||
420 | insert: "&bar", | ||
421 | detail: "&expr", | ||
422 | }, | ||
423 | CompletionItem { | ||
424 | label: "refm", | ||
425 | source_range: 211..211, | ||
426 | delete: 207..211, | ||
427 | insert: "&mut bar", | ||
428 | detail: "&mut expr", | ||
429 | }, | ||
430 | CompletionItem { | ||
431 | label: "while", | ||
432 | source_range: 211..211, | ||
433 | delete: 207..211, | ||
434 | insert: "while let Ok($1) = bar {\n $0\n}", | ||
435 | detail: "while let Ok {}", | ||
436 | }, | ||
437 | ] | ||
438 | "### | ||
439 | ); | ||
440 | } | ||
441 | |||
442 | #[test] | ||
239 | fn some_postfix_completions_ignored() { | 443 | fn some_postfix_completions_ignored() { |
240 | assert_debug_snapshot!( | 444 | assert_debug_snapshot!( |
241 | do_postfix_completion( | 445 | do_postfix_completion( |
diff --git a/crates/ra_ide/src/completion/complete_snippet.rs b/crates/ra_ide/src/completion/complete_snippet.rs index a3f5d1b6a..0568d9ccf 100644 --- a/crates/ra_ide/src/completion/complete_snippet.rs +++ b/crates/ra_ide/src/completion/complete_snippet.rs | |||
@@ -36,6 +36,24 @@ pub(super) fn complete_item_snippet(acc: &mut Completions, ctx: &CompletionConte | |||
36 | snippet( | 36 | snippet( |
37 | ctx, | 37 | ctx, |
38 | cap, | 38 | cap, |
39 | "Test module", | ||
40 | "\ | ||
41 | #[cfg(test)] | ||
42 | mod tests { | ||
43 | use super::*; | ||
44 | |||
45 | #[test] | ||
46 | fn ${1:test_name}() { | ||
47 | $0 | ||
48 | } | ||
49 | }", | ||
50 | ) | ||
51 | .lookup_by("tmod") | ||
52 | .add_to(acc); | ||
53 | |||
54 | snippet( | ||
55 | ctx, | ||
56 | cap, | ||
39 | "Test function", | 57 | "Test function", |
40 | "\ | 58 | "\ |
41 | #[test] | 59 | #[test] |
@@ -118,6 +136,14 @@ mod tests { | |||
118 | lookup: "tfn", | 136 | lookup: "tfn", |
119 | }, | 137 | }, |
120 | CompletionItem { | 138 | CompletionItem { |
139 | label: "Test module", | ||
140 | source_range: 78..78, | ||
141 | delete: 78..78, | ||
142 | insert: "#[cfg(test)]\nmod tests {\n use super::*;\n\n #[test]\n fn ${1:test_name}() {\n $0\n }\n}", | ||
143 | kind: Snippet, | ||
144 | lookup: "tmod", | ||
145 | }, | ||
146 | CompletionItem { | ||
121 | label: "macro_rules", | 147 | label: "macro_rules", |
122 | source_range: 78..78, | 148 | source_range: 78..78, |
123 | delete: 78..78, | 149 | delete: 78..78, |
diff --git a/crates/ra_ide/src/display/navigation_target.rs b/crates/ra_ide/src/display/navigation_target.rs index de35c6711..5da28edd2 100644 --- a/crates/ra_ide/src/display/navigation_target.rs +++ b/crates/ra_ide/src/display/navigation_target.rs | |||
@@ -11,7 +11,7 @@ use ra_syntax::{ | |||
11 | TextRange, | 11 | TextRange, |
12 | }; | 12 | }; |
13 | 13 | ||
14 | use crate::FileSymbol; | 14 | use crate::{FileRange, FileSymbol}; |
15 | 15 | ||
16 | use super::short_label::ShortLabel; | 16 | use super::short_label::ShortLabel; |
17 | 17 | ||
@@ -22,10 +22,11 @@ use super::short_label::ShortLabel; | |||
22 | /// code, like a function or a struct, but this is not strictly required. | 22 | /// code, like a function or a struct, but this is not strictly required. |
23 | #[derive(Debug, Clone, PartialEq, Eq, Hash)] | 23 | #[derive(Debug, Clone, PartialEq, Eq, Hash)] |
24 | pub struct NavigationTarget { | 24 | pub struct NavigationTarget { |
25 | // FIXME: use FileRange? | ||
25 | file_id: FileId, | 26 | file_id: FileId, |
27 | full_range: TextRange, | ||
26 | name: SmolStr, | 28 | name: SmolStr, |
27 | kind: SyntaxKind, | 29 | kind: SyntaxKind, |
28 | full_range: TextRange, | ||
29 | focus_range: Option<TextRange>, | 30 | focus_range: Option<TextRange>, |
30 | container_name: Option<SmolStr>, | 31 | container_name: Option<SmolStr>, |
31 | description: Option<String>, | 32 | description: Option<String>, |
@@ -63,6 +64,10 @@ impl NavigationTarget { | |||
63 | self.file_id | 64 | self.file_id |
64 | } | 65 | } |
65 | 66 | ||
67 | pub fn file_range(&self) -> FileRange { | ||
68 | FileRange { file_id: self.file_id, range: self.full_range } | ||
69 | } | ||
70 | |||
66 | pub fn full_range(&self) -> TextRange { | 71 | pub fn full_range(&self) -> TextRange { |
67 | self.full_range | 72 | self.full_range |
68 | } | 73 | } |
diff --git a/crates/ra_ide/src/references.rs b/crates/ra_ide/src/references.rs index 555ccf295..074284b42 100644 --- a/crates/ra_ide/src/references.rs +++ b/crates/ra_ide/src/references.rs | |||
@@ -593,6 +593,31 @@ mod tests { | |||
593 | check_result(refs, "i BIND_PAT FileId(1) 36..37 Other", &["FileId(1) 51..52 Other Write"]); | 593 | check_result(refs, "i BIND_PAT FileId(1) 36..37 Other", &["FileId(1) 51..52 Other Write"]); |
594 | } | 594 | } |
595 | 595 | ||
596 | #[test] | ||
597 | fn test_find_struct_function_refs_outside_module() { | ||
598 | let code = r#" | ||
599 | mod foo { | ||
600 | pub struct Foo; | ||
601 | |||
602 | impl Foo { | ||
603 | pub fn new<|>() -> Foo { | ||
604 | Foo | ||
605 | } | ||
606 | } | ||
607 | } | ||
608 | |||
609 | fn main() { | ||
610 | let _f = foo::Foo::new(); | ||
611 | }"#; | ||
612 | |||
613 | let refs = get_all_refs(code); | ||
614 | check_result( | ||
615 | refs, | ||
616 | "new FN_DEF FileId(1) 87..150 94..97 Other", | ||
617 | &["FileId(1) 227..230 StructLiteral"], | ||
618 | ); | ||
619 | } | ||
620 | |||
596 | fn get_all_refs(text: &str) -> ReferenceSearchResult { | 621 | fn get_all_refs(text: &str) -> ReferenceSearchResult { |
597 | let (analysis, position) = single_file_with_position(text); | 622 | let (analysis, position) = single_file_with_position(text); |
598 | analysis.find_all_refs(position, None).unwrap().unwrap() | 623 | analysis.find_all_refs(position, None).unwrap().unwrap() |
diff --git a/crates/ra_ide/src/snapshots/highlight_strings.html b/crates/ra_ide/src/snapshots/highlight_strings.html index de06daf72..752b487e8 100644 --- a/crates/ra_ide/src/snapshots/highlight_strings.html +++ b/crates/ra_ide/src/snapshots/highlight_strings.html | |||
@@ -27,13 +27,13 @@ pre { color: #DCDCCC; background: #3F3F3F; font-size: 22px; padd | |||
27 | .keyword.unsafe { color: #BC8383; font-weight: bold; } | 27 | .keyword.unsafe { color: #BC8383; font-weight: bold; } |
28 | .control { font-style: italic; } | 28 | .control { font-style: italic; } |
29 | </style> | 29 | </style> |
30 | <pre><code><span class="macro">macro_rules!</span> println { | 30 | <pre><code><span class="macro">macro_rules!</span> <span class="macro declaration">println</span> { |
31 | ($($arg:tt)*) => ({ | 31 | ($($arg:tt)*) => ({ |
32 | $<span class="keyword">crate</span>::io::_print($<span class="keyword">crate</span>::format_args_nl!($($arg)*)); | 32 | $<span class="keyword">crate</span>::io::_print($<span class="keyword">crate</span>::format_args_nl!($($arg)*)); |
33 | }) | 33 | }) |
34 | } | 34 | } |
35 | #[rustc_builtin_macro] | 35 | #[rustc_builtin_macro] |
36 | <span class="macro">macro_rules!</span> format_args_nl { | 36 | <span class="macro">macro_rules!</span> <span class="macro declaration">format_args_nl</span> { |
37 | ($fmt:expr) => {{ <span class="comment">/* compiler built-in */</span> }}; | 37 | ($fmt:expr) => {{ <span class="comment">/* compiler built-in */</span> }}; |
38 | ($fmt:expr, $($args:tt)*) => {{ <span class="comment">/* compiler built-in */</span> }}; | 38 | ($fmt:expr, $($args:tt)*) => {{ <span class="comment">/* compiler built-in */</span> }}; |
39 | } | 39 | } |
diff --git a/crates/ra_ide/src/snapshots/highlighting.html b/crates/ra_ide/src/snapshots/highlighting.html index 4b12fe823..635fe5cf9 100644 --- a/crates/ra_ide/src/snapshots/highlighting.html +++ b/crates/ra_ide/src/snapshots/highlighting.html | |||
@@ -33,11 +33,23 @@ pre { color: #DCDCCC; background: #3F3F3F; font-size: 22px; padd | |||
33 | <span class="keyword">pub</span> <span class="field declaration">y</span>: <span class="builtin_type">i32</span>, | 33 | <span class="keyword">pub</span> <span class="field declaration">y</span>: <span class="builtin_type">i32</span>, |
34 | } | 34 | } |
35 | 35 | ||
36 | <span class="keyword">trait</span> <span class="trait declaration">Bar</span> { | ||
37 | <span class="keyword">fn</span> <span class="function declaration">bar</span>(&<span class="keyword">self</span>) -> <span class="builtin_type">i32</span>; | ||
38 | } | ||
39 | |||
40 | <span class="keyword">impl</span> <span class="trait">Bar</span> <span class="keyword">for</span> <span class="struct">Foo</span> { | ||
41 | <span class="keyword">fn</span> <span class="function declaration">bar</span>(&<span class="keyword">self</span>) -> <span class="builtin_type">i32</span> { | ||
42 | <span class="keyword">self</span>.<span class="field">x</span> | ||
43 | } | ||
44 | } | ||
45 | |||
46 | <span class="keyword">static</span> <span class="keyword">mut</span> <span class="static declaration mutable">STATIC_MUT</span>: <span class="builtin_type">i32</span> = <span class="numeric_literal">0</span>; | ||
47 | |||
36 | <span class="keyword">fn</span> <span class="function declaration">foo</span><<span class="lifetime declaration">'a</span>, <span class="type_param declaration">T</span>>() -> <span class="type_param">T</span> { | 48 | <span class="keyword">fn</span> <span class="function declaration">foo</span><<span class="lifetime declaration">'a</span>, <span class="type_param declaration">T</span>>() -> <span class="type_param">T</span> { |
37 | <span class="function">foo</span>::<<span class="lifetime">'a</span>, <span class="builtin_type">i32</span>>() | 49 | <span class="function">foo</span>::<<span class="lifetime">'a</span>, <span class="builtin_type">i32</span>>() |
38 | } | 50 | } |
39 | 51 | ||
40 | <span class="macro">macro_rules!</span> def_fn { | 52 | <span class="macro">macro_rules!</span> <span class="macro declaration">def_fn</span> { |
41 | ($($tt:tt)*) => {$($tt)*} | 53 | ($($tt:tt)*) => {$($tt)*} |
42 | } | 54 | } |
43 | 55 | ||
@@ -56,7 +68,14 @@ pre { color: #DCDCCC; background: #3F3F3F; font-size: 22px; padd | |||
56 | <span class="keyword">let</span> <span class="variable declaration">x</span> = <span class="numeric_literal">92</span>; | 68 | <span class="keyword">let</span> <span class="variable declaration">x</span> = <span class="numeric_literal">92</span>; |
57 | <span class="variable mutable">vec</span>.<span class="unresolved_reference">push</span>(<span class="struct">Foo</span> { <span class="field">x</span>, <span class="field">y</span>: <span class="numeric_literal">1</span> }); | 69 | <span class="variable mutable">vec</span>.<span class="unresolved_reference">push</span>(<span class="struct">Foo</span> { <span class="field">x</span>, <span class="field">y</span>: <span class="numeric_literal">1</span> }); |
58 | } | 70 | } |
59 | <span class="keyword unsafe">unsafe</span> { <span class="variable mutable">vec</span>.<span class="unresolved_reference">set_len</span>(<span class="numeric_literal">0</span>); } | 71 | <span class="keyword unsafe">unsafe</span> { |
72 | <span class="variable mutable">vec</span>.<span class="unresolved_reference">set_len</span>(<span class="numeric_literal">0</span>); | ||
73 | <span class="static mutable">STATIC_MUT</span> = <span class="numeric_literal">1</span>; | ||
74 | } | ||
75 | |||
76 | <span class="keyword control">for</span> <span class="variable declaration">e</span> <span class="keyword control">in</span> <span class="variable mutable">vec</span> { | ||
77 | <span class="comment">// Do nothing</span> | ||
78 | } | ||
60 | 79 | ||
61 | <span class="keyword">let</span> <span class="keyword">mut</span> <span class="variable declaration mutable">x</span> = <span class="numeric_literal">42</span>; | 80 | <span class="keyword">let</span> <span class="keyword">mut</span> <span class="variable declaration mutable">x</span> = <span class="numeric_literal">42</span>; |
62 | <span class="keyword">let</span> <span class="variable declaration mutable">y</span> = &<span class="keyword">mut</span> <span class="variable mutable">x</span>; | 81 | <span class="keyword">let</span> <span class="variable declaration mutable">y</span> = &<span class="keyword">mut</span> <span class="variable mutable">x</span>; |
diff --git a/crates/ra_ide/src/syntax_highlighting.rs b/crates/ra_ide/src/syntax_highlighting.rs index 6658c7bb2..be57eeb0a 100644 --- a/crates/ra_ide/src/syntax_highlighting.rs +++ b/crates/ra_ide/src/syntax_highlighting.rs | |||
@@ -167,6 +167,19 @@ pub(crate) fn highlight( | |||
167 | binding_hash: None, | 167 | binding_hash: None, |
168 | }); | 168 | }); |
169 | } | 169 | } |
170 | if let Some(name) = mc.is_macro_rules() { | ||
171 | if let Some((highlight, binding_hash)) = highlight_element( | ||
172 | &sema, | ||
173 | &mut bindings_shadow_count, | ||
174 | name.syntax().clone().into(), | ||
175 | ) { | ||
176 | stack.add(HighlightedRange { | ||
177 | range: name.syntax().text_range(), | ||
178 | highlight, | ||
179 | binding_hash, | ||
180 | }); | ||
181 | } | ||
182 | } | ||
170 | continue; | 183 | continue; |
171 | } | 184 | } |
172 | WalkEvent::Leave(Some(mc)) => { | 185 | WalkEvent::Leave(Some(mc)) => { |
@@ -390,12 +403,13 @@ fn highlight_element( | |||
390 | T![break] | 403 | T![break] |
391 | | T![continue] | 404 | | T![continue] |
392 | | T![else] | 405 | | T![else] |
393 | | T![for] | ||
394 | | T![if] | 406 | | T![if] |
395 | | T![loop] | 407 | | T![loop] |
396 | | T![match] | 408 | | T![match] |
397 | | T![return] | 409 | | T![return] |
398 | | T![while] => h | HighlightModifier::ControlFlow, | 410 | | T![while] |
411 | | T![in] => h | HighlightModifier::ControlFlow, | ||
412 | T![for] if !is_child_of_impl(element) => h | HighlightModifier::ControlFlow, | ||
399 | T![unsafe] => h | HighlightModifier::Unsafe, | 413 | T![unsafe] => h | HighlightModifier::Unsafe, |
400 | _ => h, | 414 | _ => h, |
401 | } | 415 | } |
@@ -419,6 +433,13 @@ fn highlight_element( | |||
419 | } | 433 | } |
420 | } | 434 | } |
421 | 435 | ||
436 | fn is_child_of_impl(element: SyntaxElement) -> bool { | ||
437 | match element.parent() { | ||
438 | Some(e) => e.kind() == IMPL_DEF, | ||
439 | _ => false, | ||
440 | } | ||
441 | } | ||
442 | |||
422 | fn highlight_name(db: &RootDatabase, def: Definition) -> Highlight { | 443 | fn highlight_name(db: &RootDatabase, def: Definition) -> Highlight { |
423 | match def { | 444 | match def { |
424 | Definition::Macro(_) => HighlightTag::Macro, | 445 | Definition::Macro(_) => HighlightTag::Macro, |
@@ -431,10 +452,16 @@ fn highlight_name(db: &RootDatabase, def: Definition) -> Highlight { | |||
431 | hir::ModuleDef::Adt(hir::Adt::Union(_)) => HighlightTag::Union, | 452 | hir::ModuleDef::Adt(hir::Adt::Union(_)) => HighlightTag::Union, |
432 | hir::ModuleDef::EnumVariant(_) => HighlightTag::EnumVariant, | 453 | hir::ModuleDef::EnumVariant(_) => HighlightTag::EnumVariant, |
433 | hir::ModuleDef::Const(_) => HighlightTag::Constant, | 454 | hir::ModuleDef::Const(_) => HighlightTag::Constant, |
434 | hir::ModuleDef::Static(_) => HighlightTag::Static, | ||
435 | hir::ModuleDef::Trait(_) => HighlightTag::Trait, | 455 | hir::ModuleDef::Trait(_) => HighlightTag::Trait, |
436 | hir::ModuleDef::TypeAlias(_) => HighlightTag::TypeAlias, | 456 | hir::ModuleDef::TypeAlias(_) => HighlightTag::TypeAlias, |
437 | hir::ModuleDef::BuiltinType(_) => HighlightTag::BuiltinType, | 457 | hir::ModuleDef::BuiltinType(_) => HighlightTag::BuiltinType, |
458 | hir::ModuleDef::Static(s) => { | ||
459 | let mut h = Highlight::new(HighlightTag::Static); | ||
460 | if s.is_mut(db) { | ||
461 | h |= HighlightModifier::Mutable; | ||
462 | } | ||
463 | return h; | ||
464 | } | ||
438 | }, | 465 | }, |
439 | Definition::SelfType(_) => HighlightTag::SelfType, | 466 | Definition::SelfType(_) => HighlightTag::SelfType, |
440 | Definition::TypeParam(_) => HighlightTag::TypeParam, | 467 | Definition::TypeParam(_) => HighlightTag::TypeParam, |
diff --git a/crates/ra_ide/src/syntax_highlighting/tests.rs b/crates/ra_ide/src/syntax_highlighting/tests.rs index d2926ba78..eb43a23da 100644 --- a/crates/ra_ide/src/syntax_highlighting/tests.rs +++ b/crates/ra_ide/src/syntax_highlighting/tests.rs | |||
@@ -17,6 +17,18 @@ struct Foo { | |||
17 | pub y: i32, | 17 | pub y: i32, |
18 | } | 18 | } |
19 | 19 | ||
20 | trait Bar { | ||
21 | fn bar(&self) -> i32; | ||
22 | } | ||
23 | |||
24 | impl Bar for Foo { | ||
25 | fn bar(&self) -> i32 { | ||
26 | self.x | ||
27 | } | ||
28 | } | ||
29 | |||
30 | static mut STATIC_MUT: i32 = 0; | ||
31 | |||
20 | fn foo<'a, T>() -> T { | 32 | fn foo<'a, T>() -> T { |
21 | foo::<'a, i32>() | 33 | foo::<'a, i32>() |
22 | } | 34 | } |
@@ -40,7 +52,14 @@ fn main() { | |||
40 | let x = 92; | 52 | let x = 92; |
41 | vec.push(Foo { x, y: 1 }); | 53 | vec.push(Foo { x, y: 1 }); |
42 | } | 54 | } |
43 | unsafe { vec.set_len(0); } | 55 | unsafe { |
56 | vec.set_len(0); | ||
57 | STATIC_MUT = 1; | ||
58 | } | ||
59 | |||
60 | for e in vec { | ||
61 | // Do nothing | ||
62 | } | ||
44 | 63 | ||
45 | let mut x = 42; | 64 | let mut x = 42; |
46 | let y = &mut x; | 65 | let y = &mut x; |