Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/ide-completion/src/render/variant.rs')
| -rw-r--r-- | crates/ide-completion/src/render/variant.rs | 11 |
1 files changed, 6 insertions, 5 deletions
diff --git a/crates/ide-completion/src/render/variant.rs b/crates/ide-completion/src/render/variant.rs index 39a37dc9f8..2c9fb9b35a 100644 --- a/crates/ide-completion/src/render/variant.rs +++ b/crates/ide-completion/src/render/variant.rs @@ -1,7 +1,7 @@ //! Code common to structs, unions, and enum variants. use crate::context::CompletionContext; -use hir::{db::HirDatabase, HasAttrs, HasVisibility, HirDisplay, StructKind}; +use hir::{db::HirDatabase, HasAttrs, HasCrate, HasVisibility, HirDisplay, StructKind}; use ide_db::SnippetCap; use itertools::Itertools; use syntax::SmolStr; @@ -70,7 +70,7 @@ pub(crate) fn render_tuple_lit( pub(crate) fn visible_fields( ctx: &CompletionContext, fields: &[hir::Field], - item: impl HasAttrs, + item: impl HasAttrs + HasCrate + Copy, ) -> Option<(Vec<hir::Field>, bool)> { let module = ctx.module; let n_fields = fields.len(); @@ -79,9 +79,10 @@ pub(crate) fn visible_fields( .filter(|field| field.is_visible_from(ctx.db, module)) .copied() .collect::<Vec<_>>(); - - let fields_omitted = - n_fields - fields.len() > 0 || item.attrs(ctx.db).by_key("non_exhaustive").exists(); + let has_invisible_field = n_fields - fields.len() > 0; + let is_foreign_non_exhaustive = item.attrs(ctx.db).by_key("non_exhaustive").exists() + && item.krate(ctx.db) != module.krate(); + let fields_omitted = has_invisible_field || is_foreign_non_exhaustive; Some((fields, fields_omitted)) } |