1
- from astor import SourceGenerator
1
+ from . unparse import Unparser
2
2
3
- # For the Cython generator we re-use the astor code generator
3
+
4
+ # For the Cython generator we re-use the Unparser code generator
4
5
# and generate Cython code instead for nodes that have type information
5
- class CythonGenerator (SourceGenerator ):
6
-
7
- pass
6
+ class CythonGenerator (Unparser ):
7
+
8
+ def get_type_comment (self , node ):
9
+ comment = self ._type_ignores .get (node .lineno ) or node .type_comment
10
+ if comment is not None :
11
+ return comment
12
+
13
+ def visit_Assign (self , node ):
14
+ self .fill ()
15
+ for target in node .targets :
16
+ if type_comment := self .get_type_comment (node ):
17
+ self .write (f"cdef { type_comment } " )
18
+ self .traverse (target )
19
+ self .write (" = " )
20
+ self .traverse (node .value )
21
+
22
+ def _function_helper (self , node , fill_suffix ):
23
+ self .maybe_newline ()
24
+ for deco in node .decorator_list :
25
+ self .fill ("@" )
26
+ self .traverse (deco )
27
+ if node .returns :
28
+ self .fill ("cdef " )
29
+ self .traverse (node .returns )
30
+ self .write (" " + node .name )
31
+ else :
32
+ def_str = fill_suffix + " " + node .name
33
+ self .fill (def_str )
34
+ with self .delimit ("(" , ")" ):
35
+ self .traverse (node .args )
36
+ with self .block (extra = self .get_type_comment (node )):
37
+ self ._write_docstring_and_traverse_body (node )
38
+
39
+ def visit_arg (self , node ):
40
+ if node .annotation :
41
+ self .traverse (node .annotation )
42
+ self .write (" " )
43
+ self .write (node .arg )
0 commit comments