diff --git a/crates/ide/src/navigation_target.rs b/crates/ide/src/navigation_target.rs
index 49ff3625ca..d97e52200d 100644
--- a/crates/ide/src/navigation_target.rs
+++ b/crates/ide/src/navigation_target.rs
@@ -363,7 +363,13 @@ impl TryToNav for hir::MacroDef {
let mut res = NavigationTarget::from_named(
db,
src.as_ref().with_value(name_owner),
- SymbolKind::Macro,
+ match self.kind() {
+ hir::MacroKind::Declarative
+ | hir::MacroKind::BuiltIn
+ | hir::MacroKind::ProcMacro => SymbolKind::Macro,
+ hir::MacroKind::Derive => SymbolKind::Derive,
+ hir::MacroKind::Attr => SymbolKind::Attribute,
+ },
);
res.docs = self.docs(db);
Some(res)
diff --git a/crates/ide/src/syntax_highlighting/highlight.rs b/crates/ide/src/syntax_highlighting/highlight.rs
index 8481f41437..a5be905983 100644
--- a/crates/ide/src/syntax_highlighting/highlight.rs
+++ b/crates/ide/src/syntax_highlighting/highlight.rs
@@ -374,7 +374,13 @@ fn highlight_def(
) -> Highlight {
let db = sema.db;
let mut h = match def {
- Definition::Macro(_) => Highlight::new(HlTag::Symbol(SymbolKind::Macro)),
+ Definition::Macro(m) => Highlight::new(HlTag::Symbol(match m.kind() {
+ hir::MacroKind::Declarative | hir::MacroKind::BuiltIn | hir::MacroKind::ProcMacro => {
+ SymbolKind::Macro
+ }
+ hir::MacroKind::Derive => SymbolKind::Derive,
+ hir::MacroKind::Attr => SymbolKind::Attribute,
+ })),
Definition::Field(_) => Highlight::new(HlTag::Symbol(SymbolKind::Field)),
Definition::Module(module) => {
let mut h = Highlight::new(HlTag::Symbol(SymbolKind::Module));
diff --git a/crates/ide/src/syntax_highlighting/tags.rs b/crates/ide/src/syntax_highlighting/tags.rs
index 8c796a3bfb..7216eae0eb 100644
--- a/crates/ide/src/syntax_highlighting/tags.rs
+++ b/crates/ide/src/syntax_highlighting/tags.rs
@@ -128,6 +128,7 @@ impl HlTag {
SymbolKind::BuiltinAttr => "builtin_attr",
SymbolKind::Const => "constant",
SymbolKind::ConstParam => "const_param",
+ SymbolKind::Derive => "derive",
SymbolKind::Enum => "enum",
SymbolKind::Field => "field",
SymbolKind::Function => "function",
diff --git a/crates/ide/src/syntax_highlighting/test_data/highlighting.html b/crates/ide/src/syntax_highlighting/test_data/highlighting.html
index 8c9deac005..b0fbbfda2a 100644
--- a/crates/ide/src/syntax_highlighting/test_data/highlighting.html
+++ b/crates/ide/src/syntax_highlighting/test_data/highlighting.html
@@ -44,7 +44,7 @@ pre { color: #DCDCCC; background: #3F3F3F; font-size: 22px; padd
mod inner {}
#[allow()]
-#[proc_macros::identity]
+#[proc_macros::identity]
pub mod ops {
#[lang = "fn_once"]
pub trait FnOnce<Args> {}
@@ -87,7 +87,7 @@ proc_macros::mirror! {
}
}
-#[derive(Copy)]
+#[derive(Copy)]
struct FooCopy {
x: u32,
}
diff --git a/crates/ide_completion/src/completions/attribute/cfg.rs b/crates/ide_completion/src/completions/attribute/cfg.rs
index d1a4722b30..e53bf49174 100644
--- a/crates/ide_completion/src/completions/attribute/cfg.rs
+++ b/crates/ide_completion/src/completions/attribute/cfg.rs
@@ -9,7 +9,7 @@ use crate::{completions::Completions, context::CompletionContext, CompletionItem
pub(crate) fn complete_cfg(acc: &mut Completions, ctx: &CompletionContext) {
let add_completion = |item: &str| {
- let mut completion = CompletionItem::new(SymbolKind::Attribute, ctx.source_range(), item);
+ let mut completion = CompletionItem::new(SymbolKind::BuiltinAttr, ctx.source_range(), item);
completion.insert_text(format!(r#""{}""#, item));
acc.add(completion.build());
};
@@ -32,7 +32,7 @@ pub(crate) fn complete_cfg(acc: &mut Completions, ctx: &CompletionContext) {
krate.potential_cfg(ctx.db).get_cfg_values(&name).cloned().for_each(|s| {
let insert_text = format!(r#""{}""#, s);
let mut item =
- CompletionItem::new(SymbolKind::Attribute, ctx.source_range(), s);
+ CompletionItem::new(SymbolKind::BuiltinAttr, ctx.source_range(), s);
item.insert_text(insert_text);
acc.add(item.build());
@@ -42,7 +42,7 @@ pub(crate) fn complete_cfg(acc: &mut Completions, ctx: &CompletionContext) {
None => {
if let Some(krate) = ctx.krate {
krate.potential_cfg(ctx.db).get_cfg_keys().cloned().for_each(|s| {
- let item = CompletionItem::new(SymbolKind::Attribute, ctx.source_range(), s);
+ let item = CompletionItem::new(SymbolKind::BuiltinAttr, ctx.source_range(), s);
acc.add(item.build());
})
}
diff --git a/crates/ide_completion/src/completions/attribute/derive.rs b/crates/ide_completion/src/completions/attribute/derive.rs
index b71ee21d3c..0daf114788 100644
--- a/crates/ide_completion/src/completions/attribute/derive.rs
+++ b/crates/ide_completion/src/completions/attribute/derive.rs
@@ -57,7 +57,7 @@ pub(super) fn complete_derive(
_ => (name, None),
};
- let mut item = CompletionItem::new(SymbolKind::Attribute, ctx.source_range(), label);
+ let mut item = CompletionItem::new(SymbolKind::Derive, ctx.source_range(), label);
if let Some(docs) = mac.docs(ctx.db) {
item.documentation(docs);
}
@@ -67,7 +67,7 @@ pub(super) fn complete_derive(
item.add_to(acc);
}
- flyimport_attribute(acc, ctx);
+ flyimport_derive(acc, ctx);
}
fn get_derives_in_scope(ctx: &CompletionContext) -> Vec<(hir::Name, MacroDef)> {
@@ -82,7 +82,7 @@ fn get_derives_in_scope(ctx: &CompletionContext) -> Vec<(hir::Name, MacroDef)> {
result
}
-fn flyimport_attribute(acc: &mut Completions, ctx: &CompletionContext) -> Option<()> {
+fn flyimport_derive(acc: &mut Completions, ctx: &CompletionContext) -> Option<()> {
if ctx.token.kind() != SyntaxKind::IDENT {
return None;
};
@@ -106,13 +106,14 @@ fn flyimport_attribute(acc: &mut Completions, ctx: &CompletionContext) -> Option
hir::ItemInNs::Macros(mac) => Some((import, mac)),
_ => None,
})
+ .filter(|&(_, mac)| mac.kind() == MacroKind::Derive)
.filter(|&(_, mac)| !ctx.is_item_hidden(&hir::ItemInNs::Macros(mac)))
.sorted_by_key(|(import, _)| {
compute_fuzzy_completion_order_key(&import.import_path, &user_input_lowercased)
})
.filter_map(|(import, mac)| {
let mut item = CompletionItem::new(
- SymbolKind::Attribute,
+ SymbolKind::Derive,
ctx.source_range(),
mac.name(ctx.db)?.to_smol_str(),
);
diff --git a/crates/ide_completion/src/completions/attribute/repr.rs b/crates/ide_completion/src/completions/attribute/repr.rs
index 4c4a37fb5e..805038091c 100644
--- a/crates/ide_completion/src/completions/attribute/repr.rs
+++ b/crates/ide_completion/src/completions/attribute/repr.rs
@@ -26,7 +26,7 @@ pub(super) fn complete_repr(acc: &mut Completions, ctx: &CompletionContext, inpu
continue;
}
- let mut item = CompletionItem::new(SymbolKind::Attribute, ctx.source_range(), label);
+ let mut item = CompletionItem::new(SymbolKind::BuiltinAttr, ctx.source_range(), label);
if let Some(lookup) = lookup {
item.lookup_by(lookup);
}
diff --git a/crates/ide_completion/src/item.rs b/crates/ide_completion/src/item.rs
index 7ff16adce1..4a6e034dc9 100644
--- a/crates/ide_completion/src/item.rs
+++ b/crates/ide_completion/src/item.rs
@@ -235,6 +235,7 @@ impl CompletionItemKind {
SymbolKind::BuiltinAttr => "ba",
SymbolKind::Const => "ct",
SymbolKind::ConstParam => "cp",
+ SymbolKind::Derive => "de",
SymbolKind::Enum => "en",
SymbolKind::Field => "fd",
SymbolKind::Function => "fn",
diff --git a/crates/ide_completion/src/tests/attribute.rs b/crates/ide_completion/src/tests/attribute.rs
index 45979d4828..8141fab299 100644
--- a/crates/ide_completion/src/tests/attribute.rs
+++ b/crates/ide_completion/src/tests/attribute.rs
@@ -560,9 +560,9 @@ mod cfg {
check(
r#"#[cfg(target_endian = $0"#,
expect![[r#"
- at little
- at big
-"#]],
+ ba little
+ ba big
+ "#]],
);
}
}
@@ -594,13 +594,13 @@ mod derive {
#[derive($0)] struct Test;
"#,
expect![[r#"
- at Default
- at Clone, Copy
- at PartialEq
- at PartialEq, Eq
- at PartialEq, Eq, PartialOrd, Ord
- at Clone
- at PartialEq, PartialOrd
+ de Default
+ de Clone, Copy
+ de PartialEq
+ de PartialEq, Eq
+ de PartialEq, Eq, PartialOrd, Ord
+ de Clone
+ de PartialEq, PartialOrd
"#]],
);
}
@@ -613,12 +613,12 @@ mod derive {
#[derive(serde::Serialize, PartialEq, $0)] struct Test;
"#,
expect![[r#"
- at Default
- at Clone, Copy
- at Eq
- at Eq, PartialOrd, Ord
- at Clone
- at PartialOrd
+ de Default
+ de Clone, Copy
+ de Eq
+ de Eq, PartialOrd, Ord
+ de Clone
+ de PartialOrd
"#]],
)
}
@@ -631,12 +631,12 @@ mod derive {
#[derive($0 serde::Serialize, PartialEq)] struct Test;
"#,
expect![[r#"
- at Default
- at Clone, Copy
- at Eq
- at Eq, PartialOrd, Ord
- at Clone
- at PartialOrd
+ de Default
+ de Clone, Copy
+ de Eq
+ de Eq, PartialOrd, Ord
+ de Clone
+ de PartialOrd
"#]],
)
}
@@ -649,7 +649,7 @@ mod derive {
#[derive(der$0)] struct Test;
"#,
expect![[r#"
- at DeriveIdentity (use proc_macros::DeriveIdentity)
+ de DeriveIdentity (use proc_macros::DeriveIdentity)
"#]],
);
check_derive(
@@ -659,7 +659,7 @@ use proc_macros::DeriveIdentity;
#[derive(der$0)] struct Test;
"#,
expect![[r#"
- at DeriveIdentity
+ de DeriveIdentity
"#]],
);
}
@@ -775,23 +775,23 @@ mod repr {
check_repr(
r#"#[repr($0)] struct Test;"#,
expect![[r#"
- at align($0)
- at packed
- at transparent
- at C
- at u8
- at u16
- at u32
- at u64
- at u128
- at usize
- at i8
- at i16
- at i32
- at i64
- at i28
- at isize
- "#]],
+ ba align($0)
+ ba packed
+ ba transparent
+ ba C
+ ba u8
+ ba u16
+ ba u32
+ ba u64
+ ba u128
+ ba usize
+ ba i8
+ ba i16
+ ba i32
+ ba i64
+ ba i28
+ ba isize
+ "#]],
);
}
@@ -805,21 +805,21 @@ mod repr {
check_repr(
r#"#[repr(align(1), $0)] struct Test;"#,
expect![[r#"
- at transparent
- at C
- at u8
- at u16
- at u32
- at u64
- at u128
- at usize
- at i8
- at i16
- at i32
- at i64
- at i28
- at isize
- "#]],
+ ba transparent
+ ba C
+ ba u8
+ ba u16
+ ba u32
+ ba u64
+ ba u128
+ ba usize
+ ba i8
+ ba i16
+ ba i32
+ ba i64
+ ba i28
+ ba isize
+ "#]],
);
}
@@ -828,21 +828,21 @@ mod repr {
check_repr(
r#"#[repr(packed, $0)] struct Test;"#,
expect![[r#"
- at transparent
- at C
- at u8
- at u16
- at u32
- at u64
- at u128
- at usize
- at i8
- at i16
- at i32
- at i64
- at i28
- at isize
- "#]],
+ ba transparent
+ ba C
+ ba u8
+ ba u16
+ ba u32
+ ba u64
+ ba u128
+ ba usize
+ ba i8
+ ba i16
+ ba i32
+ ba i64
+ ba i28
+ ba isize
+ "#]],
);
}
@@ -851,21 +851,21 @@ mod repr {
check_repr(
r#"#[repr(C, $0)] struct Test;"#,
expect![[r#"
- at align($0)
- at packed
- at u8
- at u16
- at u32
- at u64
- at u128
- at usize
- at i8
- at i16
- at i32
- at i64
- at i28
- at isize
- "#]],
+ ba align($0)
+ ba packed
+ ba u8
+ ba u16
+ ba u32
+ ba u64
+ ba u128
+ ba usize
+ ba i8
+ ba i16
+ ba i32
+ ba i64
+ ba i28
+ ba isize
+ "#]],
);
}
@@ -874,10 +874,10 @@ mod repr {
check_repr(
r#"#[repr(usize, $0)] struct Test;"#,
expect![[r#"
- at align($0)
- at packed
- at C
- "#]],
+ ba align($0)
+ ba packed
+ ba C
+ "#]],
);
}
}
diff --git a/crates/ide_db/src/lib.rs b/crates/ide_db/src/lib.rs
index 99b64821fc..0d14c176b5 100644
--- a/crates/ide_db/src/lib.rs
+++ b/crates/ide_db/src/lib.rs
@@ -149,6 +149,7 @@ pub enum SymbolKind {
BuiltinAttr,
Const,
ConstParam,
+ Derive,
Enum,
Field,
Function,
diff --git a/crates/rust-analyzer/src/semantic_tokens.rs b/crates/rust-analyzer/src/semantic_tokens.rs
index 61a8159278..1097a77afe 100644
--- a/crates/rust-analyzer/src/semantic_tokens.rs
+++ b/crates/rust-analyzer/src/semantic_tokens.rs
@@ -53,6 +53,7 @@ define_semantic_token_types![
(COMMA, "comma"),
(COMPARISON, "comparison"),
(CONST_PARAMETER, "constParameter"),
+ (DERIVE, "derive"),
(DOT, "dot"),
(ESCAPE_SEQUENCE, "escapeSequence"),
(FORMAT_SPECIFIER, "formatSpecifier"),
diff --git a/crates/rust-analyzer/src/to_proto.rs b/crates/rust-analyzer/src/to_proto.rs
index 91245ace7b..f8c46b92fa 100644
--- a/crates/rust-analyzer/src/to_proto.rs
+++ b/crates/rust-analyzer/src/to_proto.rs
@@ -50,9 +50,10 @@ pub(crate) fn symbol_kind(symbol_kind: SymbolKind) -> lsp_types::SymbolKind {
SymbolKind::Enum => lsp_types::SymbolKind::ENUM,
SymbolKind::Variant => lsp_types::SymbolKind::ENUM_MEMBER,
SymbolKind::Trait => lsp_types::SymbolKind::INTERFACE,
- SymbolKind::Macro | SymbolKind::BuiltinAttr | SymbolKind::Attribute => {
- lsp_types::SymbolKind::FUNCTION
- }
+ SymbolKind::Macro
+ | SymbolKind::BuiltinAttr
+ | SymbolKind::Attribute
+ | SymbolKind::Derive => lsp_types::SymbolKind::FUNCTION,
SymbolKind::Module | SymbolKind::ToolModule => lsp_types::SymbolKind::MODULE,
SymbolKind::TypeAlias | SymbolKind::TypeParam => lsp_types::SymbolKind::TYPE_PARAMETER,
SymbolKind::Field => lsp_types::SymbolKind::FIELD,
@@ -112,6 +113,7 @@ pub(crate) fn completion_item_kind(
SymbolKind::Attribute => lsp_types::CompletionItemKind::FUNCTION,
SymbolKind::Const => lsp_types::CompletionItemKind::CONSTANT,
SymbolKind::ConstParam => lsp_types::CompletionItemKind::TYPE_PARAMETER,
+ SymbolKind::Derive => lsp_types::CompletionItemKind::FUNCTION,
SymbolKind::Enum => lsp_types::CompletionItemKind::ENUM,
SymbolKind::Field => lsp_types::CompletionItemKind::FIELD,
SymbolKind::Function => lsp_types::CompletionItemKind::FUNCTION,
@@ -471,6 +473,7 @@ fn semantic_token_type_and_modifiers(
let type_ = match highlight.tag {
HlTag::Symbol(symbol) => match symbol {
SymbolKind::Attribute => semantic_tokens::ATTRIBUTE,
+ SymbolKind::Derive => semantic_tokens::DERIVE,
SymbolKind::Module => lsp_types::SemanticTokenType::NAMESPACE,
SymbolKind::Impl => semantic_tokens::TYPE_ALIAS,
SymbolKind::Field => lsp_types::SemanticTokenType::PROPERTY,