Create non-exhaustive patterns for non_exhaustive attributed items

This commit is contained in:
Lukas Wirth 2020-12-20 20:13:06 +01:00
parent a5874a38cb
commit 33ecad4407

View File

@ -1,6 +1,6 @@
//! Renderer for patterns.
use hir::{db::HirDatabase, HasVisibility, Name, StructKind};
use hir::{db::HirDatabase, HasAttrs, HasVisibility, Name, StructKind};
use itertools::Itertools;
use crate::{
@ -27,7 +27,8 @@ pub(crate) fn render_struct_pat(
// Matching a struct without matching its fields is pointless, unlike matching a Variant without its fields
return None;
}
let fields_omitted = n_fields - fields.len() > 0;
let fields_omitted =
n_fields - fields.len() > 0 || strukt.attrs(ctx.db()).by_key("non_exhaustive").exists();
let name = local_name.unwrap_or_else(|| strukt.name(ctx.db())).to_string();
let pat = render_pat(&ctx, &name, strukt.kind(ctx.db()), &fields, fields_omitted)?;
@ -60,7 +61,8 @@ pub(crate) fn render_variant_pat(
.filter(|field| field.is_visible_from(ctx.db(), module))
.collect::<Vec<_>>();
let fields_omitted = n_fields - fields.len() > 0;
let fields_omitted =
n_fields - fields.len() > 0 || variant.attrs(ctx.db()).by_key("non_exhaustive").exists();
let name = local_name.unwrap_or_else(|| variant.name(ctx.db())).to_string();
let pat = render_pat(&ctx, &name, variant.kind(ctx.db()), &fields, fields_omitted)?;