Unnamed repository; edit this file 'description' to name the repository.
fix: Don't duplicate attribute completions
Lukas Wirth 2021-12-17
parent f79f3db · commit d3e5386
-rw-r--r--crates/hir_def/src/item_tree.rs2
-rw-r--r--crates/ide/src/hover.rs7
-rw-r--r--crates/ide_completion/src/completions/attribute.rs19
-rw-r--r--crates/ide_completion/src/tests/attribute.rs8
4 files changed, 13 insertions, 23 deletions
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
"#]],
);
}