From e4f2d0e3a820474b4de1bf2dc5c7734637cadd10 Mon Sep 17 00:00:00 2001 From: Lukas Wirth Date: Sat, 4 Dec 2021 18:18:09 +0100 Subject: [PATCH] Introduce SymbolKind::Derive --- crates/ide/src/navigation_target.rs | 8 +- .../ide/src/syntax_highlighting/highlight.rs | 8 +- crates/ide/src/syntax_highlighting/tags.rs | 1 + .../test_data/highlighting.html | 4 +- .../src/completions/attribute/cfg.rs | 6 +- .../src/completions/attribute/derive.rs | 9 +- .../src/completions/attribute/repr.rs | 2 +- crates/ide_completion/src/item.rs | 1 + crates/ide_completion/src/tests/attribute.rs | 180 +++++++++--------- crates/ide_db/src/lib.rs | 1 + crates/rust-analyzer/src/semantic_tokens.rs | 1 + crates/rust-analyzer/src/to_proto.rs | 9 +- 12 files changed, 125 insertions(+), 105 deletions(-) diff --git a/crates/ide/src/navigation_target.rs b/crates/ide/src/navigation_target.rs index 49ff3625caa..d97e52200dc 100644 --- a/crates/ide/src/navigation_target.rs +++ b/crates/ide/src/navigation_target.rs @@ -363,7 +363,13 @@ fn try_to_nav(&self, db: &RootDatabase) -> Option { 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 8481f414372..a5be905983f 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 8c796a3bfb8..7216eae0ebc 100644 --- a/crates/ide/src/syntax_highlighting/tags.rs +++ b/crates/ide/src/syntax_highlighting/tags.rs @@ -128,6 +128,7 @@ fn as_str(self) -> &'static str { 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 8c9deac005e..b0fbbfda2a1 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 d1a4722b301..e53bf491743 100644 --- a/crates/ide_completion/src/completions/attribute/cfg.rs +++ b/crates/ide_completion/src/completions/attribute/cfg.rs @@ -9,7 +9,7 @@ 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 b71ee21d3cc..0daf1147882 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 4c4a37fb5e7..805038091c7 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 7ff16adce15..4a6e034dc91 100644 --- a/crates/ide_completion/src/item.rs +++ b/crates/ide_completion/src/item.rs @@ -235,6 +235,7 @@ pub(crate) fn tag(&self) -> &'static str { 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 45979d4828c..8141fab299e 100644 --- a/crates/ide_completion/src/tests/attribute.rs +++ b/crates/ide_completion/src/tests/attribute.rs @@ -560,9 +560,9 @@ fn cfg_target_endian() { check( r#"#[cfg(target_endian = $0"#, expect![[r#" - at little - at big -"#]], + ba little + ba big + "#]], ); } } @@ -594,13 +594,13 @@ fn empty_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 @@ fn derive_with_input_before() { #[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 @@ fn derive_with_input_after() { #[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 @@ fn derive_flyimport() { #[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 @@ fn derive_flyimport() { #[derive(der$0)] struct Test; "#, expect![[r#" - at DeriveIdentity + de DeriveIdentity "#]], ); } @@ -775,23 +775,23 @@ fn empty() { 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 @@ fn align() { 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 @@ fn packed() { 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 @@ fn c() { 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 @@ fn prim() { 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 99b64821fc3..0d14c176b58 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 61a8159278d..1097a77afec 100644 --- a/crates/rust-analyzer/src/semantic_tokens.rs +++ b/crates/rust-analyzer/src/semantic_tokens.rs @@ -53,6 +53,7 @@ macro_rules! 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 91245ace7b9..f8c46b92fa8 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, -- 2.44.0