Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/ide/src/syntax_highlighting/highlight.rs')
-rw-r--r--crates/ide/src/syntax_highlighting/highlight.rs105
1 files changed, 70 insertions, 35 deletions
diff --git a/crates/ide/src/syntax_highlighting/highlight.rs b/crates/ide/src/syntax_highlighting/highlight.rs
index 829d1279a8..33df4a8a13 100644
--- a/crates/ide/src/syntax_highlighting/highlight.rs
+++ b/crates/ide/src/syntax_highlighting/highlight.rs
@@ -3,7 +3,7 @@
use std::ops::ControlFlow;
use either::Either;
-use hir::{AsAssocItem, HasVisibility, Semantics};
+use hir::{AsAssocItem, HasAttrs, HasVisibility, Semantics, sym};
use ide_db::{
FxHashMap, RootDatabase, SymbolKind,
defs::{Definition, IdentClass, NameClass, NameRefClass},
@@ -413,6 +413,10 @@ fn highlight_name_ref(
if is_from_builtin_crate {
h |= HlMod::DefaultLibrary;
}
+ let is_deprecated = resolved_krate.attrs(sema.db).by_key(sym::deprecated).exists();
+ if is_deprecated {
+ h |= HlMod::Deprecated;
+ }
h |= HlMod::CrateRoot;
h
}
@@ -483,20 +487,25 @@ pub(super) fn highlight_def(
is_ref: bool,
) -> Highlight {
let db = sema.db;
- let mut h = match def {
- Definition::Macro(m) => Highlight::new(HlTag::Symbol(m.kind(sema.db).into())),
- Definition::Field(_) | Definition::TupleField(_) => {
- Highlight::new(HlTag::Symbol(SymbolKind::Field))
+ let (mut h, attrs) = match def {
+ Definition::Macro(m) => {
+ (Highlight::new(HlTag::Symbol(m.kind(sema.db).into())), Some(m.attrs(sema.db)))
}
- Definition::Crate(_) => {
- Highlight::new(HlTag::Symbol(SymbolKind::Module)) | HlMod::CrateRoot
+ Definition::Field(field) => {
+ (Highlight::new(HlTag::Symbol(SymbolKind::Field)), Some(field.attrs(sema.db)))
}
+ Definition::TupleField(_) => (Highlight::new(HlTag::Symbol(SymbolKind::Field)), None),
+ Definition::Crate(krate) => (
+ Highlight::new(HlTag::Symbol(SymbolKind::Module)) | HlMod::CrateRoot,
+ Some(krate.attrs(sema.db)),
+ ),
Definition::Module(module) => {
let mut h = Highlight::new(HlTag::Symbol(SymbolKind::Module));
if module.is_crate_root() {
h |= HlMod::CrateRoot;
}
- h
+
+ (h, Some(module.attrs(sema.db)))
}
Definition::Function(func) => {
let mut h = Highlight::new(HlTag::Symbol(SymbolKind::Function));
@@ -544,7 +553,7 @@ pub(super) fn highlight_def(
h |= HlMod::Const;
}
- h
+ (h, Some(func.attrs(sema.db)))
}
Definition::Adt(adt) => {
let h = match adt {
@@ -553,9 +562,11 @@ pub(super) fn highlight_def(
hir::Adt::Union(_) => HlTag::Symbol(SymbolKind::Union),
};
- Highlight::new(h)
+ (Highlight::new(h), Some(adt.attrs(sema.db)))
+ }
+ Definition::Variant(variant) => {
+ (Highlight::new(HlTag::Symbol(SymbolKind::Variant)), Some(variant.attrs(sema.db)))
}
- Definition::Variant(_) => Highlight::new(HlTag::Symbol(SymbolKind::Variant)),
Definition::Const(konst) => {
let mut h = Highlight::new(HlTag::Symbol(SymbolKind::Const)) | HlMod::Const;
if let Some(item) = konst.as_assoc_item(db) {
@@ -573,9 +584,11 @@ pub(super) fn highlight_def(
}
}
- h
+ (h, Some(konst.attrs(sema.db)))
+ }
+ Definition::Trait(trait_) => {
+ (Highlight::new(HlTag::Symbol(SymbolKind::Trait)), Some(trait_.attrs(sema.db)))
}
- Definition::Trait(_) => Highlight::new(HlTag::Symbol(SymbolKind::Trait)),
Definition::TypeAlias(type_) => {
let mut h = Highlight::new(HlTag::Symbol(SymbolKind::TypeAlias));
@@ -594,10 +607,12 @@ pub(super) fn highlight_def(
}
}
- h
+ (h, Some(type_.attrs(sema.db)))
+ }
+ Definition::BuiltinType(_) => (Highlight::new(HlTag::BuiltinType), None),
+ Definition::BuiltinLifetime(_) => {
+ (Highlight::new(HlTag::Symbol(SymbolKind::LifetimeParam)), None)
}
- Definition::BuiltinType(_) => Highlight::new(HlTag::BuiltinType),
- Definition::BuiltinLifetime(_) => Highlight::new(HlTag::Symbol(SymbolKind::LifetimeParam)),
Definition::Static(s) => {
let mut h = Highlight::new(HlTag::Symbol(SymbolKind::Static));
@@ -608,18 +623,23 @@ pub(super) fn highlight_def(
}
}
- h
+ (h, Some(s.attrs(sema.db)))
}
- Definition::SelfType(_) => Highlight::new(HlTag::Symbol(SymbolKind::Impl)),
- Definition::GenericParam(it) => match it {
- hir::GenericParam::TypeParam(_) => Highlight::new(HlTag::Symbol(SymbolKind::TypeParam)),
- hir::GenericParam::ConstParam(_) => {
- Highlight::new(HlTag::Symbol(SymbolKind::ConstParam)) | HlMod::Const
- }
- hir::GenericParam::LifetimeParam(_) => {
- Highlight::new(HlTag::Symbol(SymbolKind::LifetimeParam))
- }
- },
+ Definition::SelfType(_) => (Highlight::new(HlTag::Symbol(SymbolKind::Impl)), None),
+ Definition::GenericParam(it) => (
+ match it {
+ hir::GenericParam::TypeParam(_) => {
+ Highlight::new(HlTag::Symbol(SymbolKind::TypeParam))
+ }
+ hir::GenericParam::ConstParam(_) => {
+ Highlight::new(HlTag::Symbol(SymbolKind::ConstParam)) | HlMod::Const
+ }
+ hir::GenericParam::LifetimeParam(_) => {
+ Highlight::new(HlTag::Symbol(SymbolKind::LifetimeParam))
+ }
+ },
+ None,
+ ),
Definition::Local(local) => {
let tag = if local.is_self(db) {
HlTag::Symbol(SymbolKind::SelfParam)
@@ -639,7 +659,7 @@ pub(super) fn highlight_def(
if ty.as_callable(db).is_some() || ty.impls_fnonce(db) {
h |= HlMod::Callable;
}
- h
+ (h, None)
}
Definition::ExternCrateDecl(extern_crate) => {
let mut highlight =
@@ -647,16 +667,20 @@ pub(super) fn highlight_def(
if extern_crate.alias(db).is_none() {
highlight |= HlMod::Library;
}
- highlight
+ (highlight, Some(extern_crate.attrs(sema.db)))
+ }
+ Definition::Label(_) => (Highlight::new(HlTag::Symbol(SymbolKind::Label)), None),
+ Definition::BuiltinAttr(_) => {
+ (Highlight::new(HlTag::Symbol(SymbolKind::BuiltinAttr)), None)
+ }
+ Definition::ToolModule(_) => (Highlight::new(HlTag::Symbol(SymbolKind::ToolModule)), None),
+ Definition::DeriveHelper(_) => {
+ (Highlight::new(HlTag::Symbol(SymbolKind::DeriveHelper)), None)
}
- Definition::Label(_) => Highlight::new(HlTag::Symbol(SymbolKind::Label)),
- Definition::BuiltinAttr(_) => Highlight::new(HlTag::Symbol(SymbolKind::BuiltinAttr)),
- Definition::ToolModule(_) => Highlight::new(HlTag::Symbol(SymbolKind::ToolModule)),
- Definition::DeriveHelper(_) => Highlight::new(HlTag::Symbol(SymbolKind::DeriveHelper)),
Definition::InlineAsmRegOrRegClass(_) => {
- Highlight::new(HlTag::Symbol(SymbolKind::InlineAsmRegOrRegClass))
+ (Highlight::new(HlTag::Symbol(SymbolKind::InlineAsmRegOrRegClass)), None)
}
- Definition::InlineAsmOperand(_) => Highlight::new(HlTag::Symbol(SymbolKind::Local)),
+ Definition::InlineAsmOperand(_) => (Highlight::new(HlTag::Symbol(SymbolKind::Local)), None),
};
let def_crate = def.krate(db);
@@ -676,6 +700,12 @@ pub(super) fn highlight_def(
h |= HlMod::DefaultLibrary;
}
+ if let Some(attrs) = attrs
+ && attrs.by_key(sym::deprecated).exists()
+ {
+ h |= HlMod::Deprecated;
+ }
+
h
}
@@ -721,6 +751,7 @@ fn highlight_method_call(
let is_from_other_crate = krate.as_ref().map_or(false, |krate| def_crate != *krate);
let is_from_builtin_crate = def_crate.is_builtin(sema.db);
let is_public = func.visibility(sema.db) == hir::Visibility::Public;
+ let is_deprecated = func.attrs(sema.db).by_key(sym::deprecated).exists();
if is_from_other_crate {
h |= HlMod::Library;
@@ -732,6 +763,10 @@ fn highlight_method_call(
h |= HlMod::DefaultLibrary;
}
+ if is_deprecated {
+ h |= HlMod::Deprecated;
+ }
+
if let Some(self_param) = func.self_param(sema.db) {
match self_param.access(sema.db) {
hir::Access::Shared => h |= HlMod::Reference,