Cython 3.1.0a1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (301) hide show
  1. Cython/Build/BuildExecutable.py +169 -0
  2. Cython/Build/Cache.py +199 -0
  3. Cython/Build/Cythonize.py +250 -0
  4. Cython/Build/Dependencies.py +1275 -0
  5. Cython/Build/Distutils.py +1 -0
  6. Cython/Build/Inline.py +342 -0
  7. Cython/Build/IpythonMagic.py +560 -0
  8. Cython/Build/Tests/TestCyCache.py +119 -0
  9. Cython/Build/Tests/TestCythonizeArgsParser.py +481 -0
  10. Cython/Build/Tests/TestDependencies.py +133 -0
  11. Cython/Build/Tests/TestInline.py +112 -0
  12. Cython/Build/Tests/TestIpythonMagic.py +287 -0
  13. Cython/Build/Tests/TestRecythonize.py +212 -0
  14. Cython/Build/Tests/TestStripLiterals.py +155 -0
  15. Cython/Build/Tests/__init__.py +1 -0
  16. Cython/Build/__init__.py +8 -0
  17. Cython/CodeWriter.py +811 -0
  18. Cython/Compiler/AnalysedTreeTransforms.py +97 -0
  19. Cython/Compiler/Annotate.py +326 -0
  20. Cython/Compiler/AutoDocTransforms.py +314 -0
  21. Cython/Compiler/Buffer.py +680 -0
  22. Cython/Compiler/Builtin.py +862 -0
  23. Cython/Compiler/CmdLine.py +243 -0
  24. Cython/Compiler/Code.pxd +145 -0
  25. Cython/Compiler/Code.py +3328 -0
  26. Cython/Compiler/CodeGeneration.py +33 -0
  27. Cython/Compiler/CythonScope.py +179 -0
  28. Cython/Compiler/Dataclass.py +868 -0
  29. Cython/Compiler/DebugFlags.py +21 -0
  30. Cython/Compiler/Errors.py +295 -0
  31. Cython/Compiler/ExprNodes.py +15051 -0
  32. Cython/Compiler/FlowControl.pxd +97 -0
  33. Cython/Compiler/FlowControl.py +1438 -0
  34. Cython/Compiler/FusedNode.py +998 -0
  35. Cython/Compiler/Future.py +16 -0
  36. Cython/Compiler/Interpreter.py +57 -0
  37. Cython/Compiler/Lexicon.py +340 -0
  38. Cython/Compiler/LineTable.py +114 -0
  39. Cython/Compiler/Main.py +779 -0
  40. Cython/Compiler/MatchCaseNodes.py +259 -0
  41. Cython/Compiler/MemoryView.py +860 -0
  42. Cython/Compiler/ModuleNode.py +4065 -0
  43. Cython/Compiler/Naming.py +369 -0
  44. Cython/Compiler/Nodes.py +10557 -0
  45. Cython/Compiler/Optimize.py +5269 -0
  46. Cython/Compiler/Options.py +828 -0
  47. Cython/Compiler/ParseTreeTransforms.pxd +78 -0
  48. Cython/Compiler/ParseTreeTransforms.py +4441 -0
  49. Cython/Compiler/Parsing.pxd +9 -0
  50. Cython/Compiler/Parsing.py +4797 -0
  51. Cython/Compiler/Pipeline.py +425 -0
  52. Cython/Compiler/PyrexTypes.py +5572 -0
  53. Cython/Compiler/Pythran.py +223 -0
  54. Cython/Compiler/Scanning.pxd +40 -0
  55. Cython/Compiler/Scanning.py +574 -0
  56. Cython/Compiler/StringEncoding.py +347 -0
  57. Cython/Compiler/Symtab.py +2998 -0
  58. Cython/Compiler/Tests/TestBuffer.py +105 -0
  59. Cython/Compiler/Tests/TestBuiltin.py +72 -0
  60. Cython/Compiler/Tests/TestCmdLine.py +573 -0
  61. Cython/Compiler/Tests/TestCode.py +86 -0
  62. Cython/Compiler/Tests/TestFlowControl.py +65 -0
  63. Cython/Compiler/Tests/TestGrammar.py +202 -0
  64. Cython/Compiler/Tests/TestMemView.py +71 -0
  65. Cython/Compiler/Tests/TestParseTreeTransforms.py +285 -0
  66. Cython/Compiler/Tests/TestScanning.py +134 -0
  67. Cython/Compiler/Tests/TestSignatureMatching.py +73 -0
  68. Cython/Compiler/Tests/TestStringEncoding.py +33 -0
  69. Cython/Compiler/Tests/TestTreeFragment.py +63 -0
  70. Cython/Compiler/Tests/TestTreePath.py +93 -0
  71. Cython/Compiler/Tests/TestTypes.py +75 -0
  72. Cython/Compiler/Tests/TestUtilityLoad.py +112 -0
  73. Cython/Compiler/Tests/TestVisitor.py +61 -0
  74. Cython/Compiler/Tests/Utils.py +36 -0
  75. Cython/Compiler/Tests/__init__.py +1 -0
  76. Cython/Compiler/TreeFragment.py +278 -0
  77. Cython/Compiler/TreePath.py +290 -0
  78. Cython/Compiler/TypeInference.py +584 -0
  79. Cython/Compiler/TypeSlots.py +1181 -0
  80. Cython/Compiler/UFuncs.py +311 -0
  81. Cython/Compiler/UtilNodes.py +387 -0
  82. Cython/Compiler/UtilityCode.py +274 -0
  83. Cython/Compiler/Version.py +8 -0
  84. Cython/Compiler/Visitor.pxd +53 -0
  85. Cython/Compiler/Visitor.py +861 -0
  86. Cython/Compiler/__init__.py +1 -0
  87. Cython/Coverage.py +443 -0
  88. Cython/Debugger/Cygdb.py +179 -0
  89. Cython/Debugger/DebugWriter.py +82 -0
  90. Cython/Debugger/Tests/TestLibCython.py +275 -0
  91. Cython/Debugger/Tests/__init__.py +1 -0
  92. Cython/Debugger/Tests/cfuncs.c +8 -0
  93. Cython/Debugger/Tests/codefile +49 -0
  94. Cython/Debugger/Tests/test_libcython_in_gdb.py +578 -0
  95. Cython/Debugger/Tests/test_libpython_in_gdb.py +90 -0
  96. Cython/Debugger/__init__.py +1 -0
  97. Cython/Debugger/libcython.py +1549 -0
  98. Cython/Debugger/libpython.py +2821 -0
  99. Cython/Debugging.py +20 -0
  100. Cython/Distutils/__init__.py +2 -0
  101. Cython/Distutils/build_ext.py +137 -0
  102. Cython/Distutils/extension.py +96 -0
  103. Cython/Distutils/old_build_ext.py +351 -0
  104. Cython/Includes/cpython/__init__.pxd +173 -0
  105. Cython/Includes/cpython/array.pxd +174 -0
  106. Cython/Includes/cpython/bool.pxd +37 -0
  107. Cython/Includes/cpython/buffer.pxd +112 -0
  108. Cython/Includes/cpython/bytearray.pxd +33 -0
  109. Cython/Includes/cpython/bytes.pxd +200 -0
  110. Cython/Includes/cpython/cellobject.pxd +35 -0
  111. Cython/Includes/cpython/ceval.pxd +8 -0
  112. Cython/Includes/cpython/codecs.pxd +121 -0
  113. Cython/Includes/cpython/complex.pxd +55 -0
  114. Cython/Includes/cpython/contextvars.pxd +141 -0
  115. Cython/Includes/cpython/conversion.pxd +36 -0
  116. Cython/Includes/cpython/datetime.pxd +384 -0
  117. Cython/Includes/cpython/descr.pxd +26 -0
  118. Cython/Includes/cpython/dict.pxd +187 -0
  119. Cython/Includes/cpython/exc.pxd +263 -0
  120. Cython/Includes/cpython/fileobject.pxd +57 -0
  121. Cython/Includes/cpython/float.pxd +47 -0
  122. Cython/Includes/cpython/function.pxd +65 -0
  123. Cython/Includes/cpython/genobject.pxd +25 -0
  124. Cython/Includes/cpython/getargs.pxd +12 -0
  125. Cython/Includes/cpython/instance.pxd +25 -0
  126. Cython/Includes/cpython/iterator.pxd +36 -0
  127. Cython/Includes/cpython/iterobject.pxd +24 -0
  128. Cython/Includes/cpython/list.pxd +92 -0
  129. Cython/Includes/cpython/long.pxd +149 -0
  130. Cython/Includes/cpython/longintrepr.pxd +19 -0
  131. Cython/Includes/cpython/mapping.pxd +63 -0
  132. Cython/Includes/cpython/marshal.pxd +66 -0
  133. Cython/Includes/cpython/mem.pxd +120 -0
  134. Cython/Includes/cpython/memoryview.pxd +50 -0
  135. Cython/Includes/cpython/method.pxd +49 -0
  136. Cython/Includes/cpython/module.pxd +208 -0
  137. Cython/Includes/cpython/number.pxd +258 -0
  138. Cython/Includes/cpython/object.pxd +433 -0
  139. Cython/Includes/cpython/pycapsule.pxd +143 -0
  140. Cython/Includes/cpython/pylifecycle.pxd +68 -0
  141. Cython/Includes/cpython/pyport.pxd +8 -0
  142. Cython/Includes/cpython/pystate.pxd +95 -0
  143. Cython/Includes/cpython/pythread.pxd +53 -0
  144. Cython/Includes/cpython/ref.pxd +67 -0
  145. Cython/Includes/cpython/sequence.pxd +134 -0
  146. Cython/Includes/cpython/set.pxd +119 -0
  147. Cython/Includes/cpython/slice.pxd +70 -0
  148. Cython/Includes/cpython/time.pxd +129 -0
  149. Cython/Includes/cpython/tuple.pxd +72 -0
  150. Cython/Includes/cpython/type.pxd +53 -0
  151. Cython/Includes/cpython/unicode.pxd +639 -0
  152. Cython/Includes/cpython/version.pxd +32 -0
  153. Cython/Includes/cpython/weakref.pxd +42 -0
  154. Cython/Includes/libc/__init__.pxd +1 -0
  155. Cython/Includes/libc/complex.pxd +35 -0
  156. Cython/Includes/libc/errno.pxd +127 -0
  157. Cython/Includes/libc/float.pxd +43 -0
  158. Cython/Includes/libc/limits.pxd +28 -0
  159. Cython/Includes/libc/locale.pxd +46 -0
  160. Cython/Includes/libc/math.pxd +209 -0
  161. Cython/Includes/libc/setjmp.pxd +10 -0
  162. Cython/Includes/libc/signal.pxd +64 -0
  163. Cython/Includes/libc/stddef.pxd +9 -0
  164. Cython/Includes/libc/stdint.pxd +105 -0
  165. Cython/Includes/libc/stdio.pxd +80 -0
  166. Cython/Includes/libc/stdlib.pxd +72 -0
  167. Cython/Includes/libc/string.pxd +50 -0
  168. Cython/Includes/libc/time.pxd +47 -0
  169. Cython/Includes/libcpp/__init__.pxd +4 -0
  170. Cython/Includes/libcpp/algorithm.pxd +320 -0
  171. Cython/Includes/libcpp/any.pxd +16 -0
  172. Cython/Includes/libcpp/atomic.pxd +59 -0
  173. Cython/Includes/libcpp/bit.pxd +29 -0
  174. Cython/Includes/libcpp/cast.pxd +12 -0
  175. Cython/Includes/libcpp/cmath.pxd +518 -0
  176. Cython/Includes/libcpp/complex.pxd +106 -0
  177. Cython/Includes/libcpp/deque.pxd +165 -0
  178. Cython/Includes/libcpp/execution.pxd +15 -0
  179. Cython/Includes/libcpp/forward_list.pxd +63 -0
  180. Cython/Includes/libcpp/functional.pxd +26 -0
  181. Cython/Includes/libcpp/iterator.pxd +34 -0
  182. Cython/Includes/libcpp/limits.pxd +61 -0
  183. Cython/Includes/libcpp/list.pxd +117 -0
  184. Cython/Includes/libcpp/map.pxd +252 -0
  185. Cython/Includes/libcpp/memory.pxd +115 -0
  186. Cython/Includes/libcpp/numbers.pxd +15 -0
  187. Cython/Includes/libcpp/numeric.pxd +131 -0
  188. Cython/Includes/libcpp/optional.pxd +34 -0
  189. Cython/Includes/libcpp/pair.pxd +1 -0
  190. Cython/Includes/libcpp/queue.pxd +25 -0
  191. Cython/Includes/libcpp/random.pxd +166 -0
  192. Cython/Includes/libcpp/set.pxd +228 -0
  193. Cython/Includes/libcpp/stack.pxd +11 -0
  194. Cython/Includes/libcpp/string.pxd +333 -0
  195. Cython/Includes/libcpp/typeindex.pxd +15 -0
  196. Cython/Includes/libcpp/typeinfo.pxd +10 -0
  197. Cython/Includes/libcpp/unordered_map.pxd +193 -0
  198. Cython/Includes/libcpp/unordered_set.pxd +152 -0
  199. Cython/Includes/libcpp/utility.pxd +30 -0
  200. Cython/Includes/libcpp/vector.pxd +167 -0
  201. Cython/Includes/openmp.pxd +50 -0
  202. Cython/Includes/posix/__init__.pxd +1 -0
  203. Cython/Includes/posix/dlfcn.pxd +14 -0
  204. Cython/Includes/posix/fcntl.pxd +86 -0
  205. Cython/Includes/posix/ioctl.pxd +4 -0
  206. Cython/Includes/posix/mman.pxd +101 -0
  207. Cython/Includes/posix/resource.pxd +57 -0
  208. Cython/Includes/posix/select.pxd +21 -0
  209. Cython/Includes/posix/signal.pxd +73 -0
  210. Cython/Includes/posix/stat.pxd +98 -0
  211. Cython/Includes/posix/stdio.pxd +37 -0
  212. Cython/Includes/posix/stdlib.pxd +29 -0
  213. Cython/Includes/posix/strings.pxd +9 -0
  214. Cython/Includes/posix/time.pxd +71 -0
  215. Cython/Includes/posix/types.pxd +30 -0
  216. Cython/Includes/posix/uio.pxd +26 -0
  217. Cython/Includes/posix/unistd.pxd +271 -0
  218. Cython/Includes/posix/wait.pxd +38 -0
  219. Cython/Plex/Actions.pxd +24 -0
  220. Cython/Plex/Actions.py +119 -0
  221. Cython/Plex/DFA.pxd +14 -0
  222. Cython/Plex/DFA.py +164 -0
  223. Cython/Plex/Errors.py +48 -0
  224. Cython/Plex/Lexicons.py +178 -0
  225. Cython/Plex/Machines.pxd +36 -0
  226. Cython/Plex/Machines.py +238 -0
  227. Cython/Plex/Regexps.py +539 -0
  228. Cython/Plex/Scanners.pxd +47 -0
  229. Cython/Plex/Scanners.py +360 -0
  230. Cython/Plex/Transitions.pxd +14 -0
  231. Cython/Plex/Transitions.py +239 -0
  232. Cython/Plex/__init__.py +34 -0
  233. Cython/Runtime/__init__.py +1 -0
  234. Cython/Runtime/refnanny.pyx +261 -0
  235. Cython/Shadow.py +656 -0
  236. Cython/Shadow.pyi +521 -0
  237. Cython/StringIOTree.py +170 -0
  238. Cython/Tempita/__init__.py +4 -0
  239. Cython/Tempita/_looper.py +154 -0
  240. Cython/Tempita/_tempita.py +1091 -0
  241. Cython/TestUtils.py +417 -0
  242. Cython/Tests/TestCodeWriter.py +128 -0
  243. Cython/Tests/TestCythonUtils.py +202 -0
  244. Cython/Tests/TestJediTyper.py +223 -0
  245. Cython/Tests/TestShadow.py +114 -0
  246. Cython/Tests/TestStringIOTree.py +67 -0
  247. Cython/Tests/TestTestUtils.py +90 -0
  248. Cython/Tests/__init__.py +1 -0
  249. Cython/Tests/xmlrunner.py +390 -0
  250. Cython/Utility/AsyncGen.c +1263 -0
  251. Cython/Utility/Buffer.c +875 -0
  252. Cython/Utility/Builtins.c +660 -0
  253. Cython/Utility/CConvert.pyx +134 -0
  254. Cython/Utility/CMath.c +95 -0
  255. Cython/Utility/CommonStructures.c +139 -0
  256. Cython/Utility/Complex.c +378 -0
  257. Cython/Utility/Coroutine.c +2413 -0
  258. Cython/Utility/CpdefEnums.pyx +108 -0
  259. Cython/Utility/CppConvert.pyx +279 -0
  260. Cython/Utility/CppSupport.cpp +133 -0
  261. Cython/Utility/CythonFunction.c +1851 -0
  262. Cython/Utility/Dataclasses.c +185 -0
  263. Cython/Utility/Dataclasses.py +112 -0
  264. Cython/Utility/Embed.c +125 -0
  265. Cython/Utility/Exceptions.c +1017 -0
  266. Cython/Utility/ExtensionTypes.c +797 -0
  267. Cython/Utility/FunctionArguments.c +573 -0
  268. Cython/Utility/ImportExport.c +912 -0
  269. Cython/Utility/MemoryView.pyx +1478 -0
  270. Cython/Utility/MemoryView_C.c +992 -0
  271. Cython/Utility/ModuleSetupCode.c +2501 -0
  272. Cython/Utility/NumpyImportArray.c +46 -0
  273. Cython/Utility/ObjectHandling.c +3054 -0
  274. Cython/Utility/Optimize.c +1533 -0
  275. Cython/Utility/Overflow.c +404 -0
  276. Cython/Utility/Printing.c +86 -0
  277. Cython/Utility/Profile.c +660 -0
  278. Cython/Utility/StringTools.c +1206 -0
  279. Cython/Utility/TestCyUtilityLoader.pyx +8 -0
  280. Cython/Utility/TestCythonScope.pyx +75 -0
  281. Cython/Utility/TestUtilityLoader.c +12 -0
  282. Cython/Utility/TypeConversion.c +1329 -0
  283. Cython/Utility/UFuncs.pyx +50 -0
  284. Cython/Utility/UFuncs_C.c +89 -0
  285. Cython/Utility/__init__.py +28 -0
  286. Cython/Utility/arrayarray.h +143 -0
  287. Cython/Utils.py +687 -0
  288. Cython/__init__.py +10 -0
  289. Cython/__init__.pyi +7 -0
  290. Cython/py.typed +0 -0
  291. Cython-3.1.0a1.dist-info/COPYING.txt +19 -0
  292. Cython-3.1.0a1.dist-info/LICENSE.txt +176 -0
  293. Cython-3.1.0a1.dist-info/METADATA +67 -0
  294. Cython-3.1.0a1.dist-info/RECORD +301 -0
  295. Cython-3.1.0a1.dist-info/WHEEL +5 -0
  296. Cython-3.1.0a1.dist-info/entry_points.txt +4 -0
  297. Cython-3.1.0a1.dist-info/top_level.txt +3 -0
  298. cython.py +29 -0
  299. pyximport/__init__.py +4 -0
  300. pyximport/pyxbuild.py +160 -0
  301. pyximport/pyximport.py +482 -0
