Skip to content

Commit 0df1153

Browse files
committed
bugfix : skip doc(hidden) default members
fixes rust-lang#14957
1 parent e219999 commit 0df1153

File tree

3 files changed

+72
-5
lines changed

3 files changed

+72
-5
lines changed

crates/ide-assists/src/handlers/add_missing_impl_members.rs

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ pub(crate) fn add_missing_impl_members(acc: &mut Assists, ctx: &AssistContext<'_
4343
acc,
4444
ctx,
4545
DefaultMethods::No,
46+
true,
4647
"add_impl_missing_members",
4748
"Implement missing members",
4849
)
@@ -87,6 +88,7 @@ pub(crate) fn add_missing_default_members(
8788
acc,
8889
ctx,
8990
DefaultMethods::Only,
91+
true,
9092
"add_impl_default_members",
9193
"Implement default members",
9294
)
@@ -96,6 +98,7 @@ fn add_missing_impl_members_inner(
9698
acc: &mut Assists,
9799
ctx: &AssistContext<'_>,
98100
mode: DefaultMethods,
101+
ignore_hidden: bool,
99102
assist_id: &'static str,
100103
label: &'static str,
101104
) -> Option<()> {
@@ -119,6 +122,7 @@ fn add_missing_impl_members_inner(
119122
&ctx.sema,
120123
&ide_db::traits::get_missing_assoc_items(&ctx.sema, &impl_def),
121124
mode,
125+
ignore_hidden,
122126
);
123127

124128
if missing_items.is_empty() {
@@ -1966,4 +1970,39 @@ impl AnotherTrait<i32> for () {
19661970
"#,
19671971
);
19681972
}
1973+
1974+
#[test]
1975+
fn doc_hidden_default_impls_ignored() {
1976+
check_assist(
1977+
add_missing_default_members,
1978+
r#"
1979+
struct Foo;
1980+
trait Trait {
1981+
#[doc(hidden)]
1982+
fn func_with_default_impl() -> u32 {
1983+
42
1984+
}
1985+
fn another_default_impl() -> u32 {
1986+
43
1987+
}
1988+
}
1989+
impl Tra$0it for Foo {}"#,
1990+
r#"
1991+
struct Foo;
1992+
trait Trait {
1993+
#[doc(hidden)]
1994+
fn func_with_default_impl() -> u32 {
1995+
42
1996+
}
1997+
fn another_default_impl() -> u32 {
1998+
43
1999+
}
2000+
}
2001+
impl Trait for Foo {
2002+
$0fn another_default_impl() -> u32 {
2003+
43
2004+
}
2005+
}"#,
2006+
)
2007+
}
19692008
}

crates/ide-assists/src/handlers/replace_derive_with_manual_impl.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,7 @@ fn impl_def_from_trait(
172172
) -> Option<(ast::Impl, ast::AssocItem)> {
173173
let trait_ = trait_?;
174174
let target_scope = sema.scope(annotated_name.syntax())?;
175-
let trait_items = filter_assoc_items(sema, &trait_.items(sema.db), DefaultMethods::No);
175+
let trait_items = filter_assoc_items(sema, &trait_.items(sema.db), DefaultMethods::No, true);
176176
if trait_items.is_empty() {
177177
return None;
178178
}

crates/ide-assists/src/utils.rs

Lines changed: 32 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
use std::ops;
44

55
pub(crate) use gen_trait_fn_body::gen_trait_fn_body;
6-
use hir::{db::HirDatabase, HirDisplay, InFile, Semantics};
6+
use hir::{db::HirDatabase, HasAttrs as HirHasAttrs, HirDisplay, InFile, Semantics};
77
use ide_db::{
88
famous_defs::FamousDefs, path_transform::PathTransform,
99
syntax_helpers::insert_whitespace_into_node::insert_ws_into, RootDatabase, SnippetCap,
@@ -94,16 +94,44 @@ pub fn filter_assoc_items(
9494
sema: &Semantics<'_, RootDatabase>,
9595
items: &[hir::AssocItem],
9696
default_methods: DefaultMethods,
97+
ignore_hidden: bool,
9798
) -> Vec<InFile<ast::AssocItem>> {
99+
// FIXME : How to use the closure below this so I can write sth like
100+
// sema.source(hide(it)?)?...
101+
102+
// let hide = |it: impl HasAttrs| {
103+
// if default_methods == DefaultMethods::IgnoreHidden && it.attrs(sema.db).has_doc_hidden() {
104+
// None;
105+
// }
106+
// Some(it)
107+
// };
108+
98109
return items
99110
.iter()
100111
// Note: This throws away items with no source.
101112
.copied()
102113
.filter_map(|assoc_item| {
103114
let item = match assoc_item {
104-
hir::AssocItem::Function(it) => sema.source(it)?.map(ast::AssocItem::Fn),
105-
hir::AssocItem::TypeAlias(it) => sema.source(it)?.map(ast::AssocItem::TypeAlias),
106-
hir::AssocItem::Const(it) => sema.source(it)?.map(ast::AssocItem::Const),
115+
hir::AssocItem::Function(it) => {
116+
if ignore_hidden && it.attrs(sema.db).has_doc_hidden() {
117+
return None;
118+
}
119+
sema.source(it)?.map(ast::AssocItem::Fn)
120+
}
121+
hir::AssocItem::TypeAlias(it) => {
122+
if ignore_hidden && it.attrs(sema.db).has_doc_hidden() {
123+
return None;
124+
}
125+
126+
sema.source(it)?.map(ast::AssocItem::TypeAlias)
127+
}
128+
hir::AssocItem::Const(it) => {
129+
if ignore_hidden && it.attrs(sema.db).has_doc_hidden() {
130+
return None;
131+
}
132+
133+
sema.source(it)?.map(ast::AssocItem::Const)
134+
}
107135
};
108136
Some(item)
109137
})

0 commit comments

Comments
 (0)