@@ -280,7 +280,8 @@ def rule(parser, begin_loc, node, end_loc):
280
280
if node .loc is None and type (node ) in [
281
281
ast .List , ast .Dict , ast .Tuple , ast .Repr ,
282
282
ast .ListComp , ast .GeneratorExp ,
283
- ast .Call , ast .Subscript ]:
283
+ ast .Call , ast .Subscript ,
284
+ ast .arguments ]:
284
285
node .begin_loc , node .end_loc , node .loc = \
285
286
begin_loc , end_loc , begin_loc .join (end_loc )
286
287
return node
@@ -318,8 +319,9 @@ def _assignable(self, node):
318
319
return node
319
320
320
321
def _empty_arguments (self ):
321
- # TODO
322
- return None
322
+ return ast .arguments (args = [], defaults = [], vararg = None , kwarg = None ,
323
+ star_loc = None , vararg_loc = None , dstar_loc = None , kwarg_loc = None ,
324
+ default_equals_locs = [], begin_loc = None , end_loc = None , loc = None )
323
325
324
326
# Python-specific methods
325
327
@action (Alt (Newline (),
@@ -344,13 +346,13 @@ def eval_input(self, expr):
344
346
345
347
@action (Seq (Loc ('@' ), Rule ('dotted_name' ), Opt (BeginEnd ('(' , Rule ('arglist' ), ')' )),
346
348
Loc ('newline' )))
347
- def decorator (at_loc , dotted_name , call_opt , newline_loc ):
349
+ def decorator (self , at_loc , dotted_name , call_opt , newline_loc ):
348
350
"""decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE"""
349
351
name_loc , name = dotted_name
350
- expr = ast .Name (id = name , loc = name_loc )
352
+ expr = ast .Name (id = name , ctx = None , loc = name_loc )
351
353
if call_opt :
352
354
call_opt .func = expr
353
- call_opt .loc = name_loc .join (arglist_opt .loc )
355
+ call_opt .loc = name_loc .join (call_opt .loc )
354
356
expr = call_opt
355
357
return at_loc , expr
356
358
@@ -361,16 +363,24 @@ def decorator(at_loc, dotted_name, call_opt, newline_loc):
361
363
def decorated (self , decorators , classfuncdef ):
362
364
"""decorated: decorators (classdef | funcdef)"""
363
365
classfuncdef .at_locs = list (map (lambda x : x [0 ], decorators ))
364
- classfuncdef .decorator_list = list (map (lambda x : x [0 ], decorators ))
366
+ classfuncdef .decorator_list = list (map (lambda x : x [1 ], decorators ))
367
+ classfuncdef .loc = classfuncdef .loc .join (decorators [0 ][0 ])
365
368
return classfuncdef
366
369
367
370
@action (Seq (Loc ('def' ), Tok ('ident' ), Rule ('parameters' ), Loc (':' ), Rule ('suite' )))
368
371
def funcdef (self , def_loc , ident_tok , args , colon_loc , suite ):
369
372
"""funcdef: 'def' NAME parameters ':' suite"""
370
373
return ast .FunctionDef (name = ident_tok .value , args = args , body = suite , decorator_list = [],
371
- keyword_loc = def_loc , name_loc = ident_tok .value , colon_loc = colon_loc )
374
+ at_locs = [], keyword_loc = def_loc , name_loc = ident_tok .loc ,
375
+ colon_loc = colon_loc , loc = def_loc .join (suite [- 1 ].loc ))
376
+
377
+ @action (Opt (Rule ('varargslist' )))
378
+ def parameters_1 (self , args ):
379
+ if args is None :
380
+ args = self ._empty_arguments ()
381
+ return args
372
382
373
- parameters = BeginEnd ('(' , Rule ( 'varargslist' ) , ')' )
383
+ parameters = BeginEnd ('(' , parameters_1 , ')' )
374
384
"""parameters: '(' [varargslist] ')'"""
375
385
376
386
@action (Seq (Loc ('**' ), Tok ('ident' )))
@@ -389,7 +399,7 @@ def varargslist_2(self, star_loc, vararg_tok, kwarg_opt):
389
399
star_loc = star_loc , vararg_loc = vararg_tok .loc ,
390
400
dstar_loc = dstar_loc , kwarg_loc = kwarg_loc )
391
401
392
- pass
402
+ varargslist = Tok ( 'no' )
393
403
"""varargslist: ((fpdef ['=' test] ',')*
394
404
('*' NAME [',' '**' NAME] | '**' NAME) |
395
405
fpdef ['=' test] (',' fpdef ['=' test])* [','])"""
@@ -544,7 +554,7 @@ def raise_stmt(self, raise_loc, type_opt):
544
554
def import_name (self , import_loc , names ):
545
555
"""import_name: 'import' dotted_as_names"""
546
556
return ast .Import (names = names ,
547
- keyword_loc = import_loc , loc = keyword_loc .join (names [- 1 ].loc ))
557
+ keyword_loc = import_loc , loc = import_loc .join (names [- 1 ].loc ))
548
558
549
559
@action (Seq (Star (Loc ('.' )), Rule ('dotted_name' )))
550
560
def import_from_1 (self , dots , dotted_name ):
@@ -556,45 +566,61 @@ def import_from_2(self, dots):
556
566
557
567
@action (Loc ('*' ))
558
568
def import_from_3 (self , star_loc ):
559
- return [ast .alias (name = '*' , asname = None ,
560
- name_loc = star_loc , as_loc = None , asname_loc = None , loc = star_loc )]
569
+ return None , \
570
+ [ast .alias (name = '*' , asname = None ,
571
+ name_loc = star_loc , as_loc = None , asname_loc = None , loc = star_loc )], \
572
+ None
573
+
574
+ @action (Rule ('import_as_names' ))
575
+ def import_from_4 (self , names ):
576
+ return None , names , None
561
577
562
578
@action (Seq (Loc ('from' ), Alt (import_from_1 , import_from_2 ),
563
579
Loc ('import' ), Alt (import_from_3 ,
564
- BeginEnd ( '(' , Rule ('import_as_names' ), ')' ),
565
- Rule ( 'import_as_names' ) )))
580
+ Seq ( Loc ( '(' ) , Rule ('import_as_names' ), Loc ( ')' ) ),
581
+ import_from_4 )))
566
582
def import_from (self , from_loc , module_name , import_loc , names ):
567
583
"""import_from: ('from' ('.'* dotted_name | '.'+)
568
584
'import' ('*' | '(' import_as_names ')' | import_as_names))"""
569
585
dots , (module_loc , module ) = module_name
586
+ lparen_loc , names , rparen_loc = names
570
587
dots_loc = None
571
588
if dots != []:
572
589
dots_loc = dots [0 ].join (dots [- 1 ])
590
+ loc = from_loc .join (names [- 1 ].loc )
591
+ if rparen_loc :
592
+ loc = loc .join (rparen_loc )
573
593
return ast .ImportFrom (names = names , module = module , level = len (dots ),
574
594
keyword_loc = from_loc , dots_loc = dots_loc , module_loc = module_loc ,
575
- import_loc = import_loc )
595
+ import_loc = import_loc , lparen_loc = lparen_loc , rparen_loc = rparen_loc ,
596
+ loc = loc )
576
597
577
598
@action (Seq (Tok ('ident' ), Opt (Seq (Loc ('as' ), Tok ('ident' )))))
578
- def import_as_name (self , name , as_name_opt ):
599
+ def import_as_name (self , name_tok , as_name_opt ):
579
600
"""import_as_name: NAME ['as' NAME]"""
580
- asname = as_loc = None
581
- loc = name .loc
601
+ asname_name = asname_loc = as_loc = None
602
+ loc = name_tok .loc
582
603
if as_name_opt :
583
- asname , as_loc = as_name_opt
604
+ as_loc , asname = as_name_opt
605
+ asname_name = asname .value
606
+ asname_loc = asname .loc
584
607
loc = loc .join (asname .loc )
585
- return ast .alias (name = name .value , asname = asname . value ,
586
- loc = loc , as_loc = as_loc )
608
+ return ast .alias (name = name_tok .value , asname = asname_name ,
609
+ loc = loc , name_loc = name_tok . loc , as_loc = as_loc , asname_loc = asname_loc )
587
610
588
611
@action (Seq (Rule ('dotted_name' ), Opt (Seq (Loc ('as' ), Tok ('ident' )))))
589
612
def dotted_as_name (self , dotted_name , as_name_opt ):
590
613
"""dotted_as_name: dotted_name ['as' NAME]"""
591
- asname = as_loc = None
592
- loc , name = dotted_name
614
+ asname_name = asname_loc = as_loc = None
615
+ dotted_name_loc , dotted_name_name = dotted_name
616
+ loc = dotted_name_loc
593
617
if as_name_opt :
594
- asname , as_loc = as_name_opt
618
+ as_loc , asname = as_name_opt
619
+ asname_name = asname .value
620
+ asname_loc = asname .loc
595
621
loc = loc .join (asname .loc )
596
- return ast .alias (name = name , asname = asname . value ,
597
- loc = loc , as_loc = as_loc )
622
+ return ast .alias (name = dotted_name_name , asname = asname_name ,
623
+ loc = loc , name_loc = dotted_name_loc , as_loc = as_loc , asname_loc = asname_loc )
598
624
599
625
import_as_names = List (Rule ('import_as_name' ), ',' , trailing = True )
600
626
"""import_as_names: import_as_name (',' import_as_name)* [',']"""
@@ -708,25 +734,31 @@ def try_stmt_1(self, clauses, else_opt, finally_opt):
708
734
handlers = []
709
735
for clause in clauses :
710
736
handler , handler .colon_loc , handler .body = clause
737
+ handler .loc = handler .loc .join (handler .body [- 1 ].loc )
711
738
handlers .append (handler )
712
739
713
740
else_loc = else_colon_loc = orelse = None
741
+ loc = handlers [- 1 ].loc
714
742
if else_opt :
715
743
else_loc , else_colon_loc , orelse = else_opt
744
+ loc = orelse [- 1 ].loc
716
745
717
- stmt = ast .TryExcept (handlers = handlers , orelse = orelse ,
718
- else_loc = else_loc , else_colon_loc = else_colon_loc )
746
+ stmt = ast .TryExcept (body = None , handlers = handlers , orelse = orelse ,
747
+ else_loc = else_loc , else_colon_loc = else_colon_loc ,
748
+ loc = loc )
719
749
if finally_opt :
720
750
finally_loc , finally_colon_loc , finalbody = finally_opt
721
751
return ast .TryFinally (body = [stmt ], finalbody = finalbody ,
722
- finally_loc = finally_loc , finally_colon_loc = finally_colon_loc )
752
+ finally_loc = finally_loc , finally_colon_loc = finally_colon_loc ,
753
+ loc = finalbody [- 1 ].loc )
723
754
else :
724
755
return stmt
725
756
726
757
@action (Seq (Loc ('finally' ), Loc (':' ), Rule ('suite' )))
727
758
def try_stmt_2 (self , finally_loc , finally_colon_loc , finalbody ):
728
- return ast .TryFinally (finalbody = finalbody ,
729
- finally_loc = finally_loc , finally_colon_loc = finally_colon_loc )
759
+ return ast .TryFinally (body = None , finalbody = finalbody ,
760
+ finally_loc = finally_loc , finally_colon_loc = finally_colon_loc ,
761
+ loc = finalbody [- 1 ].loc )
730
762
731
763
@action (Seq (Loc ('try' ), Loc (':' ), Rule ('suite' ), Alt (try_stmt_1 , try_stmt_2 )))
732
764
def try_stmt (self , try_loc , try_colon_loc , body , stmt ):
@@ -741,7 +773,10 @@ def try_stmt(self, try_loc, try_colon_loc, body, stmt):
741
773
if stmt .body is None : # try..finally or try..except
742
774
stmt .body = body
743
775
else : # try..except..finally
744
- stmt .body .keyword_loc , stmt .body .try_colon_loc = try_loc , try_colon_loc
776
+ stmt .body [0 ].keyword_loc , stmt .body [0 ].try_colon_loc , stmt .body [0 ].body = \
777
+ try_loc , try_colon_loc , body
778
+ stmt .body [0 ].loc = stmt .body [0 ].loc .join (try_loc )
779
+ stmt .loc = stmt .loc .join (try_loc )
745
780
return stmt
746
781
747
782
@action (Seq (Loc ('with' ), Rule ('test' ), Opt (Rule ('with_var' )), Loc (':' ), Rule ('suite' )))
@@ -763,12 +798,15 @@ def with_stmt(self, with_loc, context, with_var, colon_loc, body):
763
798
def except_clause (self , except_loc , exc_opt ):
764
799
"""except_clause: 'except' [test [('as' | ',') test]]"""
765
800
type_ = name = as_loc = None
801
+ loc = except_loc
766
802
if exc_opt :
767
803
type_ , name_opt = exc_opt
804
+ loc = loc .join (type_ .loc )
768
805
if name_opt :
769
806
as_loc , name = name_opt
807
+ loc = loc .join (name .loc )
770
808
return ast .ExceptHandler (type = type_ , name = name ,
771
- except_loc = except_loc , as_loc = as_loc )
809
+ except_loc = except_loc , as_loc = as_loc , loc = loc )
772
810
773
811
@action (Plus (Rule ('stmt' )))
774
812
def suite_1 (self , stmts ):
@@ -785,13 +823,15 @@ def suite_1(self, stmts):
785
823
old_test = Alt (Rule ('or_test' ), Rule ('old_lambdef' ))
786
824
"""old_test: or_test | old_lambdef"""
787
825
788
- @action (Seq (Loc ('lambda' ), Opt (Rule ('varargslist' )), Loc (':' ), Rule (old_test )))
826
+ @action (Seq (Loc ('lambda' ), Opt (Rule ('varargslist' )), Loc (':' ), Rule (' old_test' )))
789
827
def old_lambdef (self , lambda_loc , args_opt , colon_loc , body ):
790
828
"""old_lambdef: 'lambda' [varargslist] ':' old_test"""
791
- args = self ._empty_arguments () if not args_opt else args_opt
792
- return ast .Lambda (args = args , body = body ,
793
- loc = lambda_loc .join (body .loc ),
794
- keyword_loc = lambda_loc , colon_loc = colon_loc )
829
+ if args_opt is None :
830
+ args_opt = self ._empty_arguments ()
831
+ args_opt .loc = colon_loc .begin ()
832
+ return ast .Lambda (args = args_opt , body = body ,
833
+ lambda_loc = lambda_loc , colon_loc = colon_loc ,
834
+ loc = lambda_loc .join (body .loc ))
795
835
# 2.x-only backwards compatibility end
796
836
797
837
@action (Seq (Rule ('or_test' ), Opt (Seq (Loc ('if' ), Rule ('or_test' ),
@@ -974,10 +1014,12 @@ def testlist_gexp_2(self, elts):
974
1014
@action (Seq (Loc ('lambda' ), Opt (Rule ('varargslist' )), Loc (':' ), Rule ('test' )))
975
1015
def lambdef (self , lambda_loc , args_opt , colon_loc , body ):
976
1016
"""lambdef: 'lambda' [varargslist] ':' test"""
977
- args = self ._empty_arguments () if not args_opt else args_opt
978
- return ast .Lambda (args = args , body = body ,
979
- loc = lambda_loc .join (body .loc ),
980
- keyword_loc = lambda_loc , colon_loc = colon_loc )
1017
+ if args_opt is None :
1018
+ args_opt = self ._empty_arguments ()
1019
+ args_opt .loc = colon_loc .begin ()
1020
+ return ast .Lambda (args = args_opt , body = body ,
1021
+ lambda_loc = lambda_loc , colon_loc = colon_loc ,
1022
+ loc = lambda_loc .join (body .loc ))
981
1023
982
1024
@action (Seq (Loc ('.' ), Tok ('ident' )))
983
1025
def trailer_1 (self , dot_loc , ident_tok ):
@@ -1230,7 +1272,7 @@ def compose(comprehensions):
1230
1272
def yield_expr (self , stmt_loc , exprs ):
1231
1273
"""yield_expr: 'yield' [testlist]"""
1232
1274
return ast .Yield (value = exprs ,
1233
- loc = stmt_loc .join (exprs .loc ), keyword_loc = stmt_loc )
1275
+ yield_loc = stmt_loc , loc = stmt_loc .join (exprs .loc ))
1234
1276
1235
1277
def for_code (code , version = (2 ,7 )):
1236
1278
return Parser (lexer .Lexer (source .Buffer (code ), version ))
0 commit comments