mirror of
https://github.com/rust-lang/rust-analyzer
synced 2025-01-13 05:38:46 +00:00
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 <lukastw97@gmail.com>
This commit is contained in:
commit
6f3c8dc11d
3 changed files with 44 additions and 3 deletions
|
@ -566,10 +566,31 @@ fn highlight_element(
|
|||
| T![return]
|
||||
| T![while]
|
||||
| T![in] => h | HighlightModifier::ControlFlow,
|
||||
T![for] if !is_child_of_impl(element) => h | HighlightModifier::ControlFlow,
|
||||
T![for] if !is_child_of_impl(&element) => h | HighlightModifier::ControlFlow,
|
||||
T![unsafe] => h | HighlightModifier::Unsafe,
|
||||
T![true] | T![false] => HighlightTag::BoolLiteral.into(),
|
||||
T![self] => HighlightTag::SelfKeyword.into(),
|
||||
T![self] => {
|
||||
let self_param_is_mut = element
|
||||
.parent()
|
||||
.and_then(ast::SelfParam::cast)
|
||||
.and_then(|p| p.mut_token())
|
||||
.is_some();
|
||||
// closure to enforce lazyness
|
||||
let self_path = || {
|
||||
sema.resolve_path(&element.parent()?.parent().and_then(ast::Path::cast)?)
|
||||
};
|
||||
if self_param_is_mut
|
||||
|| matches!(self_path(),
|
||||
Some(hir::PathResolution::Local(local))
|
||||
if local.is_self(db)
|
||||
&& (local.is_mut(db) || local.ty(db).is_mutable_reference())
|
||||
)
|
||||
{
|
||||
HighlightTag::SelfKeyword | HighlightModifier::Mutable
|
||||
} else {
|
||||
HighlightTag::SelfKeyword.into()
|
||||
}
|
||||
}
|
||||
_ => h,
|
||||
}
|
||||
}
|
||||
|
@ -592,7 +613,7 @@ fn highlight_element(
|
|||
}
|
||||
}
|
||||
|
||||
fn is_child_of_impl(element: SyntaxElement) -> bool {
|
||||
fn is_child_of_impl(element: &SyntaxElement) -> bool {
|
||||
match element.parent() {
|
||||
Some(e) => e.kind() == IMPL_DEF,
|
||||
_ => false,
|
||||
|
|
|
@ -25,6 +25,16 @@ impl Bar for Foo {
|
|||
}
|
||||
}
|
||||
|
||||
impl Foo {
|
||||
fn baz(mut self) -> i32 {
|
||||
self.x
|
||||
}
|
||||
|
||||
fn qux(&mut self) {
|
||||
self.x = 0;
|
||||
}
|
||||
}
|
||||
|
||||
static mut STATIC_MUT: i32 = 0;
|
||||
|
||||
fn foo<'a, T>() -> T {
|
||||
|
|
|
@ -51,6 +51,16 @@ pre { color: #DCDCCC; background: #3F3F3F; font-size: 22px; padd
|
|||
}
|
||||
}
|
||||
|
||||
<span class="keyword">impl</span> <span class="struct">Foo</span> {
|
||||
<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> {
|
||||
<span class="self_keyword">self</span>.<span class="field">x</span>
|
||||
}
|
||||
|
||||
<span class="keyword">fn</span> <span class="function declaration">qux</span>(&<span class="keyword">mut</span> <span class="self_keyword mutable">self</span>) {
|
||||
<span class="self_keyword mutable">self</span>.<span class="field">x</span> = <span class="numeric_literal">0</span>;
|
||||
}
|
||||
}
|
||||
|
||||
<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>;
|
||||
|
||||
<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> {
|
||||
|
|
Loading…
Reference in a new issue