@@ -171,81 +171,49 @@ impl<'a> Parser<'a> {
171171
172172 #[ inline]
173173 fn object_member ( & mut self , token : Token ) -> Result < ObjectMember > {
174- Ok ( match token {
175-
176- Identifier ( key) |
177- Literal ( Value :: String ( key) ) |
178- Literal ( Value :: Number ( key) ) => {
179-
174+ let key = match token {
175+ Identifier ( key) => {
180176 match peek ! ( self ) {
181- Colon => {
182- self . consume ( ) ;
183- let key = ObjectKey :: Literal ( key) ;
177+ Colon | ParenOpen => ObjectKey :: Literal ( key) ,
184178
185- ObjectMember :: Value {
186- key : key,
187- value : try!( self . expression ( 0 ) ) ,
188- }
189- } ,
190-
191- ParenOpen => {
192- self . consume ( ) ;
193- let key = ObjectKey :: Literal ( key) ;
194-
195- ObjectMember :: Method {
196- key : key,
197- params : try!( self . parameter_list ( ) ) ,
198- body : try!( self . block_body ( ) )
199- }
200- } ,
201-
202- _ => ObjectMember :: Shorthand {
179+ _ => return Ok ( ObjectMember :: Shorthand {
203180 key : key,
204- }
181+ } )
205182 }
206183 } ,
207- Literal ( Value :: Binary ( num) ) => {
208- let key = ObjectKey :: Binary ( num) ;
209- match peek ! ( self ) {
210- Colon => {
211- self . consume ( ) ;
212-
213- ObjectMember :: Value {
214- key : key,
215- value : try!( self . expression ( 0 ) ) ,
216- }
217- } ,
218-
219- ParenOpen => {
220- self . consume ( ) ;
221184
222- ObjectMember :: Method {
223- key : key,
224- params : try!( self . parameter_list ( ) ) ,
225- body : try!( self . block_body ( ) )
226- }
227- } ,
228-
229- _ => unexpected_token ! ( self )
230- }
231- } ,
232185 BracketOpen => {
233186 let key = ObjectKey :: Computed ( try!( self . expression ( 0 ) ) ) ;
234187
235188 expect ! ( self , BracketClose ) ;
236189
237- match next ! ( self ) {
238- Colon => ObjectMember :: Value {
239- key : key,
240- value : try!( self . expression ( 0 ) ) ,
241- } ,
242- ParenOpen => ObjectMember :: Method {
243- key : key,
244- params : try!( self . parameter_list ( ) ) ,
245- body : try!( self . block_body ( ) ) ,
246- } ,
247- _ => unexpected_token ! ( self )
190+ key
191+ } ,
192+
193+ Literal ( Value :: String ( key) ) => ObjectKey :: Literal ( key) ,
194+
195+ Literal ( Value :: Number ( key) ) => ObjectKey :: Literal ( key) ,
196+
197+ Literal ( Value :: Binary ( num) ) => ObjectKey :: Binary ( num) ,
198+
199+ _ => {
200+ // Allow word tokens such as "null" and "typeof" as identifiers
201+ match token. as_word ( ) {
202+ Some ( key) => ObjectKey :: Literal ( key. into ( ) ) ,
203+ None => unexpected_token ! ( self )
248204 }
205+ }
206+ } ;
207+
208+ Ok ( match next ! ( self ) {
209+ Colon => ObjectMember :: Value {
210+ key : key,
211+ value : try!( self . expression ( 0 ) ) ,
212+ } ,
213+ ParenOpen => ObjectMember :: Method {
214+ key : key,
215+ params : try!( self . parameter_list ( ) ) ,
216+ body : try!( self . block_body ( ) ) ,
249217 } ,
250218 _ => unexpected_token ! ( self )
251219 } )
@@ -358,7 +326,19 @@ impl<'a> Parser<'a> {
358326 operand : Box :: new ( left) ,
359327 } ,
360328
361- Accessor => Expression :: member ( left, expect_identifier ! ( self ) ) ,
329+ Accessor => {
330+ let ident = match next ! ( self ) {
331+ Identifier ( ident) => ident,
332+
333+ // Allow word tokens such as "null" and "typeof" as identifiers
334+ token => match token. as_word ( ) {
335+ Some ( ident) => ident. into ( ) ,
336+ None => unexpected_token ! ( self )
337+ } ,
338+ } ;
339+
340+ Expression :: member ( left, ident)
341+ } ,
362342
363343 Conditional => Expression :: Conditional {
364344 test : Box :: new ( left) ,
0 commit comments