@@ -1511,7 +1511,14 @@ impl VisitMut for ClosureReplacer<'_> {
1511
1511
}
1512
1512
1513
1513
#[ derive( Debug , Clone , PartialEq , Eq ) ]
1514
- struct Name ( Id , Vec < ( JsWord , bool ) > ) ;
1514
+ struct NamePart {
1515
+ prop : JsWord ,
1516
+ is_member : bool ,
1517
+ optional : bool ,
1518
+ }
1519
+
1520
+ #[ derive( Debug , Clone , PartialEq , Eq ) ]
1521
+ struct Name ( Id , Vec < NamePart > ) ;
1515
1522
1516
1523
impl From < & ' _ Ident > for Name {
1517
1524
fn from ( value : & Ident ) -> Self {
@@ -1539,7 +1546,11 @@ impl TryFrom<&'_ MemberExpr> for Name {
1539
1546
match & value. prop {
1540
1547
MemberProp :: Ident ( prop) => {
1541
1548
let mut obj: Name = value. obj . as_ref ( ) . try_into ( ) ?;
1542
- obj. 1 . push ( ( prop. sym . clone ( ) , true ) ) ;
1549
+ obj. 1 . push ( NamePart {
1550
+ prop : prop. sym . clone ( ) ,
1551
+ is_member : true ,
1552
+ optional : false ,
1553
+ } ) ;
1543
1554
Ok ( obj)
1544
1555
}
1545
1556
_ => Err ( ( ) ) ,
@@ -1552,10 +1563,14 @@ impl TryFrom<&'_ OptChainExpr> for Name {
1552
1563
1553
1564
fn try_from ( value : & OptChainExpr ) -> Result < Self , Self :: Error > {
1554
1565
match & * value. base {
1555
- OptChainBase :: Member ( value ) => match & value . prop {
1566
+ OptChainBase :: Member ( m ) => match & m . prop {
1556
1567
MemberProp :: Ident ( prop) => {
1557
- let mut obj: Name = value. obj . as_ref ( ) . try_into ( ) ?;
1558
- obj. 1 . push ( ( prop. sym . clone ( ) , false ) ) ;
1568
+ let mut obj: Name = m. obj . as_ref ( ) . try_into ( ) ?;
1569
+ obj. 1 . push ( NamePart {
1570
+ prop : prop. sym . clone ( ) ,
1571
+ is_member : false ,
1572
+ optional : value. optional ,
1573
+ } ) ;
1559
1574
Ok ( obj)
1560
1575
}
1561
1576
_ => Err ( ( ) ) ,
@@ -1569,7 +1584,12 @@ impl From<Name> for Expr {
1569
1584
fn from ( value : Name ) -> Self {
1570
1585
let mut expr = Expr :: Ident ( value. 0 . into ( ) ) ;
1571
1586
1572
- for ( prop, is_member) in value. 1 . into_iter ( ) {
1587
+ for NamePart {
1588
+ prop,
1589
+ is_member,
1590
+ optional,
1591
+ } in value. 1 . into_iter ( )
1592
+ {
1573
1593
if is_member {
1574
1594
expr = Expr :: Member ( MemberExpr {
1575
1595
span : DUMMY_SP ,
@@ -1579,12 +1599,12 @@ impl From<Name> for Expr {
1579
1599
} else {
1580
1600
expr = Expr :: OptChain ( OptChainExpr {
1581
1601
span : DUMMY_SP ,
1582
- question_dot_token : DUMMY_SP ,
1583
1602
base : Box :: new ( OptChainBase :: Member ( MemberExpr {
1584
1603
span : DUMMY_SP ,
1585
1604
obj : expr. into ( ) ,
1586
1605
prop : MemberProp :: Ident ( Ident :: new ( prop, DUMMY_SP ) ) ,
1587
1606
} ) ) ,
1607
+ optional,
1588
1608
} ) ;
1589
1609
}
1590
1610
}
0 commit comments