From 9680ae865e9b8202edf483f03ed5169409980dda Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Mon, 20 May 2019 23:01:49 +0300 Subject: simplify --- crates/ra_hir/src/expr/validation.rs | 77 ++++++++++++++++++------------------ 1 file changed, 39 insertions(+), 38 deletions(-) (limited to 'crates/ra_hir/src/expr/validation.rs') diff --git a/crates/ra_hir/src/expr/validation.rs b/crates/ra_hir/src/expr/validation.rs index aebed6788..3f758f283 100644 --- a/crates/ra_hir/src/expr/validation.rs +++ b/crates/ra_hir/src/expr/validation.rs @@ -5,13 +5,11 @@ use ra_syntax::ast::{AstNode, StructLit}; use crate::{ expr::AstPtr, - HirDatabase, - Function, - Name, + HirDatabase, Function, Name, diagnostics::{DiagnosticSink, MissingFields}, adt::AdtDef, Path, - ty::InferenceResult + ty::InferenceResult, }; use super::{Expr, StructLitField, ExprId}; @@ -50,43 +48,46 @@ impl<'a, 'b> ExprValidator<'a, 'b> { spread: &Option, db: &impl HirDatabase, ) { - if let Some(_) = spread { + if spread.is_some() { return; } + + let struct_def = match self.infer[id].as_adt() { + Some((AdtDef::Struct(s), _)) => s, + _ => return, + }; + let lit_fields: FxHashSet<_> = fields.into_iter().map(|f| &f.name).collect(); - let struct_ty = &self.infer[id]; - if let Some((AdtDef::Struct(s), _)) = struct_ty.as_adt() { - let missed_fields: Vec = s - .fields(db) - .iter() - .filter_map(|f| { - let name = f.name(db); - if lit_fields.contains(&name) { - None - } else { - Some(name) - } - }) - .collect(); - if missed_fields.is_empty() { - return; - } - let source_map = self.func.body_source_map(db); - let file_id = self.func.source(db).0; - let source_file = db.parse(file_id.original_file(db)); - if let Some(field_list_node) = source_map - .expr_syntax(id) - .map(|ptr| ptr.to_node(source_file.syntax())) - .and_then(StructLit::cast) - .and_then(|lit| lit.named_field_list()) - { - let field_list_ptr = AstPtr::new(field_list_node); - self.sink.push(MissingFields { - file: file_id, - field_list: field_list_ptr, - missed_fields, - }) - } + let missed_fields: Vec = struct_def + .fields(db) + .iter() + .filter_map(|f| { + let name = f.name(db); + if lit_fields.contains(&name) { + None + } else { + Some(name) + } + }) + .collect(); + if missed_fields.is_empty() { + return; + } + let source_map = self.func.body_source_map(db); + let file_id = self.func.source(db).0; + let source_file = db.parse(file_id.original_file(db)); + if let Some(field_list_node) = source_map + .expr_syntax(id) + .map(|ptr| ptr.to_node(source_file.syntax())) + .and_then(StructLit::cast) + .and_then(|lit| lit.named_field_list()) + { + let field_list_ptr = AstPtr::new(field_list_node); + self.sink.push(MissingFields { + file: file_id, + field_list: field_list_ptr, + missed_fields, + }) } } } -- cgit v1.2.3