diff --git a/crates/hir_def/src/item_tree.rs b/crates/hir_def/src/item_tree.rs index 68d77084a3..5e260880ff 100644 --- a/crates/hir_def/src/item_tree.rs +++ b/crates/hir_def/src/item_tree.rs @@ -216,7 +216,7 @@ impl ItemTree { self.attrs.get(&of).unwrap_or(&RawAttrs::EMPTY) } - pub fn attrs(&self, db: &dyn DefDatabase, krate: CrateId, of: AttrOwner) -> Attrs { + pub(crate) fn attrs(&self, db: &dyn DefDatabase, krate: CrateId, of: AttrOwner) -> Attrs { self.raw_attrs(of).clone().filter(db, krate) } diff --git a/crates/ide/src/hover.rs b/crates/ide/src/hover.rs index 7d5cfaa937..9d19d7c1c0 100644 --- a/crates/ide/src/hover.rs +++ b/crates/ide/src/hover.rs @@ -94,10 +94,11 @@ pub(crate) fn hover( let sema = &hir::Semantics::new(db); let file = sema.parse(file_id).syntax().clone(); - if !range.is_empty() { + let offset = if !range.is_empty() { return hover_ranged(&file, range, sema, config); - } - let offset = range.start(); + } else { + range.start() + }; let original_token = pick_best_token(file.token_at_offset(offset), |kind| match kind { IDENT | INT_NUMBER | LIFETIME_IDENT | T![self] | T![super] | T![crate] => 3, diff --git a/crates/ide_completion/src/completions/attribute.rs b/crates/ide_completion/src/completions/attribute.rs index d92e311915..d642c8bc4d 100644 --- a/crates/ide_completion/src/completions/attribute.rs +++ b/crates/ide_completion/src/completions/attribute.rs @@ -2,8 +2,8 @@ //! //! This module uses a bit of static metadata to provide completions //! for built-in attributes. +//! Non-builtin attribute(excluding derives attributes) completions are done in [`super::unqualified_path`]. -use hir::HasAttrs; use ide_db::{ helpers::{ generated_lints::{CLIPPY_LINTS, DEFAULT_LINTS, FEATURES, RUSTDOC_LINTS}, @@ -93,23 +93,6 @@ fn complete_new_attribute(acc: &mut Completions, ctx: &CompletionContext, attrib None if is_inner => ATTRIBUTES.iter().for_each(add_completion), None => ATTRIBUTES.iter().filter(|compl| !compl.prefer_inner).for_each(add_completion), } - - // FIXME: write a test for this when we can - ctx.scope.process_all_names(&mut |name, scope_def| { - if let hir::ScopeDef::MacroDef(mac) = scope_def { - if mac.kind() == hir::MacroKind::Attr { - let mut item = CompletionItem::new( - SymbolKind::Attribute, - ctx.source_range(), - name.to_smol_str(), - ); - if let Some(docs) = mac.docs(ctx.sema.db) { - item.documentation(docs); - } - item.add_to(acc); - } - } - }); } struct AttrCompletion { diff --git a/crates/ide_completion/src/tests/attribute.rs b/crates/ide_completion/src/tests/attribute.rs index c90d4966f3..c2bd26e2d8 100644 --- a/crates/ide_completion/src/tests/attribute.rs +++ b/crates/ide_completion/src/tests/attribute.rs @@ -283,7 +283,11 @@ fn attr_on_type_alias() { #[test] fn attr_on_struct() { check( - r#"#[$0] struct Foo;"#, + r#" +//- minicore:derive +#[$0] +struct Foo; +"#, expect![[r#" at allow(…) at cfg(…) @@ -303,6 +307,8 @@ fn attr_on_struct() { kw self kw super kw crate + md core + at derive pub macro derive "#]], ); }