From 1bbef5af85f47a1c8a4dc0d98c8c76bdeb1359af Mon Sep 17 00:00:00 2001 From: Lukas Wirth Date: Mon, 21 Feb 2022 13:21:25 +0100 Subject: [PATCH] Fix syntax highlighting not highlighting derives anymore --- crates/hir/src/semantics.rs | 10 ++++++++++ crates/hir/src/semantics/source_to_def.rs | 3 +++ crates/hir_def/src/dyn_map.rs | 8 ++++++++ crates/hir_def/src/keys.rs | 3 +++ crates/ide/src/syntax_highlighting.rs | 14 ++++++++++++++ 5 files changed, 38 insertions(+) diff --git a/crates/hir/src/semantics.rs b/crates/hir/src/semantics.rs index 1156dfe98e1..2e519158162 100644 --- a/crates/hir/src/semantics.rs +++ b/crates/hir/src/semantics.rs @@ -160,6 +160,10 @@ pub fn is_attr_macro_call(&self, item: &ast::Item) -> bool { self.imp.is_attr_macro_call(item) } + pub fn is_derive_annotated(&self, item: &ast::Adt) -> bool { + self.imp.is_derive_annotated(item) + } + pub fn speculative_expand( &self, actual_macro_call: &ast::MacroCall, @@ -470,6 +474,12 @@ fn derive_macro_calls(&self, attr: &ast::Attr) -> Option }) } + fn is_derive_annotated(&self, adt: &ast::Adt) -> bool { + let file_id = self.find_file(adt.syntax()).file_id; + let adt = InFile::new(file_id, adt); + self.with_ctx(|ctx| ctx.has_derives(adt)) + } + fn is_attr_macro_call(&self, item: &ast::Item) -> bool { let file_id = self.find_file(item.syntax()).file_id; let src = InFile::new(file_id, item.clone()); diff --git a/crates/hir/src/semantics/source_to_def.rs b/crates/hir/src/semantics/source_to_def.rs index c0d8e69e492..dddb8e33dcc 100644 --- a/crates/hir/src/semantics/source_to_def.rs +++ b/crates/hir/src/semantics/source_to_def.rs @@ -255,6 +255,9 @@ pub(super) fn attr_to_derive_macro_call( .get(&src.value) .map(|&(attr_id, call_id, ref ids)| (attr_id, call_id, &**ids)) } + pub(super) fn has_derives(&mut self, adt: InFile<&ast::Adt>) -> bool { + self.dyn_map(adt).as_ref().map_or(false, |map| !map[keys::DERIVE_MACRO_CALL].is_empty()) + } fn to_def( &mut self, diff --git a/crates/hir_def/src/dyn_map.rs b/crates/hir_def/src/dyn_map.rs index 6f269d7b01f..166aa04da04 100644 --- a/crates/hir_def/src/dyn_map.rs +++ b/crates/hir_def/src/dyn_map.rs @@ -54,6 +54,7 @@ pub trait Policy { fn insert(map: &mut DynMap, key: Self::K, value: Self::V); fn get<'a>(map: &'a DynMap, key: &Self::K) -> Option<&'a Self::V>; + fn is_empty(map: &DynMap) -> bool; } impl Policy for (K, V) { @@ -65,6 +66,9 @@ fn insert(map: &mut DynMap, key: K, value: V) { fn get<'a>(map: &'a DynMap, key: &K) -> Option<&'a V> { map.map.get::>()?.get(key) } + fn is_empty(map: &DynMap) -> bool { + map.map.get::>().map_or(true, |it| it.is_empty()) + } } pub struct DynMap { @@ -90,6 +94,10 @@ pub fn insert(&mut self, key: P::K, value: P::V) { pub fn get(&self, key: &P::K) -> Option<&P::V> { P::get(&self.map, key) } + + pub fn is_empty(&self) -> bool { + P::is_empty(&self.map) + } } impl Index> for DynMap { diff --git a/crates/hir_def/src/keys.rs b/crates/hir_def/src/keys.rs index 1c9d99eb788..8cd2d771721 100644 --- a/crates/hir_def/src/keys.rs +++ b/crates/hir_def/src/keys.rs @@ -61,4 +61,7 @@ fn get<'a>(map: &'a DynMap, key: &AST) -> Option<&'a ID> { let key = AstPtr::new(key); map.map.get::, ID>>()?.get(&key) } + fn is_empty(map: &DynMap) -> bool { + map.map.get::, ID>>().map_or(true, |it| it.is_empty()) + } } diff --git a/crates/ide/src/syntax_highlighting.rs b/crates/ide/src/syntax_highlighting.rs index d67f6baff07..7d92c5051b1 100644 --- a/crates/ide/src/syntax_highlighting.rs +++ b/crates/ide/src/syntax_highlighting.rs @@ -237,6 +237,20 @@ fn traverse( continue; } Some(item) if sema.is_attr_macro_call(&item) => current_attr_call = Some(item), + Some(item) if current_attr_call.is_none() => { + let adt = match item { + ast::Item::Enum(it) => Some(ast::Adt::Enum(it)), + ast::Item::Struct(it) => Some(ast::Adt::Struct(it)), + ast::Item::Union(it) => Some(ast::Adt::Union(it)), + _ => None, + }; + match adt { + Some(adt) if sema.is_derive_annotated(&adt) => { + current_attr_call = Some(adt.into()); + } + _ => (), + } + } None if ast::Attr::can_cast(node.kind()) => inside_attribute = true, _ => (), }, -- 2.44.0