Skip to content

Commit 889851b

Browse files
bors[bot]matklad
andauthored
Merge #3241
3241: Fill missing fields of enum variants r=matklad a=matklad bors r+ 🤖 Co-authored-by: Aleksey Kladov <[email protected]>
2 parents 7db7c86 + 9549aad commit 889851b

File tree

2 files changed

+40
-7
lines changed

2 files changed

+40
-7
lines changed

crates/ra_hir_ty/src/expr.rs

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ use rustc_hash::FxHashSet;
1515
use crate::{
1616
db::HirDatabase,
1717
diagnostics::{MissingFields, MissingOkInTailExpr},
18+
utils::variant_data,
1819
ApplicationTy, InferenceResult, Ty, TypeCtor,
1920
};
2021

@@ -27,6 +28,7 @@ pub use hir_def::{
2728
ArithOp, Array, BinaryOp, BindingAnnotation, CmpOp, Expr, ExprId, Literal, LogicOp,
2829
MatchArm, Ordering, Pat, PatId, RecordFieldPat, RecordLitField, Statement, UnaryOp,
2930
},
31+
VariantId,
3032
};
3133

3234
pub struct ExprValidator<'a, 'b: 'a> {
@@ -69,17 +71,19 @@ impl<'a, 'b> ExprValidator<'a, 'b> {
6971
) {
7072
if spread.is_some() {
7173
return;
74+
};
75+
let variant_def: VariantId = match self.infer.variant_resolution_for_expr(id) {
76+
Some(VariantId::UnionId(_)) | None => return,
77+
Some(it) => it,
78+
};
79+
if let VariantId::UnionId(_) = variant_def {
80+
return;
7281
}
7382

74-
let struct_def = match self.infer[id].as_adt() {
75-
Some((AdtId::StructId(s), _)) => s,
76-
_ => return,
77-
};
78-
let struct_data = db.struct_data(struct_def);
83+
let variant_data = variant_data(db, variant_def);
7984

8085
let lit_fields: FxHashSet<_> = fields.iter().map(|f| &f.name).collect();
81-
let missed_fields: Vec<Name> = struct_data
82-
.variant_data
86+
let missed_fields: Vec<Name> = variant_data
8387
.fields()
8488
.iter()
8589
.filter_map(|(_f, d)| {

crates/ra_ide/src/diagnostics.rs

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -469,6 +469,35 @@ mod tests {
469469
check_apply_diagnostic_fix(before, after);
470470
}
471471

472+
#[test]
473+
fn test_fill_struct_fields_enum() {
474+
let before = r"
475+
enum Expr {
476+
Bin { lhs: Box<Expr>, rhs: Box<Expr> }
477+
}
478+
479+
impl Expr {
480+
fn new_bin(lhs: Box<Expr>, rhs: Box<Expr>) -> Expr {
481+
Expr::Bin { <|> }
482+
}
483+
}
484+
485+
";
486+
let after = r"
487+
enum Expr {
488+
Bin { lhs: Box<Expr>, rhs: Box<Expr> }
489+
}
490+
491+
impl Expr {
492+
fn new_bin(lhs: Box<Expr>, rhs: Box<Expr>) -> Expr {
493+
Expr::Bin { lhs: (), rhs: () <|> }
494+
}
495+
}
496+
497+
";
498+
check_apply_diagnostic_fix(before, after);
499+
}
500+
472501
#[test]
473502
fn test_fill_struct_fields_partial() {
474503
let before = r"

0 commit comments

Comments
 (0)