@@ -654,11 +654,9 @@ impl<'a> Parser<'a> {
654654 #[ inline]
655655 fn labeled_or_expression_statement ( & mut self , label : OwnedSlice ) -> Result < Statement > {
656656 allow ! ( self , Colon => {
657- let token = next!( self ) ;
658-
659657 return Ok ( Statement :: Labeled {
660658 label: label,
661- body: Box :: new( try!( self . statement ( token ) ) )
659+ body: Box :: new( try!( self . expect_statement ( ) ) )
662660 } )
663661 } ) ;
664662
@@ -712,6 +710,25 @@ impl<'a> Parser<'a> {
712710 Ok ( statement)
713711 }
714712
713+ fn try_statement ( & mut self ) -> Result < Statement > {
714+ let body = try!( self . expect_statement ( ) ) ;
715+
716+ expect ! ( self , Catch ) ;
717+ expect ! ( self , ParenOpen ) ;
718+
719+ let error = expect_identifier ! ( self ) ;
720+
721+ expect ! ( self , ParenClose ) ;
722+
723+ let handler = try!( self . expect_statement ( ) ) ;
724+
725+ Ok ( Statement :: Try {
726+ body : Box :: new ( body) ,
727+ error : error,
728+ handler : Box :: new ( handler) ,
729+ } )
730+ }
731+
715732 #[ inline]
716733 fn break_statement ( & mut self ) -> Result < Statement > {
717734 let statement = Statement :: Break {
@@ -740,16 +757,13 @@ impl<'a> Parser<'a> {
740757
741758 expect ! ( self , ParenClose ) ;
742759
743- let token = next ! ( self ) ;
744- let consequent = Box :: new ( try!( self . statement ( token) ) ) ;
760+ let consequent = Box :: new ( try!( self . expect_statement ( ) ) ) ;
745761
746762 let alternate = match peek ! ( self ) {
747763 Else => {
748764 self . consume ( ) ;
749765
750- let token = next ! ( self ) ;
751-
752- Some ( Box :: new ( try!( self . statement ( token) ) ) )
766+ Some ( Box :: new ( try!( self . expect_statement ( ) ) ) )
753767 } ,
754768
755769 _ => None
@@ -770,8 +784,7 @@ impl<'a> Parser<'a> {
770784
771785 expect ! ( self , ParenClose ) ;
772786
773- let token = next ! ( self ) ;
774- let body = Box :: new ( try!( self . statement ( token) ) ) ;
787+ let body = Box :: new ( try!( self . expect_statement ( ) ) ) ;
775788
776789 Ok ( Statement :: While {
777790 test : test,
@@ -835,8 +848,7 @@ impl<'a> Parser<'a> {
835848 expect ! ( self , ParenClose ) ;
836849 }
837850
838- let token = next ! ( self ) ;
839- let body = Box :: new ( try!( self . statement ( token) ) ) ;
851+ let body = Box :: new ( try!( self . expect_statement ( ) ) ) ;
840852
841853 Ok ( Statement :: For {
842854 init : init,
@@ -852,8 +864,7 @@ impl<'a> Parser<'a> {
852864
853865 expect ! ( self , ParenClose ) ;
854866
855- let token = next ! ( self ) ;
856- let body = Box :: new ( try!( self . statement ( token) ) ) ;
867+ let body = Box :: new ( try!( self . expect_statement ( ) ) ) ;
857868
858869 Ok ( Statement :: ForIn {
859870 left : left,
@@ -867,8 +878,7 @@ impl<'a> Parser<'a> {
867878
868879 expect ! ( self , ParenClose ) ;
869880
870- let token = next ! ( self ) ;
871- let body = Box :: new ( try!( self . statement ( token) ) ) ;
881+ let body = Box :: new ( try!( self . expect_statement ( ) ) ) ;
872882
873883 Ok ( Statement :: ForIn {
874884 left : left,
@@ -882,8 +892,7 @@ impl<'a> Parser<'a> {
882892
883893 expect ! ( self , ParenClose ) ;
884894
885- let token = next ! ( self ) ;
886- let body = Box :: new ( try!( self . statement ( token) ) ) ;
895+ let body = Box :: new ( try!( self . expect_statement ( ) ) ) ;
887896
888897 Ok ( Statement :: ForOf {
889898 left : left,
@@ -1048,6 +1057,13 @@ impl<'a> Parser<'a> {
10481057 self . tokenizer . read_regular_expression ( )
10491058 }
10501059
1060+ #[ inline]
1061+ fn expect_statement ( & mut self ) -> Result < Statement > {
1062+ let token = next ! ( self ) ;
1063+
1064+ self . statement ( token)
1065+ }
1066+
10511067 #[ inline]
10521068 fn statement ( & mut self , token : Token ) -> Result < Statement > {
10531069 match token {
@@ -1063,6 +1079,7 @@ impl<'a> Parser<'a> {
10631079 For => self . for_statement ( ) ,
10641080 Identifier ( label) => self . labeled_or_expression_statement ( label) ,
10651081 Throw => self . throw_statement ( ) ,
1082+ Try => self . try_statement ( ) ,
10661083 _ => self . expression_statement ( token) ,
10671084 }
10681085 }
0 commit comments