11//! Transforms `ast::Expr` into an equivalent `hir_def::expr::Expr`
22//! representation.
33
4+ use std:: { any:: type_name, sync:: Arc } ;
5+
46use either:: Either ;
57use hir_expand:: {
68 hygiene:: Hygiene ,
@@ -10,11 +12,12 @@ use hir_expand::{
1012use ra_arena:: Arena ;
1113use ra_syntax:: {
1214 ast:: {
13- self , ArgListOwner , ArrayExprKind , LiteralKind , LoopBodyOwner , NameOwner ,
15+ self , ArgListOwner , ArrayExprKind , AstChildren , LiteralKind , LoopBodyOwner , NameOwner ,
1416 SlicePatComponents ,
1517 } ,
1618 AstNode , AstPtr ,
1719} ;
20+ use rustc_hash:: FxHashMap ;
1821use test_utils:: mark;
1922
2023use crate :: {
@@ -35,9 +38,6 @@ use crate::{
3538} ;
3639
3740use super :: { ExprSource , PatSource } ;
38- use ast:: AstChildren ;
39- use rustc_hash:: FxHashMap ;
40- use std:: { any:: type_name, sync:: Arc } ;
4141
4242pub ( crate ) struct LowerCtx {
4343 hygiene : Hygiene ,
@@ -786,29 +786,26 @@ impl ExprCollector<'_> {
786786 ast:: Pat :: PlaceholderPat ( _) => Pat :: Wild ,
787787 ast:: Pat :: RecordPat ( p) => {
788788 let path = p. path ( ) . and_then ( |path| self . expander . parse_path ( path) ) ;
789- let record_field_pat_list =
790- p . record_field_pat_list ( ) . expect ( "every struct should have a field list" ) ;
791- let mut fields : Vec < _ > = record_field_pat_list
792- . bind_pats ( )
793- . filter_map ( |bind_pat| {
794- let ast_pat =
795- ast :: Pat :: cast ( bind_pat . syntax ( ) . clone ( ) ) . expect ( "bind pat is a pat" ) ;
789+
790+ let args : Vec < _ > = p
791+ . record_pat_field_list ( )
792+ . expect ( "every struct should have a field list" )
793+ . fields ( )
794+ . filter_map ( |f| {
795+ let ast_pat = f . pat ( ) ? ;
796796 let pat = self . collect_pat ( ast_pat) ;
797- let name = bind_pat . name ( ) ?. as_name ( ) ;
797+ let name = f . field_name ( ) ?. as_name ( ) ;
798798 Some ( RecordFieldPat { name, pat } )
799799 } )
800800 . collect ( ) ;
801- let iter = record_field_pat_list. record_field_pats ( ) . filter_map ( |f| {
802- let ast_pat = f. pat ( ) ?;
803- let pat = self . collect_pat ( ast_pat) ;
804- let name = f. field_name ( ) ?. as_name ( ) ;
805- Some ( RecordFieldPat { name, pat } )
806- } ) ;
807- fields. extend ( iter) ;
808801
809- let ellipsis = record_field_pat_list. dotdot_token ( ) . is_some ( ) ;
802+ let ellipsis = p
803+ . record_pat_field_list ( )
804+ . expect ( "every struct should have a field list" )
805+ . dotdot_token ( )
806+ . is_some ( ) ;
810807
811- Pat :: Record { path, args : fields , ellipsis }
808+ Pat :: Record { path, args, ellipsis }
812809 }
813810 ast:: Pat :: SlicePat ( p) => {
814811 let SlicePatComponents { prefix, slice, suffix } = p. components ( ) ;
0 commit comments