@@ -687,31 +687,31 @@ impl<'a> Format<'a> for ArrowChain<'a, '_> {
687
687
688
688
#[ derive( Debug ) ]
689
689
pub enum ExpressionLeftSide < ' a , ' b > {
690
- Expression ( & ' b Expression < ' a > ) ,
691
- AssignmentTarget ( & ' b AssignmentTarget < ' a > ) ,
692
- SimpleAssignmentTarget ( & ' b SimpleAssignmentTarget < ' a > ) ,
690
+ Expression ( & ' b AstNode < ' a , Expression < ' a > > ) ,
691
+ AssignmentTarget ( & ' b AstNode < ' a , AssignmentTarget < ' a > > ) ,
692
+ SimpleAssignmentTarget ( & ' b AstNode < ' a , SimpleAssignmentTarget < ' a > > ) ,
693
693
}
694
694
695
- impl < ' a , ' b > From < & ' b Expression < ' a > > for ExpressionLeftSide < ' a , ' b > {
696
- fn from ( value : & ' b Expression < ' a > ) -> Self {
695
+ impl < ' a , ' b > From < & ' b AstNode < ' a , Expression < ' a > > > for ExpressionLeftSide < ' a , ' b > {
696
+ fn from ( value : & ' b AstNode < ' a , Expression < ' a > > ) -> Self {
697
697
Self :: Expression ( value)
698
698
}
699
699
}
700
700
701
- impl < ' a , ' b > From < & ' b AssignmentTarget < ' a > > for ExpressionLeftSide < ' a , ' b > {
702
- fn from ( value : & ' b AssignmentTarget < ' a > ) -> Self {
701
+ impl < ' a , ' b > From < & ' b AstNode < ' a , AssignmentTarget < ' a > > > for ExpressionLeftSide < ' a , ' b > {
702
+ fn from ( value : & ' b AstNode < ' a , AssignmentTarget < ' a > > ) -> Self {
703
703
Self :: AssignmentTarget ( value)
704
704
}
705
705
}
706
706
707
- impl < ' a , ' b > From < & ' b SimpleAssignmentTarget < ' a > > for ExpressionLeftSide < ' a , ' b > {
708
- fn from ( value : & ' b SimpleAssignmentTarget < ' a > ) -> Self {
707
+ impl < ' a , ' b > From < & ' b AstNode < ' a , SimpleAssignmentTarget < ' a > > > for ExpressionLeftSide < ' a , ' b > {
708
+ fn from ( value : & ' b AstNode < ' a , SimpleAssignmentTarget < ' a > > ) -> Self {
709
709
Self :: SimpleAssignmentTarget ( value)
710
710
}
711
711
}
712
712
713
713
impl < ' a , ' b > ExpressionLeftSide < ' a , ' b > {
714
- pub fn leftmost ( expression : & ' b Expression < ' a > ) -> Self {
714
+ pub fn leftmost ( expression : & ' b AstNode < ' a , Expression < ' a > > ) -> Self {
715
715
let mut current: Self = expression. into ( ) ;
716
716
loop {
717
717
match current. left_expression ( ) {
@@ -729,60 +729,46 @@ impl<'a, 'b> ExpressionLeftSide<'a, 'b> {
729
729
/// if the expression has no left side.
730
730
pub fn left_expression ( & self ) -> Option < Self > {
731
731
match self {
732
- Self :: Expression ( expression) => match expression {
733
- Expression :: SequenceExpression ( expr) => expr. expressions . first ( ) . map ( Into :: into) ,
734
- Expression :: StaticMemberExpression ( expr) => Some ( ( & expr. object ) . into ( ) ) ,
735
- Expression :: ComputedMemberExpression ( expr) => Some ( ( & expr. object ) . into ( ) ) ,
736
- Expression :: PrivateFieldExpression ( expr) => Some ( ( & expr. object ) . into ( ) ) ,
737
- Expression :: TaggedTemplateExpression ( expr) => Some ( ( & expr. tag ) . into ( ) ) ,
738
- Expression :: NewExpression ( expr) => Some ( ( & expr. callee ) . into ( ) ) ,
739
- Expression :: CallExpression ( expr) => Some ( ( & expr. callee ) . into ( ) ) ,
740
- Expression :: ConditionalExpression ( expr) => Some ( ( & expr. test ) . into ( ) ) ,
741
- Expression :: TSAsExpression ( expr) => Some ( ( & expr. expression ) . into ( ) ) ,
742
- Expression :: TSSatisfiesExpression ( expr) => Some ( ( & expr. expression ) . into ( ) ) ,
743
- Expression :: TSNonNullExpression ( expr) => Some ( ( & expr. expression ) . into ( ) ) ,
744
- Expression :: AssignmentExpression ( expr) => Some ( Self :: AssignmentTarget ( & expr. left ) ) ,
745
- Expression :: UpdateExpression ( expr) => {
732
+ Self :: Expression ( expression) => match expression. as_ast_nodes ( ) {
733
+ AstNodes :: SequenceExpression ( expr) => expr. expressions ( ) . first ( ) . map ( Into :: into) ,
734
+ AstNodes :: StaticMemberExpression ( expr) => Some ( expr. object ( ) . into ( ) ) ,
735
+ AstNodes :: ComputedMemberExpression ( expr) => Some ( expr. object ( ) . into ( ) ) ,
736
+ AstNodes :: PrivateFieldExpression ( expr) => Some ( expr. object ( ) . into ( ) ) ,
737
+ AstNodes :: TaggedTemplateExpression ( expr) => Some ( expr. tag ( ) . into ( ) ) ,
738
+ AstNodes :: NewExpression ( expr) => Some ( expr. callee ( ) . into ( ) ) ,
739
+ AstNodes :: CallExpression ( expr) => Some ( expr. callee ( ) . into ( ) ) ,
740
+ AstNodes :: ConditionalExpression ( expr) => Some ( expr. test ( ) . into ( ) ) ,
741
+ AstNodes :: TSAsExpression ( expr) => Some ( expr. expression ( ) . into ( ) ) ,
742
+ AstNodes :: TSSatisfiesExpression ( expr) => Some ( expr. expression ( ) . into ( ) ) ,
743
+ AstNodes :: TSNonNullExpression ( expr) => Some ( expr. expression ( ) . into ( ) ) ,
744
+ AstNodes :: AssignmentExpression ( expr) => Some ( Self :: AssignmentTarget ( expr. left ( ) ) ) ,
745
+ AstNodes :: UpdateExpression ( expr) => {
746
746
if expr. prefix {
747
747
None
748
748
} else {
749
- Some ( Self :: SimpleAssignmentTarget ( & expr. argument ) )
749
+ Some ( Self :: SimpleAssignmentTarget ( expr. argument ( ) ) )
750
750
}
751
751
}
752
- Expression :: BinaryExpression ( binary) => Some ( ( & binary. left ) . into ( ) ) ,
753
- Expression :: LogicalExpression ( logical) => Some ( ( & logical. left ) . into ( ) ) ,
754
- Expression :: ChainExpression ( chain) => match & chain. expression {
755
- ChainElement :: CallExpression ( expr) => Some ( ( & expr. callee ) . into ( ) ) ,
756
- ChainElement :: TSNonNullExpression ( expr) => Some ( ( & expr. expression ) . into ( ) ) ,
757
- ChainElement :: ComputedMemberExpression ( expr) => Some ( ( & expr. object ) . into ( ) ) ,
758
- ChainElement :: StaticMemberExpression ( expr) => Some ( ( & expr. object ) . into ( ) ) ,
759
- ChainElement :: PrivateFieldExpression ( expr) => Some ( ( & expr. object ) . into ( ) ) ,
752
+ AstNodes :: BinaryExpression ( binary) => Some ( binary. left ( ) . into ( ) ) ,
753
+ AstNodes :: LogicalExpression ( logical) => Some ( logical. left ( ) . into ( ) ) ,
754
+ AstNodes :: ChainExpression ( chain) => match & chain. expression ( ) . as_ast_nodes ( ) {
755
+ AstNodes :: CallExpression ( expr) => Some ( expr. callee ( ) . into ( ) ) ,
756
+ AstNodes :: TSNonNullExpression ( expr) => Some ( expr. expression ( ) . into ( ) ) ,
757
+ AstNodes :: ComputedMemberExpression ( expr) => Some ( expr. object ( ) . into ( ) ) ,
758
+ AstNodes :: StaticMemberExpression ( expr) => Some ( expr. object ( ) . into ( ) ) ,
759
+ AstNodes :: PrivateFieldExpression ( expr) => Some ( expr. object ( ) . into ( ) ) ,
760
+ _ => {
761
+ unreachable ! ( )
762
+ }
760
763
} ,
761
764
_ => None ,
762
765
} ,
763
- Self :: AssignmentTarget ( target) => match target {
764
- match_simple_assignment_target ! ( AssignmentTarget ) => {
765
- Self :: SimpleAssignmentTarget ( target. to_simple_assignment_target ( ) )
766
- . left_expression ( )
767
- }
768
- _ => None ,
769
- } ,
770
- Self :: SimpleAssignmentTarget ( target) => match target {
771
- SimpleAssignmentTarget :: TSAsExpression ( expr) => Some ( ( & expr. expression ) . into ( ) ) ,
772
- SimpleAssignmentTarget :: TSSatisfiesExpression ( expr) => {
773
- Some ( ( & expr. expression ) . into ( ) )
774
- }
775
- SimpleAssignmentTarget :: TSNonNullExpression ( expr) => {
776
- Some ( ( & expr. expression ) . into ( ) )
777
- }
778
- SimpleAssignmentTarget :: TSTypeAssertion ( expr) => Some ( ( & expr. expression ) . into ( ) ) ,
779
- SimpleAssignmentTarget :: ComputedMemberExpression ( expr) => {
780
- Some ( ( & expr. object ) . into ( ) )
781
- }
782
- SimpleAssignmentTarget :: StaticMemberExpression ( expr) => Some ( ( & expr. object ) . into ( ) ) ,
783
- SimpleAssignmentTarget :: PrivateFieldExpression ( expr) => Some ( ( & expr. object ) . into ( ) ) ,
784
- SimpleAssignmentTarget :: AssignmentTargetIdentifier ( identifier_reference) => None ,
785
- } ,
766
+ Self :: AssignmentTarget ( target) => {
767
+ Self :: get_left_side_of_assignment ( target. as_ast_nodes ( ) )
768
+ }
769
+ Self :: SimpleAssignmentTarget ( target) => {
770
+ Self :: get_left_side_of_assignment ( target. as_ast_nodes ( ) )
771
+ }
786
772
}
787
773
}
788
774
@@ -793,10 +779,24 @@ impl<'a, 'b> ExpressionLeftSide<'a, 'b> {
793
779
ExpressionLeftSide :: SimpleAssignmentTarget ( target) => target. span ( ) ,
794
780
}
795
781
}
782
+
783
+ fn get_left_side_of_assignment ( node : & ' b AstNodes < ' a > ) -> Option < ExpressionLeftSide < ' a , ' b > > {
784
+ match node {
785
+ AstNodes :: TSAsExpression ( expr) => Some ( expr. expression ( ) . into ( ) ) ,
786
+ AstNodes :: TSSatisfiesExpression ( expr) => Some ( expr. expression ( ) . into ( ) ) ,
787
+ AstNodes :: TSNonNullExpression ( expr) => Some ( expr. expression ( ) . into ( ) ) ,
788
+ AstNodes :: TSTypeAssertion ( expr) => Some ( expr. expression ( ) . into ( ) ) ,
789
+ AstNodes :: ComputedMemberExpression ( expr) => Some ( expr. object ( ) . into ( ) ) ,
790
+ AstNodes :: StaticMemberExpression ( expr) => Some ( expr. object ( ) . into ( ) ) ,
791
+ AstNodes :: PrivateFieldExpression ( expr) => Some ( expr. object ( ) . into ( ) ) ,
792
+ _ => None ,
793
+ }
794
+ }
796
795
}
797
796
798
- fn should_add_parens ( body : & FunctionBody ) -> bool {
799
- let Statement :: ExpressionStatement ( stmt) = body. statements . first ( ) . unwrap ( ) else {
797
+ fn should_add_parens ( body : & AstNode < ' _ , FunctionBody < ' _ > > ) -> bool {
798
+ let AstNodes :: ExpressionStatement ( stmt) = body. statements ( ) . first ( ) . unwrap ( ) . as_ast_nodes ( )
799
+ else {
800
800
unreachable ! ( )
801
801
} ;
802
802
@@ -805,11 +805,13 @@ fn should_add_parens(body: &FunctionBody) -> bool {
805
805
// case and added by the object expression itself
806
806
if matches ! ( & stmt. expression, Expression :: ConditionalExpression ( _) ) {
807
807
!matches ! (
808
- ExpressionLeftSide :: leftmost( & stmt. expression) ,
808
+ ExpressionLeftSide :: leftmost( stmt. expression( ) ) ,
809
809
ExpressionLeftSide :: Expression (
810
+ e
811
+ ) if matches!( e. as_ref( ) ,
810
812
Expression :: ObjectExpression ( _)
811
- | Expression :: FunctionExpression ( _)
812
- | Expression :: ClassExpression ( _)
813
+ | Expression :: FunctionExpression ( _)
814
+ | Expression :: ClassExpression ( _)
813
815
)
814
816
)
815
817
} else {
0 commit comments