@@ -0,0 +1,314 @@
1
+ import inspect
2
+
3
+ from .Visitor import CythonTransform
4
+ from .StringEncoding import EncodedString
5
+ from . import Options
6
+ from . import PyrexTypes
7
+ from ..CodeWriter import ExpressionWriter
8
+ from .Errors import warning
9
+
10
+
11
+ class AnnotationWriter(ExpressionWriter):
12
+ """
13
+ A Cython code writer for Python expressions in argument/variable annotations.
14
+ """
15
+ def __init__(self, description=None):
16
+ """description is optional. If specified it is used in
17
+ warning messages for the nodes that don't convert to string properly.
18
+ If not specified then no messages are generated.
19
+ """
20
+ ExpressionWriter.__init__(self)
21
+ self.description = description
22
+ self.incomplete = False
23
+
24
+ def visit_Node(self, node):
25
+ self.put("<???>")
26
+ self.incomplete = True
27
+ if self.description:
28
+ warning(node.pos,
29
+ "Failed to convert code to string representation in {}".format(
30
+ self.description), level=1)
31
+
32
+ def visit_LambdaNode(self, node):
33
+ # XXX Should we do better?
34
+ self.put("<lambda>")
35
+ self.incomplete = True
36
+ if self.description:
37
+ warning(node.pos,
38
+ "Failed to convert lambda to string representation in {}".format(
39
+ self.description), level=1)
40
+
41
+ def visit_AnnotationNode(self, node):
42
+ self.put(node.string.value)
43
+
44
+
45
+ class EmbedSignature(CythonTransform):
46
+
47
+ def __init__(self, context):
48
+ super().__init__(context)
49
+ self.class_name = None
50
+ self.class_node = None
51
+
52
+ def _fmt_expr(self, node):
53
+ writer = ExpressionWriter()
54
+ result = writer.write(node)
55
+ # print(type(node).__name__, '-->', result)
56
+ return result
57
+
58
+ def _fmt_annotation(self, node):
59
+ writer = AnnotationWriter()
60
+ result = writer.write(node)
61
+ # print(type(node).__name__, '-->', result)
62
+ return result
63
+
64
+ def _setup_format(self):
65
+ signature_format = self.current_directives['embedsignature.format']
66
+ self.is_format_c = signature_format == 'c'
67
+ self.is_format_python = signature_format == 'python'
68
+ self.is_format_clinic = signature_format == 'clinic'
69
+
70
+ def _fmt_arg(self, arg):
71
+ arg_doc = arg.name
72
+ annotation = None
73
+ defaultval = None
74
+ if arg.is_self_arg:
75
+ if self.is_format_clinic:
76
+ arg_doc = '$self'
77
+ elif arg.is_type_arg:
78
+ if self.is_format_clinic:
79
+ arg_doc = '$type'
80
+ elif self.is_format_c:
81
+ if arg.type is not PyrexTypes.py_object_type:
82
+ arg_doc = arg.type.declaration_code(arg.name, for_display=1)
83
+ elif self.is_format_python:
84
+ if not arg.annotation:
85
+ annotation = self._fmt_type(arg.type)
86
+ if arg.annotation:
87
+ if not self.is_format_clinic:
88
+ annotation = self._fmt_annotation(arg.annotation)
89
+ if arg.default:
90
+ defaultval = self._fmt_expr(arg.default)
91
+ if annotation:
92
+ arg_doc = arg_doc + (': %s' % annotation)
93
+ if defaultval:
94
+ arg_doc = arg_doc + (' = %s' % defaultval)
95
+ elif defaultval:
96
+ arg_doc = arg_doc + ('=%s' % defaultval)
97
+ return arg_doc
98
+
99
+ def _fmt_star_arg(self, arg):
100
+ arg_doc = arg.name
101
+ if arg.annotation:
102
+ if not self.is_format_clinic:
103
+ annotation = self._fmt_annotation(arg.annotation)
104
+ arg_doc = arg_doc + (': %s' % annotation)
105
+ return arg_doc
106
+
107
+ def _fmt_arglist(self, args,
108
+ npoargs=0, npargs=0, pargs=None,
109
+ nkargs=0, kargs=None,
110
+ hide_self=False):
111
+ arglist = []
112
+ for arg in args:
113
+ if not hide_self or not arg.entry.is_self_arg:
114
+ arg_doc = self._fmt_arg(arg)
115
+ arglist.append(arg_doc)
116
+ if pargs:
117
+ arg_doc = self._fmt_star_arg(pargs)
118
+ arglist.insert(npargs + npoargs, '*%s' % arg_doc)
119
+ elif nkargs:
120
+ arglist.insert(npargs + npoargs, '*')
121
+ if npoargs:
122
+ arglist.insert(npoargs, '/')
123
+ if kargs:
124
+ arg_doc = self._fmt_star_arg(kargs)
125
+ arglist.append('**%s' % arg_doc)
126
+ return arglist
127
+
128
+ def _fmt_type(self, type):
129
+ if type is PyrexTypes.py_object_type:
130
+ return None
131
+ elif self.is_format_c:
132
+ code = type.declaration_code("", for_display=1)
133
+ return code
134
+ elif self.is_format_python:
135
+ annotation = None
136
+ if type.is_string:
137
+ annotation = self.current_directives['c_string_type']
138
+ elif type.is_numeric:
139
+ annotation = type.py_type_name()
140
+ if annotation is None:
141
+ code = type.declaration_code('', for_display=1)
142
+ annotation = code.replace(' ', '_').replace('*', 'p')
143
+ return annotation
144
+ return None
145
+
146
+ def _fmt_signature(self, cls_name, func_name, args,
147
+ npoargs=0, npargs=0, pargs=None,
148
+ nkargs=0, kargs=None,
149
+ return_expr=None, return_type=None,
150
+ hide_self=False):
151
+ arglist = self._fmt_arglist(
152
+ args, npoargs, npargs, pargs, nkargs, kargs,
153
+ hide_self=hide_self,
154
+ )
155
+ arglist_doc = ', '.join(arglist)
156
+ func_doc = '%s(%s)' % (func_name, arglist_doc)
157
+ if self.is_format_c and cls_name:
158
+ func_doc = '%s.%s' % (cls_name, func_doc)
159
+ if not self.is_format_clinic:
160
+ ret_doc = None
161
+ if return_expr:
162
+ ret_doc = self._fmt_annotation(return_expr)
163
+ elif return_type:
164
+ ret_doc = self._fmt_type(return_type)
165
+ if ret_doc:
166
+ func_doc = '%s -> %s' % (func_doc, ret_doc)
167
+ return func_doc
168
+
169
+ def _embed_signature(self, signature, node_doc):
170
+ if self.is_format_clinic and self.current_directives['binding']:
171
+ return node_doc
172
+ if node_doc:
173
+ if self.is_format_clinic:
174
+ docfmt = "%s\n--\n\n%s"
175
+ else:
176
+ docfmt = "%s\n%s"
177
+ node_doc = inspect.cleandoc(node_doc)
178
+ return docfmt % (signature, node_doc)
179
+ else:
180
+ if self.is_format_clinic:
181
+ docfmt = "%s\n--\n\n"
182
+ else:
183
+ docfmt = "%s"
184
+ return docfmt % signature
185
+
186
+ def __call__(self, node):
187
+ if not Options.docstrings:
188
+ return node
189
+ else:
190
+ return super().__call__(node)
191
+
192
+ def visit_ClassDefNode(self, node):
193
+ oldname = self.class_name
194
+ oldclass = self.class_node
195
+ self.class_node = node
196
+ try:
197
+ # PyClassDefNode
198
+ self.class_name = node.name
199
+ except AttributeError:
200
+ # CClassDefNode
201
+ self.class_name = node.class_name
202
+ self.visitchildren(node)
203
+ self.class_name = oldname
204
+ self.class_node = oldclass
205
+ return node
206
+
207
+ def visit_LambdaNode(self, node):
208
+ # lambda expressions so not have signature or inner functions
209
+ return node
210
+
211
+ def visit_DefNode(self, node):
212
+ if not self.current_directives['embedsignature']:
213
+ return node
214
+ self._setup_format()
215
+
216
+ is_constructor = False
217
+ hide_self = False
218
+ if node.entry.is_special:
219
+ is_constructor = self.class_node and node.name == '__init__'
220
+ if not is_constructor:
221
+ return node
222
+ class_name = None
223
+ func_name = node.name
224
+ if self.is_format_c:
225
+ func_name = self.class_name
226
+ hide_self = True
227
+ else:
228
+ class_name, func_name = self.class_name, node.name
229
+
230
+ npoargs = getattr(node, 'num_posonly_args', 0)
231
+ nkargs = getattr(node, 'num_kwonly_args', 0)
232
+ npargs = len(node.args) - nkargs - npoargs
233
+ signature = self._fmt_signature(
234
+ class_name, func_name, node.args,
235
+ npoargs, npargs, node.star_arg,
236
+ nkargs, node.starstar_arg,
237
+ return_expr=node.return_type_annotation,
238
+ return_type=None, hide_self=hide_self)
239
+ if signature:
240
+ if is_constructor and self.is_format_c:
241
+ doc_holder = self.class_node.entry.type.scope
242
+ else:
243
+ doc_holder = node.entry
244
+ if doc_holder.doc is not None:
245
+ old_doc = doc_holder.doc
246
+ elif not is_constructor and getattr(node, 'py_func', None) is not None:
247
+ old_doc = node.py_func.entry.doc
248
+ else:
249
+ old_doc = None
250
+ new_doc = self._embed_signature(signature, old_doc)
251
+ doc_holder.doc = EncodedString(new_doc)
252
+ if not is_constructor and getattr(node, 'py_func', None) is not None:
253
+ node.py_func.entry.doc = EncodedString(new_doc)
254
+ return node
255
+
256
+ def visit_CFuncDefNode(self, node):
257
+ if not node.overridable: # not cpdef FOO(...):
258
+ return node
259
+ if not self.current_directives['embedsignature']:
260
+ return node
261
+ self._setup_format()
262
+
263
+ signature = self._fmt_signature(
264
+ self.class_name, node.declarator.base.name,
265
+ node.declarator.args,
266
+ return_type=node.return_type)
267
+ if signature:
268
+ if node.entry.doc is not None:
269
+ old_doc = node.entry.doc
270
+ elif getattr(node, 'py_func', None) is not None:
271
+ old_doc = node.py_func.entry.doc
272
+ else:
273
+ old_doc = None
274
+ new_doc = self._embed_signature(signature, old_doc)
275
+ node.entry.doc = EncodedString(new_doc)
276
+ py_func = getattr(node, 'py_func', None)
277
+ if py_func is not None:
278
+ py_func.entry.doc = EncodedString(new_doc)
279
+ return node
280
+
281
+ def visit_PropertyNode(self, node):
282
+ if not self.current_directives['embedsignature']:
283
+ return node
284
+ self._setup_format()
285
+
286
+ entry = node.entry
287
+ body = node.body
288
+ prop_name = entry.name
289
+ type_name = None
290
+ if entry.visibility == 'public':
291
+ if self.is_format_c:
292
+ # property synthesised from a cdef public attribute
293
+ type_name = entry.type.declaration_code("", for_display=1)
294
+ if not entry.type.is_pyobject:
295
+ type_name = "'%s'" % type_name
296
+ elif entry.type.is_extension_type:
297
+ type_name = entry.type.module_name + '.' + type_name
298
+ elif self.is_format_python:
299
+ type_name = self._fmt_type(entry.type)
300
+ if type_name is None:
301
+ for stat in body.stats:
302
+ if stat.name != '__get__':
303
+ continue
304
+ if self.is_format_c:
305
+ prop_name = '%s.%s' % (self.class_name, prop_name)
306
+ ret_annotation = stat.return_type_annotation
307
+ if ret_annotation:
308
+ type_name = self._fmt_annotation(ret_annotation)
309
+ if type_name is not None :
310
+ signature = '%s: %s' % (prop_name, type_name)
311
+ new_doc = self._embed_signature(signature, entry.doc)
312
+ if not self.is_format_clinic:
313
+ entry.doc = EncodedString(new_doc)
314
+ return node