@@ -1674,18 +1674,8 @@ def render_function(
1674
1674
full_name = f .full_name
1675
1675
template_dict = {'full_name' : full_name }
1676
1676
template_dict ['name' ] = f .displayname
1677
-
1678
- if f .c_basename :
1679
- c_basename = f .c_basename
1680
- else :
1681
- fields = full_name .split ("." )
1682
- if fields [- 1 ] == '__new__' :
1683
- fields .pop ()
1684
- c_basename = "_" .join (fields )
1685
-
1686
- template_dict ['c_basename' ] = c_basename
1687
-
1688
- template_dict ['methoddef_name' ] = c_basename .upper () + "_METHODDEF"
1677
+ template_dict ['c_basename' ] = f .c_basename
1678
+ template_dict ['methoddef_name' ] = f .c_basename .upper () + "_METHODDEF"
1689
1679
1690
1680
template_dict ['docstring' ] = self .docstring_for_c_string (f )
1691
1681
@@ -2653,7 +2643,7 @@ class Function:
2653
2643
name : str
2654
2644
module : Module | Clinic
2655
2645
cls : Class | None
2656
- c_basename : str | None
2646
+ c_basename : str
2657
2647
full_name : str
2658
2648
return_converter : CReturnConverter
2659
2649
kind : FunctionKind
@@ -4577,6 +4567,11 @@ class ParamState(enum.IntEnum):
4577
4567
RIGHT_SQUARE_AFTER = 6
4578
4568
4579
4569
4570
+ class FunctionNames (NamedTuple ):
4571
+ full_name : str
4572
+ c_basename : str
4573
+
4574
+
4580
4575
class DSLParser :
4581
4576
function : Function | None
4582
4577
state : StateKeeper
@@ -4840,6 +4835,24 @@ def state_dsl_start(self, line: str) -> None:
4840
4835
4841
4836
self .next (self .state_modulename_name , line )
4842
4837
4838
+ @staticmethod
4839
+ def parse_function_names (line : str ) -> FunctionNames :
4840
+ left , as_ , right = line .partition (' as ' )
4841
+ full_name = left .strip ()
4842
+ c_basename = right .strip ()
4843
+ if as_ and not c_basename :
4844
+ fail ("No C basename provided after 'as' keyword" )
4845
+ if not c_basename :
4846
+ fields = full_name .split ("." )
4847
+ if fields [- 1 ] == '__new__' :
4848
+ fields .pop ()
4849
+ c_basename = "_" .join (fields )
4850
+ if not is_legal_py_identifier (full_name ):
4851
+ fail (f"Illegal function name: { full_name !r} " )
4852
+ if not is_legal_c_identifier (c_basename ):
4853
+ fail (f"Illegal C basename: { c_basename !r} " )
4854
+ return FunctionNames (full_name = full_name , c_basename = c_basename )
4855
+
4843
4856
def update_function_kind (self , fullname : str ) -> None :
4844
4857
fields = fullname .split ('.' )
4845
4858
name = fields .pop ()
@@ -4877,17 +4890,10 @@ def state_modulename_name(self, line: str) -> None:
4877
4890
4878
4891
# are we cloning?
4879
4892
before , equals , existing = line .rpartition ('=' )
4880
- c_basename : str | None
4881
4893
if equals :
4882
- full_name , as_ , c_basename = before .partition (' as ' )
4883
- full_name = full_name .strip ()
4884
- c_basename = c_basename .strip ()
4885
- if as_ and not c_basename :
4886
- fail ("No C basename provided after 'as' keyword" )
4894
+ full_name , c_basename = self .parse_function_names (before )
4887
4895
existing = existing .strip ()
4888
- if (is_legal_py_identifier (full_name ) and
4889
- (not c_basename or is_legal_c_identifier (c_basename )) and
4890
- is_legal_py_identifier (existing )):
4896
+ if is_legal_py_identifier (existing ):
4891
4897
# we're cloning!
4892
4898
fields = [x .strip () for x in existing .split ('.' )]
4893
4899
function_name = fields .pop ()
@@ -4933,16 +4939,7 @@ def state_modulename_name(self, line: str) -> None:
4933
4939
4934
4940
line , _ , returns = line .partition ('->' )
4935
4941
returns = returns .strip ()
4936
-
4937
- full_name , as_ , c_basename = line .partition (' as ' )
4938
- full_name = full_name .strip ()
4939
- c_basename = c_basename .strip () or None
4940
- if as_ and not c_basename :
4941
- fail ("No C basename provided after 'as' keyword" )
4942
- if not is_legal_py_identifier (full_name ):
4943
- fail (f"Illegal function name: { full_name !r} " )
4944
- if c_basename and not is_legal_c_identifier (c_basename ):
4945
- fail (f"Illegal C basename: { c_basename !r} " )
4942
+ full_name , c_basename = self .parse_function_names (line )
4946
4943
4947
4944
return_converter = None
4948
4945
if returns :
0 commit comments