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.rs | 44 |
1 files changed, 33 insertions, 11 deletions
diff --git a/crates/ide/src/syntax_highlighting/highlight.rs b/crates/ide/src/syntax_highlighting/highlight.rs index dba0636930..5113ab84d5 100644 --- a/crates/ide/src/syntax_highlighting/highlight.rs +++ b/crates/ide/src/syntax_highlighting/highlight.rs @@ -3,7 +3,7 @@ use hir::{AsAssocItem, HasVisibility, Semantics}; use ide_db::{ defs::{Definition, NameClass, NameRefClass}, - helpers::try_resolve_derive_input_at, + helpers::{try_resolve_derive_input_at, FamousDefs}, RootDatabase, SymbolKind, }; use rustc_hash::FxHashMap; @@ -25,7 +25,6 @@ pub(super) fn element( syntactic_name_ref_highlighting: bool, element: SyntaxElement, ) -> Option<(Highlight, Option<u64>)> { - let db = sema.db; let mut binding_hash = None; let highlight: Highlight = match element.kind() { FN => { @@ -79,10 +78,10 @@ pub(super) fn element( match NameClass::classify_lifetime(sema, &lifetime) { Some(NameClass::Definition(def)) => { - highlight_def(db, krate, def) | HlMod::Definition + highlight_def(sema, krate, def) | HlMod::Definition } None => match NameRefClass::classify_lifetime(sema, &lifetime) { - Some(NameRefClass::Definition(def)) => highlight_def(db, krate, def), + Some(NameRefClass::Definition(def)) => highlight_def(sema, krate, def), _ => SymbolKind::LifetimeParam.into(), }, _ => Highlight::from(SymbolKind::LifetimeParam) | HlMod::Definition, @@ -93,7 +92,7 @@ pub(super) fn element( element.ancestors().nth(2).and_then(ast::Attr::cast).zip(element.as_token()) { match try_resolve_derive_input_at(sema, &attr, token) { - Some(makro) => highlight_def(sema.db, krate, Definition::Macro(makro)), + Some(makro) => highlight_def(sema, krate, Definition::Macro(makro)), None => HlTag::None.into(), } } else { @@ -275,7 +274,7 @@ fn highlight_name_ref( } }; - let mut h = highlight_def(db, krate, def); + let mut h = highlight_def(sema, krate, def); match def { Definition::Local(local) @@ -334,7 +333,7 @@ fn highlight_name( }; match name_kind { Some(NameClass::Definition(def)) => { - let mut h = highlight_def(db, krate, def) | HlMod::Definition; + let mut h = highlight_def(sema, krate, def) | HlMod::Definition; if let Definition::ModuleDef(hir::ModuleDef::Trait(trait_)) = &def { if trait_.is_unsafe(db) { h |= HlMod::Unsafe; @@ -342,7 +341,7 @@ fn highlight_name( } h } - Some(NameClass::ConstReference(def)) => highlight_def(db, krate, def), + Some(NameClass::ConstReference(def)) => highlight_def(sema, krate, def), Some(NameClass::PatFieldShorthand { field_ref, .. }) => { let mut h = HlTag::Symbol(SymbolKind::Field).into(); if let hir::VariantDef::Union(_) = field_ref.parent_def(db) { @@ -366,7 +365,12 @@ fn calc_binding_hash(name: &hir::Name, shadow_count: u32) -> u64 { hash((name, shadow_count)) } -fn highlight_def(db: &RootDatabase, krate: Option<hir::Crate>, def: Definition) -> Highlight { +fn highlight_def( + sema: &Semantics<RootDatabase>, + krate: Option<hir::Crate>, + def: Definition, +) -> Highlight { + let db = sema.db; let mut h = match def { Definition::Macro(_) => Highlight::new(HlTag::Symbol(SymbolKind::Macro)), Definition::Field(_) => Highlight::new(HlTag::Symbol(SymbolKind::Field)), @@ -504,7 +508,14 @@ fn highlight_def(db: &RootDatabase, krate: Option<hir::Crate>, def: Definition) Definition::Label(_) => Highlight::new(HlTag::Symbol(SymbolKind::Label)), }; - let is_from_other_crate = def.module(db).map(hir::Module::krate) != krate; + let famous_defs = FamousDefs(&sema, krate); + let def_crate = def.module(db).map(hir::Module::krate).or_else(|| match def { + Definition::ModuleDef(hir::ModuleDef::Module(module)) => Some(module.krate()), + _ => None, + }); + let is_from_other_crate = def_crate != krate; + let is_from_builtin_crate = + def_crate.map_or(false, |def_crate| famous_defs.builtin_crates().any(|it| def_crate == it)); let is_builtin_type = matches!(def, Definition::ModuleDef(hir::ModuleDef::BuiltinType(_))); let is_public = def.visibility(db) == Some(hir::Visibility::Public); @@ -514,6 +525,10 @@ fn highlight_def(db: &RootDatabase, krate: Option<hir::Crate>, def: Definition) _ => {} } + if is_from_builtin_crate { + h |= HlMod::DefaultLibrary; + } + h } @@ -546,7 +561,10 @@ fn highlight_method_call( h |= HlMod::Trait; } - let is_from_other_crate = Some(func.module(sema.db).krate()) != krate; + let famous_defs = FamousDefs(&sema, krate); + let def_crate = func.module(sema.db).krate(); + let is_from_other_crate = Some(def_crate) != krate; + let is_from_builtin_crate = famous_defs.builtin_crates().any(|it| def_crate == it); let is_public = func.visibility(sema.db) == hir::Visibility::Public; if is_from_other_crate { @@ -555,6 +573,10 @@ fn highlight_method_call( h |= HlMod::Public; } + if is_from_builtin_crate { + h |= HlMod::DefaultLibrary; + } + if let Some(self_param) = func.self_param(sema.db) { match self_param.access(sema.db) { hir::Access::Shared => h |= HlMod::Reference, |