- self.token.prev_sibling_or_token()
- .and_then(|se| se.into_node())
- .and_then(|node| ast::RecordExprField::cast(node))
- .and_then(|rf| self.sema.resolve_record_field(&rf).zip(Some(rf)))
- .map(|(f, rf)|(
- Some(f.0.ty(self.db)),
- rf.field_name().map(NameOrNameRef::NameRef),
+ // wouldn't try {} be nice...
+ (|| {
+ let record_ty = self.sema.type_of_expr(&ast::Expr::cast(node.parent()?)?)?;
+ let expr_field = self.token.prev_sibling_or_token()?
+ .into_node()
+ .and_then(|node| ast::RecordExprField::cast(node))?;
+ let field = self.sema.resolve_record_field(&expr_field)?.0;
+ Some((
+ record_ty.field_type(self.db, field),
+ expr_field.field_name().map(NameOrNameRef::NameRef),