diff options
author | Lukas Wirth <[email protected]> | 2020-07-13 20:39:01 +0100 |
---|---|---|
committer | Lukas Wirth <[email protected]> | 2020-07-13 20:39:01 +0100 |
commit | 91b35d882776d7ae8891b3aecf9879164ef183b5 (patch) | |
tree | 54ee29e69913743b4f31f2b4d3eb4fb6c6463721 /crates/ra_ide/src | |
parent | 853440775d72974585ca3fe39f9688a4d4302dd3 (diff) |
Semantic Highlighting: Emit mutable modifier for 'self' when applicable
Diffstat (limited to 'crates/ra_ide/src')
-rw-r--r-- | crates/ra_ide/src/syntax_highlighting.rs | 27 | ||||
-rw-r--r-- | crates/ra_ide/src/syntax_highlighting/tests.rs | 10 |
2 files changed, 34 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 { |