Skip to content

Commit 18ea924

Browse files
committed
v2
1 parent 8a2c5d2 commit 18ea924

File tree

2 files changed

+114
-3
lines changed

2 files changed

+114
-3
lines changed

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

+113-2
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,6 @@ fn add_missing_impl_members_inner(
125125

126126
if let IgnoreAssocItems::HiddenDocAttrPresent = ignore_items {
127127
// Relax condition for local crates.
128-
129128
let db = ctx.db();
130129
if trait_.module(db).krate().origin(db).is_local() {
131130
ign_item = IgnoreAssocItems::No;
@@ -1987,6 +1986,7 @@ impl AnotherTrait<i32> for () {
19871986

19881987
#[test]
19891988
fn doc_hidden_default_impls_ignored() {
1989+
// doc(hidden) attr is ignored trait and impl both belong to the local crate.
19901990
check_assist(
19911991
add_missing_default_members,
19921992
r#"
@@ -2025,7 +2025,7 @@ impl Trait for Foo {
20252025
}
20262026

20272027
#[test]
2028-
fn doc_hidden_default_impls_extern_crates() {
2028+
fn doc_hidden_default_impls_lang_crates() {
20292029
// Not applicable because Eq has a single method and this has a #[doc(hidden)] attr set.
20302030
check_assist_not_applicable(
20312031
add_missing_default_members,
@@ -2037,4 +2037,115 @@ impl E$0q for Foo { /* $0 */ }
20372037
"#,
20382038
)
20392039
}
2040+
2041+
#[test]
2042+
fn doc_hidden_default_impls_lib_crates() {
2043+
check_assist(
2044+
add_missing_default_members,
2045+
r#"
2046+
//- /main.rs crate:a deps:b
2047+
struct B;
2048+
impl b::Exte$0rnTrait for B {}
2049+
//- /lib.rs crate:b new_source_root:library
2050+
pub trait ExternTrait {
2051+
#[doc(hidden)]
2052+
fn hidden_default() -> Option<()> {
2053+
todo!()
2054+
}
2055+
2056+
fn unhidden_default() -> Option<()> {
2057+
todo!()
2058+
}
2059+
2060+
fn unhidden_nondefault() -> Option<()>;
2061+
}
2062+
"#,
2063+
r#"
2064+
struct B;
2065+
impl b::ExternTrait for B {
2066+
$0fn unhidden_default() -> Option<()> {
2067+
todo!()
2068+
}
2069+
}
2070+
"#,
2071+
)
2072+
}
2073+
2074+
#[test]
2075+
fn doc_hidden_default_impls_local_crates() {
2076+
check_assist(
2077+
add_missing_default_members,
2078+
r#"
2079+
trait LocalTrait {
2080+
#[doc(hidden)]
2081+
fn no_skip_default() -> Option<()> {
2082+
todo!()
2083+
}
2084+
fn no_skip_default_2() -> Option<()> {
2085+
todo!()
2086+
}
2087+
}
2088+
2089+
struct B;
2090+
impl Loc$0alTrait for B {}
2091+
"#,
2092+
r#"
2093+
trait LocalTrait {
2094+
#[doc(hidden)]
2095+
fn no_skip_default() -> Option<()> {
2096+
todo!()
2097+
}
2098+
fn no_skip_default_2() -> Option<()> {
2099+
todo!()
2100+
}
2101+
}
2102+
2103+
struct B;
2104+
impl LocalTrait for B {
2105+
$0fn no_skip_default() -> Option<()> {
2106+
todo!()
2107+
}
2108+
2109+
fn no_skip_default_2() -> Option<()> {
2110+
todo!()
2111+
}
2112+
}
2113+
"#,
2114+
)
2115+
}
2116+
2117+
#[test]
2118+
fn doc_hidden_default_impls_workspace_crates() {
2119+
check_assist(
2120+
add_missing_default_members,
2121+
r#"
2122+
//- /lib.rs crate:b new_source_root:local
2123+
trait LocalTrait {
2124+
#[doc(hidden)]
2125+
fn no_skip_default() -> Option<()> {
2126+
todo!()
2127+
}
2128+
fn no_skip_default_2() -> Option<()> {
2129+
todo!()
2130+
}
2131+
}
2132+
2133+
//- /main.rs crate:a deps:b
2134+
struct B;
2135+
impl b::Loc$0alTrait for B {}
2136+
"#,
2137+
r#"
2138+
struct B;
2139+
impl b::LocalTrait for B {
2140+
$0fn no_skip_default() -> Option<()> {
2141+
todo!()
2142+
}
2143+
2144+
fn no_skip_default_2() -> Option<()> {
2145+
todo!()
2146+
}
2147+
}
2148+
"#,
2149+
)
2150+
}
20402151
}

crates/ide-assists/src/utils.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,7 @@ pub fn filter_assoc_items(
109109
!(ignore_items == IgnoreAssocItems::HiddenDocAttrPresent
110110
&& assoc_item.attrs(sema.db).has_doc_hidden())
111111
})
112+
// Note: This throws away items with no source.
112113
.filter_map(|assoc_item| {
113114
let item = match assoc_item {
114115
hir::AssocItem::Function(it) => sema.source(it)?.map(ast::AssocItem::Fn),
@@ -118,7 +119,6 @@ pub fn filter_assoc_items(
118119
Some(item)
119120
})
120121
.filter(has_def_name)
121-
// Note: This throws away items with no source.
122122
.filter(|it| match &it.value {
123123
ast::AssocItem::Fn(def) => matches!(
124124
(default_methods, def.body()),

0 commit comments

Comments
 (0)