diff --git a/crates/hir/src/lib.rs b/crates/hir/src/lib.rs
index 800101c919..a7c42ca1e5 100644
--- a/crates/hir/src/lib.rs
+++ b/crates/hir/src/lib.rs
@@ -1085,6 +1085,10 @@ impl Trait {
pub fn is_auto(self, db: &dyn HirDatabase) -> bool {
db.trait_data(self.id).is_auto
}
+
+ pub fn is_unsafe(&self, db: &dyn HirDatabase) -> bool {
+ db.trait_data(self.id).is_unsafe
+ }
}
impl HasVisibility for Trait {
diff --git a/crates/ide/src/syntax_highlighting/highlight.rs b/crates/ide/src/syntax_highlighting/highlight.rs
index baed8e2170..058e37ff06 100644
--- a/crates/ide/src/syntax_highlighting/highlight.rs
+++ b/crates/ide/src/syntax_highlighting/highlight.rs
@@ -338,7 +338,14 @@ fn highlight_def(db: &RootDatabase, def: Definition) -> Highlight {
return h;
}
- hir::ModuleDef::Trait(_) => HlTag::Symbol(SymbolKind::Trait),
+ hir::ModuleDef::Trait(trait_) => {
+ let mut h = Highlight::new(HlTag::Symbol(SymbolKind::Trait));
+
+ if trait_.is_unsafe(db) {
+ h |= HlMod::Unsafe;
+ }
+ return h;
+ }
hir::ModuleDef::TypeAlias(type_) => {
let mut h = Highlight::new(HlTag::Symbol(SymbolKind::TypeAlias));
if let Some(item) = type_.as_assoc_item(db) {
diff --git a/crates/ide/src/syntax_highlighting/tags.rs b/crates/ide/src/syntax_highlighting/tags.rs
index f4a2e7506a..27473a2f96 100644
--- a/crates/ide/src/syntax_highlighting/tags.rs
+++ b/crates/ide/src/syntax_highlighting/tags.rs
@@ -68,7 +68,7 @@ pub enum HlMod {
/// Used with keywords like `async` and `await`.
Async,
// Keep this last!
- /// Used for unsafe functions, mutable statics, union accesses and unsafe operations.
+ /// Used for unsafe functions, unsafe traits, mutable statics, union accesses and unsafe operations.
Unsafe,
}
diff --git a/crates/ide/src/syntax_highlighting/test_data/highlighting.html b/crates/ide/src/syntax_highlighting/test_data/highlighting.html
index 0d325f3f3d..878431b56a 100644
--- a/crates/ide/src/syntax_highlighting/test_data/highlighting.html
+++ b/crates/ide/src/syntax_highlighting/test_data/highlighting.html
@@ -245,4 +245,7 @@ pre { color: #DCDCCC; background: #3F3F3F; font-size: 22px; padd
let f1 = learn_and_sing();
let f2 = dance();
futures::join!(f1, f2);
-}
\ No newline at end of file
+}
+
+unsafe trait Dangerous {}
+impl Dangerous for () {}
\ No newline at end of file
diff --git a/crates/ide/src/syntax_highlighting/tests.rs b/crates/ide/src/syntax_highlighting/tests.rs
index 8c8878d367..9ce26e930e 100644
--- a/crates/ide/src/syntax_highlighting/tests.rs
+++ b/crates/ide/src/syntax_highlighting/tests.rs
@@ -219,6 +219,9 @@ async fn async_main() {
let f2 = dance();
futures::join!(f1, f2);
}
+
+unsafe trait Dangerous {}
+impl Dangerous for () {}
"#
.trim(),
expect_file!["./test_data/highlighting.html"],