diff options
author | bors[bot] <26634292+bors[bot]@users.noreply.github.com> | 2020-07-15 11:00:10 +0100 |
---|---|---|
committer | GitHub <[email protected]> | 2020-07-15 11:00:10 +0100 |
commit | 6f3c8dc11d477a6d680ce018e93f007c31499bd5 (patch) | |
tree | ca759aa18be3bb4d30e42ae6e11e14dd673bfe1f /crates | |
parent | b8b41c5f41a0cf8bf9c15a3bbcdd8d626eb41772 (diff) | |
parent | 91b35d882776d7ae8891b3aecf9879164ef183b5 (diff) |
Merge #5345
5345: Semantic Highlighting: Emit mutable modifier for 'self' when applicable r=matklad a=Veykril
This PR implements emitting the mutable modifier for the self keyword when applicable for semantic highlighting as mentioned in #5041. The rendered highlighting test html file:
![firefox_5lbsFNBqsT](https://user-images.githubusercontent.com/3757771/87346245-a5a07280-c551-11ea-9051-e5901255f8c9.png)
As you can see it does not emit the modifier when `self` is not used in a mutable context even if it is declared mutably in the enclosing function. I'm not sure if this is actually something wanted or not.
Co-authored-by: Lukas Wirth <[email protected]>
Diffstat (limited to 'crates')
-rw-r--r-- | crates/ra_ide/src/syntax_highlighting.rs | 27 | ||||
-rw-r--r-- | crates/ra_ide/src/syntax_highlighting/tests.rs | 10 | ||||
-rw-r--r-- | crates/ra_ide/test_data/highlighting.html | 10 |
3 files changed, 44 insertions, 3 deletions
diff --git a/crates/ra_ide/src/syntax_highlighting.rs b/crates/ra_ide/src/syntax_highlighting.rs index 5bb6f9642..b3236e821 100644 --- a/crates/ra_ide/src/syntax_highlighting.rs +++ b/crates/ra_ide/src/syntax_highlighting.rs | |||
@@ -566,10 +566,31 @@ fn highlight_element( | |||
566 | | T![return] | 566 | | T![return] |
567 | | T![while] | 567 | | T![while] |
568 | | T![in] => h | HighlightModifier::ControlFlow, | 568 | | T![in] => h | HighlightModifier::ControlFlow, |
569 | T![for] if !is_child_of_impl(element) => h | HighlightModifier::ControlFlow, | 569 | T![for] if !is_child_of_impl(&element) => h | HighlightModifier::ControlFlow, |
570 | T![unsafe] => h | HighlightModifier::Unsafe, | 570 | T![unsafe] => h | HighlightModifier::Unsafe, |
571 | T![true] | T![false] => HighlightTag::BoolLiteral.into(), | 571 | T![true] | T![false] => HighlightTag::BoolLiteral.into(), |
572 | T![self] => HighlightTag::SelfKeyword.into(), | 572 | T![self] => { |
573 | let self_param_is_mut = element | ||
574 | .parent() | ||
575 | .and_then(ast::SelfParam::cast) | ||
576 | .and_then(|p| p.mut_token()) | ||
577 | .is_some(); | ||
578 | // closure to enforce lazyness | ||
579 | let self_path = || { | ||
580 | sema.resolve_path(&element.parent()?.parent().and_then(ast::Path::cast)?) | ||
581 | }; | ||
582 | if self_param_is_mut | ||
583 | || matches!(self_path(), | ||
584 | Some(hir::PathResolution::Local(local)) | ||
585 | if local.is_self(db) | ||
586 | && (local.is_mut(db) || local.ty(db).is_mutable_reference()) | ||
587 | ) | ||
588 | { | ||
589 | HighlightTag::SelfKeyword | HighlightModifier::Mutable | ||
590 | } else { | ||
591 | HighlightTag::SelfKeyword.into() | ||
592 | } | ||
593 | } | ||
573 | _ => h, | 594 | _ => h, |
574 | } | 595 | } |
575 | } | 596 | } |
@@ -592,7 +613,7 @@ fn highlight_element( | |||
592 | } | 613 | } |
593 | } | 614 | } |
594 | 615 | ||
595 | fn is_child_of_impl(element: SyntaxElement) -> bool { | 616 | fn is_child_of_impl(element: &SyntaxElement) -> bool { |
596 | match element.parent() { | 617 | match element.parent() { |
597 | Some(e) => e.kind() == IMPL_DEF, | 618 | Some(e) => e.kind() == IMPL_DEF, |
598 | _ => false, | 619 | _ => false, |
diff --git a/crates/ra_ide/src/syntax_highlighting/tests.rs b/crates/ra_ide/src/syntax_highlighting/tests.rs index aa7c887d6..87a6e2523 100644 --- a/crates/ra_ide/src/syntax_highlighting/tests.rs +++ b/crates/ra_ide/src/syntax_highlighting/tests.rs | |||
@@ -25,6 +25,16 @@ impl Bar for Foo { | |||
25 | } | 25 | } |
26 | } | 26 | } |
27 | 27 | ||
28 | impl Foo { | ||
29 | fn baz(mut self) -> i32 { | ||
30 | self.x | ||
31 | } | ||
32 | |||
33 | fn qux(&mut self) { | ||
34 | self.x = 0; | ||
35 | } | ||
36 | } | ||
37 | |||
28 | static mut STATIC_MUT: i32 = 0; | 38 | static mut STATIC_MUT: i32 = 0; |
29 | 39 | ||
30 | fn foo<'a, T>() -> T { | 40 | fn foo<'a, T>() -> T { |
diff --git a/crates/ra_ide/test_data/highlighting.html b/crates/ra_ide/test_data/highlighting.html index 134743c72..553811a2f 100644 --- a/crates/ra_ide/test_data/highlighting.html +++ b/crates/ra_ide/test_data/highlighting.html | |||
@@ -51,6 +51,16 @@ pre { color: #DCDCCC; background: #3F3F3F; font-size: 22px; padd | |||
51 | } | 51 | } |
52 | } | 52 | } |
53 | 53 | ||
54 | <span class="keyword">impl</span> <span class="struct">Foo</span> { | ||
55 | <span class="keyword">fn</span> <span class="function declaration">baz</span>(<span class="keyword">mut</span> <span class="self_keyword mutable">self</span>) -> <span class="builtin_type">i32</span> { | ||
56 | <span class="self_keyword">self</span>.<span class="field">x</span> | ||
57 | } | ||
58 | |||
59 | <span class="keyword">fn</span> <span class="function declaration">qux</span>(&<span class="keyword">mut</span> <span class="self_keyword mutable">self</span>) { | ||
60 | <span class="self_keyword mutable">self</span>.<span class="field">x</span> = <span class="numeric_literal">0</span>; | ||
61 | } | ||
62 | } | ||
63 | |||
54 | <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>; | 64 | <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>; |
55 | 65 | ||
56 | <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> { | 66 | <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> { |