diff --git a/crates/ide/src/syntax_highlighting/highlight.rs b/crates/ide/src/syntax_highlighting/highlight.rs
index b0cfdd8b7dc5..5ccb84714961 100644
--- a/crates/ide/src/syntax_highlighting/highlight.rs
+++ b/crates/ide/src/syntax_highlighting/highlight.rs
@@ -1,6 +1,6 @@
//! Computes color for a single element.
-use hir::{AsAssocItem, Semantics, VariantDef};
+use hir::{AsAssocItem, AssocItemContainer, Semantics, VariantDef};
use ide_db::{
defs::{Definition, NameClass, NameRefClass},
RootDatabase, SymbolKind,
@@ -275,12 +275,24 @@ fn highlight_def(db: &RootDatabase, def: Definition) -> Highlight {
hir::ModuleDef::Module(_) => HlTag::Symbol(SymbolKind::Module),
hir::ModuleDef::Function(func) => {
let mut h = Highlight::new(HlTag::Symbol(SymbolKind::Function));
- if func.as_assoc_item(db).is_some() {
+ if let Some(item) = func.as_assoc_item(db) {
h |= HlMod::Associated;
if func.self_param(db).is_none() {
h |= HlMod::Static
}
+
+ match item.container(db) {
+ AssocItemContainer::Impl(i) => {
+ if i.trait_(db).is_some() {
+ h |= HlMod::Trait;
+ }
+ }
+ AssocItemContainer::Trait(_t) => {
+ h |= HlMod::Trait;
+ }
+ }
}
+
if func.is_unsafe(db) {
h |= HlMod::Unsafe;
}
@@ -292,9 +304,20 @@ fn highlight_def(db: &RootDatabase, def: Definition) -> Highlight {
hir::ModuleDef::Variant(_) => HlTag::Symbol(SymbolKind::Variant),
hir::ModuleDef::Const(konst) => {
let mut h = Highlight::new(HlTag::Symbol(SymbolKind::Const));
- if konst.as_assoc_item(db).is_some() {
- h |= HlMod::Associated
+ if let Some(item) = konst.as_assoc_item(db) {
+ h |= HlMod::Associated;
+ match item.container(db) {
+ AssocItemContainer::Impl(i) => {
+ if i.trait_(db).is_some() {
+ h |= HlMod::Trait;
+ }
+ }
+ AssocItemContainer::Trait(_t) => {
+ h |= HlMod::Trait;
+ }
+ }
}
+
return h;
}
hir::ModuleDef::Trait(_) => HlTag::Symbol(SymbolKind::Trait),
@@ -362,6 +385,10 @@ fn highlight_method_call(
if func.is_unsafe(sema.db) || sema.is_unsafe_method_call(&method_call) {
h |= HlMod::Unsafe;
}
+ if func.as_assoc_item(sema.db).and_then(|it| it.containing_trait(sema.db)).is_some() {
+ h |= HlMod::Trait
+ }
+
if let Some(self_param) = func.self_param(sema.db) {
match self_param.access(sema.db) {
hir::Access::Shared => (),
diff --git a/crates/ide/src/syntax_highlighting/tags.rs b/crates/ide/src/syntax_highlighting/tags.rs
index 93db79b895dc..1cec991aa69f 100644
--- a/crates/ide/src/syntax_highlighting/tags.rs
+++ b/crates/ide/src/syntax_highlighting/tags.rs
@@ -58,6 +58,8 @@ pub enum HlMod {
Associated,
/// Used for intra doc links in doc injection.
IntraDocLink,
+ /// Used for items in traits and trait impls.
+ Trait,
/// Keep this last!
Unsafe,
@@ -158,6 +160,7 @@ impl HlMod {
HlMod::Callable,
HlMod::Static,
HlMod::Associated,
+ HlMod::Trait,
HlMod::Unsafe,
];
@@ -174,6 +177,7 @@ impl HlMod {
HlMod::IntraDocLink => "intra_doc_link",
HlMod::Mutable => "mutable",
HlMod::Static => "static",
+ HlMod::Trait => "trait",
HlMod::Unsafe => "unsafe",
}
}
diff --git a/crates/ide/src/syntax_highlighting/test_data/highlight_assoc_functions.html b/crates/ide/src/syntax_highlighting/test_data/highlight_assoc_functions.html
index 4635ea927606..8cde3906c3e3 100644
--- a/crates/ide/src/syntax_highlighting/test_data/highlight_assoc_functions.html
+++ b/crates/ide/src/syntax_highlighting/test_data/highlight_assoc_functions.html
@@ -47,12 +47,12 @@ pre { color: #DCDCCC; background: #3F3F3F; font-size: 22px; padd
}
trait t {
- fn t_is_static() {}
- fn t_is_not_static(&self) {}
+ fn t_is_static() {}
+ fn t_is_not_static(&self) {}
}
impl t for foo {
- pub fn is_static() {}
- pub fn is_not_static(&self) {}
+ pub fn is_static() {}
+ pub fn is_not_static(&self) {}
}
\ No newline at end of file
diff --git a/crates/ide/src/syntax_highlighting/test_data/highlight_injection.html b/crates/ide/src/syntax_highlighting/test_data/highlight_injection.html
index 9215ddd9e394..7c6694a27623 100644
--- a/crates/ide/src/syntax_highlighting/test_data/highlight_injection.html
+++ b/crates/ide/src/syntax_highlighting/test_data/highlight_injection.html
@@ -42,7 +42,7 @@ pre { color: #DCDCCC; background: #3F3F3F; font-size: 22px; padd
fn main() {
fixture(r#"
trait Foo {
- fn foo() {
+ fn foo() {
println!("2 + 2 = {}", 4);
}
}"#
diff --git a/crates/ide/src/syntax_highlighting/test_data/highlight_unsafe.html b/crates/ide/src/syntax_highlighting/test_data/highlight_unsafe.html
index 6a6555208cb5..72910421dc50 100644
--- a/crates/ide/src/syntax_highlighting/test_data/highlight_unsafe.html
+++ b/crates/ide/src/syntax_highlighting/test_data/highlight_unsafe.html
@@ -62,11 +62,11 @@ pre { color: #DCDCCC; background: #3F3F3F; font-size: 22px; padd
}
trait DoTheAutoref {
- fn calls_autoref(&self);
+ fn calls_autoref(&self);
}
impl DoTheAutoref for u16 {
- fn calls_autoref(&self) {}
+ fn calls_autoref(&self) {}
}
fn main() {
@@ -96,6 +96,6 @@ pre { color: #DCDCCC; background: #3F3F3F; font-size: 22px; padd
let Packed { a: ref _a } = packed;
- packed.a.calls_autoref();
+ packed.a.calls_autoref();
}
}
\ No newline at end of file
diff --git a/crates/ide/src/syntax_highlighting/test_data/highlighting.html b/crates/ide/src/syntax_highlighting/test_data/highlighting.html
index 1eaa7b75bce8..973173254c08 100644
--- a/crates/ide/src/syntax_highlighting/test_data/highlighting.html
+++ b/crates/ide/src/syntax_highlighting/test_data/highlighting.html
@@ -67,11 +67,11 @@ pre { color: #DCDCCC; background: #3F3F3F; font-size: 22px; padd
}
trait Bar {
- fn bar(&self) -> i32;
+ fn bar(&self) -> i32;
}
impl Bar for Foo {
- fn bar(&self) -> i32 {
+ fn bar(&self) -> i32 {
self.x
}
}
diff --git a/crates/rust-analyzer/src/semantic_tokens.rs b/crates/rust-analyzer/src/semantic_tokens.rs
index a3c5e9ccf447..2dc8a42f1ebd 100644
--- a/crates/rust-analyzer/src/semantic_tokens.rs
+++ b/crates/rust-analyzer/src/semantic_tokens.rs
@@ -88,6 +88,7 @@ define_semantic_token_modifiers![
(CONSUMING, "consuming"),
(UNSAFE, "unsafe"),
(ATTRIBUTE_MODIFIER, "attribute"),
+ (TRAIT_MODIFIER, "trait"),
(CALLABLE, "callable"),
(INTRA_DOC_LINK, "intraDocLink"),
];
diff --git a/crates/rust-analyzer/src/to_proto.rs b/crates/rust-analyzer/src/to_proto.rs
index e297a72e6493..c3820944bcb0 100644
--- a/crates/rust-analyzer/src/to_proto.rs
+++ b/crates/rust-analyzer/src/to_proto.rs
@@ -474,6 +474,7 @@ fn semantic_token_type_and_modifiers(
HlMod::Callable => semantic_tokens::CALLABLE,
HlMod::Static => lsp_types::SemanticTokenModifier::STATIC,
HlMod::IntraDocLink => semantic_tokens::INTRA_DOC_LINK,
+ HlMod::Trait => semantic_tokens::TRAIT_MODIFIER,
HlMod::Associated => continue,
};
mods |= modifier;