mirror of
https://github.com/rust-lang/rust-analyzer
synced 2025-01-04 01:08:47 +00:00
parent
e219999a17
commit
0df1153277
3 changed files with 72 additions and 5 deletions
|
@ -43,6 +43,7 @@ pub(crate) fn add_missing_impl_members(acc: &mut Assists, ctx: &AssistContext<'_
|
||||||
acc,
|
acc,
|
||||||
ctx,
|
ctx,
|
||||||
DefaultMethods::No,
|
DefaultMethods::No,
|
||||||
|
true,
|
||||||
"add_impl_missing_members",
|
"add_impl_missing_members",
|
||||||
"Implement missing members",
|
"Implement missing members",
|
||||||
)
|
)
|
||||||
|
@ -87,6 +88,7 @@ pub(crate) fn add_missing_default_members(
|
||||||
acc,
|
acc,
|
||||||
ctx,
|
ctx,
|
||||||
DefaultMethods::Only,
|
DefaultMethods::Only,
|
||||||
|
true,
|
||||||
"add_impl_default_members",
|
"add_impl_default_members",
|
||||||
"Implement default members",
|
"Implement default members",
|
||||||
)
|
)
|
||||||
|
@ -96,6 +98,7 @@ fn add_missing_impl_members_inner(
|
||||||
acc: &mut Assists,
|
acc: &mut Assists,
|
||||||
ctx: &AssistContext<'_>,
|
ctx: &AssistContext<'_>,
|
||||||
mode: DefaultMethods,
|
mode: DefaultMethods,
|
||||||
|
ignore_hidden: bool,
|
||||||
assist_id: &'static str,
|
assist_id: &'static str,
|
||||||
label: &'static str,
|
label: &'static str,
|
||||||
) -> Option<()> {
|
) -> Option<()> {
|
||||||
|
@ -119,6 +122,7 @@ fn add_missing_impl_members_inner(
|
||||||
&ctx.sema,
|
&ctx.sema,
|
||||||
&ide_db::traits::get_missing_assoc_items(&ctx.sema, &impl_def),
|
&ide_db::traits::get_missing_assoc_items(&ctx.sema, &impl_def),
|
||||||
mode,
|
mode,
|
||||||
|
ignore_hidden,
|
||||||
);
|
);
|
||||||
|
|
||||||
if missing_items.is_empty() {
|
if missing_items.is_empty() {
|
||||||
|
@ -1966,4 +1970,39 @@ impl AnotherTrait<i32> for () {
|
||||||
"#,
|
"#,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn doc_hidden_default_impls_ignored() {
|
||||||
|
check_assist(
|
||||||
|
add_missing_default_members,
|
||||||
|
r#"
|
||||||
|
struct Foo;
|
||||||
|
trait Trait {
|
||||||
|
#[doc(hidden)]
|
||||||
|
fn func_with_default_impl() -> u32 {
|
||||||
|
42
|
||||||
|
}
|
||||||
|
fn another_default_impl() -> u32 {
|
||||||
|
43
|
||||||
|
}
|
||||||
|
}
|
||||||
|
impl Tra$0it for Foo {}"#,
|
||||||
|
r#"
|
||||||
|
struct Foo;
|
||||||
|
trait Trait {
|
||||||
|
#[doc(hidden)]
|
||||||
|
fn func_with_default_impl() -> u32 {
|
||||||
|
42
|
||||||
|
}
|
||||||
|
fn another_default_impl() -> u32 {
|
||||||
|
43
|
||||||
|
}
|
||||||
|
}
|
||||||
|
impl Trait for Foo {
|
||||||
|
$0fn another_default_impl() -> u32 {
|
||||||
|
43
|
||||||
|
}
|
||||||
|
}"#,
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -172,7 +172,7 @@ fn impl_def_from_trait(
|
||||||
) -> Option<(ast::Impl, ast::AssocItem)> {
|
) -> Option<(ast::Impl, ast::AssocItem)> {
|
||||||
let trait_ = trait_?;
|
let trait_ = trait_?;
|
||||||
let target_scope = sema.scope(annotated_name.syntax())?;
|
let target_scope = sema.scope(annotated_name.syntax())?;
|
||||||
let trait_items = filter_assoc_items(sema, &trait_.items(sema.db), DefaultMethods::No);
|
let trait_items = filter_assoc_items(sema, &trait_.items(sema.db), DefaultMethods::No, true);
|
||||||
if trait_items.is_empty() {
|
if trait_items.is_empty() {
|
||||||
return None;
|
return None;
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
use std::ops;
|
use std::ops;
|
||||||
|
|
||||||
pub(crate) use gen_trait_fn_body::gen_trait_fn_body;
|
pub(crate) use gen_trait_fn_body::gen_trait_fn_body;
|
||||||
use hir::{db::HirDatabase, HirDisplay, InFile, Semantics};
|
use hir::{db::HirDatabase, HasAttrs as HirHasAttrs, HirDisplay, InFile, Semantics};
|
||||||
use ide_db::{
|
use ide_db::{
|
||||||
famous_defs::FamousDefs, path_transform::PathTransform,
|
famous_defs::FamousDefs, path_transform::PathTransform,
|
||||||
syntax_helpers::insert_whitespace_into_node::insert_ws_into, RootDatabase, SnippetCap,
|
syntax_helpers::insert_whitespace_into_node::insert_ws_into, RootDatabase, SnippetCap,
|
||||||
|
@ -94,16 +94,44 @@ pub fn filter_assoc_items(
|
||||||
sema: &Semantics<'_, RootDatabase>,
|
sema: &Semantics<'_, RootDatabase>,
|
||||||
items: &[hir::AssocItem],
|
items: &[hir::AssocItem],
|
||||||
default_methods: DefaultMethods,
|
default_methods: DefaultMethods,
|
||||||
|
ignore_hidden: bool,
|
||||||
) -> Vec<InFile<ast::AssocItem>> {
|
) -> Vec<InFile<ast::AssocItem>> {
|
||||||
|
// FIXME : How to use the closure below this so I can write sth like
|
||||||
|
// sema.source(hide(it)?)?...
|
||||||
|
|
||||||
|
// let hide = |it: impl HasAttrs| {
|
||||||
|
// if default_methods == DefaultMethods::IgnoreHidden && it.attrs(sema.db).has_doc_hidden() {
|
||||||
|
// None;
|
||||||
|
// }
|
||||||
|
// Some(it)
|
||||||
|
// };
|
||||||
|
|
||||||
return items
|
return items
|
||||||
.iter()
|
.iter()
|
||||||
// Note: This throws away items with no source.
|
// Note: This throws away items with no source.
|
||||||
.copied()
|
.copied()
|
||||||
.filter_map(|assoc_item| {
|
.filter_map(|assoc_item| {
|
||||||
let item = match assoc_item {
|
let item = match assoc_item {
|
||||||
hir::AssocItem::Function(it) => sema.source(it)?.map(ast::AssocItem::Fn),
|
hir::AssocItem::Function(it) => {
|
||||||
hir::AssocItem::TypeAlias(it) => sema.source(it)?.map(ast::AssocItem::TypeAlias),
|
if ignore_hidden && it.attrs(sema.db).has_doc_hidden() {
|
||||||
hir::AssocItem::Const(it) => sema.source(it)?.map(ast::AssocItem::Const),
|
return None;
|
||||||
|
}
|
||||||
|
sema.source(it)?.map(ast::AssocItem::Fn)
|
||||||
|
}
|
||||||
|
hir::AssocItem::TypeAlias(it) => {
|
||||||
|
if ignore_hidden && it.attrs(sema.db).has_doc_hidden() {
|
||||||
|
return None;
|
||||||
|
}
|
||||||
|
|
||||||
|
sema.source(it)?.map(ast::AssocItem::TypeAlias)
|
||||||
|
}
|
||||||
|
hir::AssocItem::Const(it) => {
|
||||||
|
if ignore_hidden && it.attrs(sema.db).has_doc_hidden() {
|
||||||
|
return None;
|
||||||
|
}
|
||||||
|
|
||||||
|
sema.source(it)?.map(ast::AssocItem::Const)
|
||||||
|
}
|
||||||
};
|
};
|
||||||
Some(item)
|
Some(item)
|
||||||
})
|
})
|
||||||
|
|
Loading…
Reference in a new issue