@@ -546,7 +546,7 @@ def object_method_noinparams(t):
546546 body = t [6 ]
547547 t [0 ] = ast .method (site (t ), name ,
548548 (inp , outp , throws , [], body ),
549- t [5 ], t [2 ], lex_end_site (t , - 1 ))
549+ t [5 ], t [2 ], False , lex_end_site (t , - 1 ))
550550
551551
552552@prod_dml12
@@ -573,7 +573,7 @@ def object_method(t):
573573 body = t [10 ]
574574 t [0 ] = ast .method (site (t ), name ,
575575 (inp , outp , throws , [], body ),
576- t [9 ], t [2 ], lex_end_site (t , - 1 ))
576+ t [9 ], t [2 ], False , lex_end_site (t , - 1 ))
577577
578578
579579def method_qualifiers_check (site , qualifiers , inp , outp , throws , default ):
@@ -598,33 +598,58 @@ def method_qualifiers_check(site, qualifiers, inp, outp, throws, default):
598598 "startup methods may not be declared 'default'" ))
599599 return (inp , outp )
600600
601+ @prod_dml14
602+ def maybe_colon_yes (t ):
603+ '''maybe_colon : COLON'''
604+ if not site (t ).provisional_enabled (provisional .explicit_method_decls ):
605+ report (ESYNTAX (site (t ), ':' , "expected '=' or 'default'" ))
606+ t [0 ] = False
607+ else :
608+ t [0 ] = True
609+
610+ @prod
611+ def maybe_colon_no (t ):
612+ '''maybe_colon : '''
613+ t [0 ] = False
601614
602615@prod_dml14
603616def object_method (t ):
604- '''method : method_qualifiers METHOD objident method_params_typed maybe_default compound_statement'''
617+ '''method : method_qualifiers METHOD objident method_params_typed maybe_colon maybe_default compound_statement'''
605618 name = t [3 ]
606619 (inp , outp , throws ) = t [4 ]
607- body = t [6 ]
620+ body = t [7 ]
621+ (inp , outp ) = method_qualifiers_check (site (t ), t [1 ], inp , outp , throws ,
622+ t [6 ])
623+ t [0 ] = ast .method (site (t ), name ,
624+ (inp , outp , throws , t [1 ], body ),
625+ t [6 ], False , t [5 ], lex_end_site (t , - 1 ))
626+
627+ @prod_dml14
628+ def object_method_abstract (t ):
629+ '''method : method_qualifiers METHOD objident method_params_typed SEMI'''
630+ name = t [3 ]
631+ (inp , outp , throws ) = t [4 ]
632+ body = None
608633 (inp , outp ) = method_qualifiers_check (site (t ), t [1 ], inp , outp , throws ,
609- t [ 5 ] )
634+ False )
610635 t [0 ] = ast .method (site (t ), name ,
611636 (inp , outp , throws , t [1 ], body ),
612- t [ 5 ] , False , lex_end_site (t , - 1 ))
637+ True , False , None , site (t , 5 ))
613638
614639@prod_dml14
615640def object_inline_method (t ):
616- '''method : INLINE METHOD objident method_params_maybe_untyped maybe_default compound_statement'''
641+ '''method : INLINE METHOD objident method_params_maybe_untyped maybe_colon maybe_default compound_statement'''
617642 name = t [3 ]
618643 (inp , outp , throws ) = t [4 ]
619644 if all (typ for (_ , asite , name , typ ) in inp ):
620645 # inline annotation would have no effect for fully typed methods.
621646 # We forbid it as a way to strongly discourage unneeded use of inline.
622647 report (ESYNTAX (site (t , 2 ), 'inline' ,
623648 'only use inline if there are untyped arguments' ))
624- body = t [6 ]
649+ body = t [7 ]
625650 t [0 ] = ast .method (site (t ), name ,
626651 (inp , outp , throws , [], body ),
627- t [5 ], False , lex_end_site (t , - 1 ))
652+ t [6 ], False , t [ 5 ] , lex_end_site (t , - 1 ))
628653
629654
630655@prod_dml12
@@ -724,12 +749,13 @@ def template_statement_obj(t):
724749@prod_dml14
725750def template_statement_shared_method (t ):
726751 '''template_stmt : SHARED method_qualifiers METHOD shared_method'''
727- (name , (inp , outp , throws ), overridable , body , rbrace_site ) = t [4 ]
752+ (name , (inp , outp , throws ), overridable , explicit_decl , body ,
753+ rbrace_site ) = t [4 ]
728754 default = overridable and body is not None
729755 (inp , outp ) = method_qualifiers_check (site (t ), t [2 ], inp , outp , throws ,
730756 default )
731757 t [0 ] = [ast .sharedmethod (site (t ), name , inp , outp , throws , t [2 ],
732- overridable , body , rbrace_site )]
758+ overridable , explicit_decl , body , rbrace_site )]
733759
734760@prod_dml14
735761def template_statement_shared_hook (t ):
@@ -759,23 +785,24 @@ def method_qualifiers(t):
759785@prod_dml12
760786def trait_method (t ):
761787 '''trait_method : METHOD shared_method'''
762- (name , (inp , outp , throws ), overridable , body , rbrace_site ) = t [2 ]
788+ (name , (inp , outp , throws ), overridable , explicit_decl , body ,
789+ rbrace_site ) = t [2 ]
763790 t [0 ] = ast .sharedmethod (site (t ), name , inp , outp , throws , [], overridable ,
764- body , rbrace_site )
791+ explicit_decl , body , rbrace_site )
765792
766793@prod
767794def shared_method_abstract (t ):
768795 '''shared_method : ident method_params_typed SEMI'''
769- t [0 ] = (t [1 ], t [2 ], True , None , site (t , 3 ))
796+ t [0 ] = (t [1 ], t [2 ], True , False , None , site (t , 3 ))
770797@prod
771798def shared_method_default (t ):
772- '''shared_method : ident method_params_typed DEFAULT compound_statement'''
773- t [0 ] = (t [1 ], t [2 ], True , t [4 ], lex_end_site (t , - 1 ))
799+ '''shared_method : ident method_params_typed maybe_colon DEFAULT compound_statement'''
800+ t [0 ] = (t [1 ], t [2 ], True , t [3 ], t [ 5 ], lex_end_site (t , - 1 ))
774801
775802@prod
776803def shared_method_final (t ):
777- '''shared_method : ident method_params_typed compound_statement'''
778- t [0 ] = (t [1 ], t [2 ], False , t [3 ], lex_end_site (t , - 1 ))
804+ '''shared_method : ident method_params_typed maybe_colon compound_statement'''
805+ t [0 ] = (t [1 ], t [2 ], False , t [3 ], t [ 4 ], lex_end_site (t , - 1 ))
779806
780807@prod_dml12
781808def trait_param (t ):
0 commit comments