@@ -3,7 +3,10 @@ use syntax::ast::{self, make, AstNode};
3
3
4
4
use crate :: {
5
5
assist_context:: { AssistContext , Assists } ,
6
- utils:: { add_trait_assoc_items_to_impl, filter_assoc_items, gen_trait_fn_body, DefaultMethods } ,
6
+ utils:: {
7
+ add_trait_assoc_items_to_impl, filter_assoc_items, gen_trait_fn_body, DefaultMethods ,
8
+ IgnoreAssocItems ,
9
+ } ,
7
10
AssistId , AssistKind ,
8
11
} ;
9
12
@@ -43,6 +46,7 @@ pub(crate) fn add_missing_impl_members(acc: &mut Assists, ctx: &AssistContext<'_
43
46
acc,
44
47
ctx,
45
48
DefaultMethods :: No ,
49
+ IgnoreAssocItems :: DocHiddenAttrPresent ,
46
50
"add_impl_missing_members" ,
47
51
"Implement missing members" ,
48
52
)
@@ -87,6 +91,7 @@ pub(crate) fn add_missing_default_members(
87
91
acc,
88
92
ctx,
89
93
DefaultMethods :: Only ,
94
+ IgnoreAssocItems :: DocHiddenAttrPresent ,
90
95
"add_impl_default_members" ,
91
96
"Implement default members" ,
92
97
)
@@ -96,6 +101,7 @@ fn add_missing_impl_members_inner(
96
101
acc : & mut Assists ,
97
102
ctx : & AssistContext < ' _ > ,
98
103
mode : DefaultMethods ,
104
+ ignore_items : IgnoreAssocItems ,
99
105
assist_id : & ' static str ,
100
106
label : & ' static str ,
101
107
) -> Option < ( ) > {
@@ -115,10 +121,21 @@ fn add_missing_impl_members_inner(
115
121
let trait_ref = impl_. trait_ref ( ctx. db ( ) ) ?;
116
122
let trait_ = trait_ref. trait_ ( ) ;
117
123
124
+ let mut ign_item = ignore_items;
125
+
126
+ if let IgnoreAssocItems :: DocHiddenAttrPresent = ignore_items {
127
+ // Relax condition for local crates.
128
+ let db = ctx. db ( ) ;
129
+ if trait_. module ( db) . krate ( ) . origin ( db) . is_local ( ) {
130
+ ign_item = IgnoreAssocItems :: No ;
131
+ }
132
+ }
133
+
118
134
let missing_items = filter_assoc_items (
119
135
& ctx. sema ,
120
136
& ide_db:: traits:: get_missing_assoc_items ( & ctx. sema , & impl_def) ,
121
137
mode,
138
+ ign_item,
122
139
) ;
123
140
124
141
if missing_items. is_empty ( ) {
@@ -1966,4 +1983,169 @@ impl AnotherTrait<i32> for () {
1966
1983
"# ,
1967
1984
) ;
1968
1985
}
1986
+
1987
+ #[ test]
1988
+ fn doc_hidden_default_impls_ignored ( ) {
1989
+ // doc(hidden) attr is ignored trait and impl both belong to the local crate.
1990
+ check_assist (
1991
+ add_missing_default_members,
1992
+ r#"
1993
+ struct Foo;
1994
+ trait Trait {
1995
+ #[doc(hidden)]
1996
+ fn func_with_default_impl() -> u32 {
1997
+ 42
1998
+ }
1999
+ fn another_default_impl() -> u32 {
2000
+ 43
2001
+ }
2002
+ }
2003
+ impl Tra$0it for Foo {}"# ,
2004
+ r#"
2005
+ struct Foo;
2006
+ trait Trait {
2007
+ #[doc(hidden)]
2008
+ fn func_with_default_impl() -> u32 {
2009
+ 42
2010
+ }
2011
+ fn another_default_impl() -> u32 {
2012
+ 43
2013
+ }
2014
+ }
2015
+ impl Trait for Foo {
2016
+ $0fn func_with_default_impl() -> u32 {
2017
+ 42
2018
+ }
2019
+
2020
+ fn another_default_impl() -> u32 {
2021
+ 43
2022
+ }
2023
+ }"# ,
2024
+ )
2025
+ }
2026
+
2027
+ #[ test]
2028
+ fn doc_hidden_default_impls_lang_crates ( ) {
2029
+ // Not applicable because Eq has a single method and this has a #[doc(hidden)] attr set.
2030
+ check_assist_not_applicable (
2031
+ add_missing_default_members,
2032
+ r#"
2033
+ //- minicore: eq
2034
+ use core::cmp::Eq;
2035
+ struct Foo;
2036
+ impl E$0q for Foo { /* $0 */ }
2037
+ "# ,
2038
+ )
2039
+ }
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
+ }
1969
2151
}
0 commit comments