aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbors[bot] <26634292+bors[bot]@users.noreply.github.com>2020-07-15 11:00:10 +0100
committerGitHub <[email protected]>2020-07-15 11:00:10 +0100
commit6f3c8dc11d477a6d680ce018e93f007c31499bd5 (patch)
treeca759aa18be3bb4d30e42ae6e11e14dd673bfe1f
parentb8b41c5f41a0cf8bf9c15a3bbcdd8d626eb41772 (diff)
parent91b35d882776d7ae8891b3aecf9879164ef183b5 (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]>
-rw-r--r--crates/ra_ide/src/syntax_highlighting.rs27
-rw-r--r--crates/ra_ide/src/syntax_highlighting/tests.rs10
-rw-r--r--crates/ra_ide/test_data/highlighting.html10
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
595fn is_child_of_impl(element: SyntaxElement) -> bool { 616fn 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
28impl Foo {
29 fn baz(mut self) -> i32 {
30 self.x
31 }
32
33 fn qux(&mut self) {
34 self.x = 0;
35 }
36}
37
28static mut STATIC_MUT: i32 = 0; 38static mut STATIC_MUT: i32 = 0;
29 39
30fn foo<'a, T>() -> T { 40fn 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>) -&gt; <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>&lt;<span class="lifetime declaration">'a</span>, <span class="type_param declaration">T</span>&gt;() -&gt; <span class="type_param">T</span> { 66<span class="keyword">fn</span> <span class="function declaration">foo</span>&lt;<span class="lifetime declaration">'a</span>, <span class="type_param declaration">T</span>&gt;() -&gt; <span class="type_param">T</span> {