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"],