Cython 3.2.0__cp39-abi3-win32.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 (333) hide show
  1. Cython/Build/BuildExecutable.py +169 -0
  2. Cython/Build/Cache.py +199 -0
  3. Cython/Build/Cythonize.py +350 -0
  4. Cython/Build/Dependencies.py +1314 -0
  5. Cython/Build/Distutils.py +1 -0
  6. Cython/Build/Inline.py +463 -0
  7. Cython/Build/IpythonMagic.py +560 -0
  8. Cython/Build/SharedModule.py +94 -0
  9. Cython/Build/Tests/TestCyCache.py +194 -0
  10. Cython/Build/Tests/TestCythonizeArgsParser.py +481 -0
  11. Cython/Build/Tests/TestDependencies.py +133 -0
  12. Cython/Build/Tests/TestInline.py +177 -0
  13. Cython/Build/Tests/TestIpythonMagic.py +287 -0
  14. Cython/Build/Tests/TestRecythonize.py +212 -0
  15. Cython/Build/Tests/TestStripLiterals.py +155 -0
  16. Cython/Build/Tests/__init__.py +1 -0
  17. Cython/Build/__init__.py +11 -0
  18. Cython/CodeWriter.py +815 -0
  19. Cython/Compiler/AnalysedTreeTransforms.py +97 -0
  20. Cython/Compiler/Annotate.py +328 -0
  21. Cython/Compiler/AutoDocTransforms.py +320 -0
  22. Cython/Compiler/Buffer.py +680 -0
  23. Cython/Compiler/Builtin.py +984 -0
  24. Cython/Compiler/CmdLine.py +263 -0
  25. Cython/Compiler/Code.pxd +149 -0
  26. Cython/Compiler/Code.py +3746 -0
  27. Cython/Compiler/Code.pyd +0 -0
  28. Cython/Compiler/CodeGeneration.py +33 -0
  29. Cython/Compiler/CythonScope.py +191 -0
  30. Cython/Compiler/Dataclass.py +864 -0
  31. Cython/Compiler/DebugFlags.py +24 -0
  32. Cython/Compiler/Errors.py +297 -0
  33. Cython/Compiler/ExprNodes.py +15562 -0
  34. Cython/Compiler/FlowControl.pxd +97 -0
  35. Cython/Compiler/FlowControl.py +1451 -0
  36. Cython/Compiler/FlowControl.pyd +0 -0
  37. Cython/Compiler/FusedNode.py +971 -0
  38. Cython/Compiler/FusedNode.pyd +0 -0
  39. Cython/Compiler/Future.py +16 -0
  40. Cython/Compiler/Interpreter.py +57 -0
  41. Cython/Compiler/Lexicon.py +421 -0
  42. Cython/Compiler/LineTable.py +114 -0
  43. Cython/Compiler/LineTable.pyd +0 -0
  44. Cython/Compiler/Main.py +857 -0
  45. Cython/Compiler/MatchCaseNodes.py +259 -0
  46. Cython/Compiler/MemoryView.py +905 -0
  47. Cython/Compiler/ModuleNode.py +4235 -0
  48. Cython/Compiler/Naming.py +363 -0
  49. Cython/Compiler/Nodes.py +10831 -0
  50. Cython/Compiler/Optimize.py +5288 -0
  51. Cython/Compiler/Options.py +843 -0
  52. Cython/Compiler/ParseTreeTransforms.pxd +78 -0
  53. Cython/Compiler/ParseTreeTransforms.py +4638 -0
  54. Cython/Compiler/Parsing.pxd +9 -0
  55. Cython/Compiler/Parsing.py +4775 -0
  56. Cython/Compiler/Parsing.pyd +0 -0
  57. Cython/Compiler/Pipeline.py +439 -0
  58. Cython/Compiler/PyrexTypes.py +5870 -0
  59. Cython/Compiler/Pythran.py +232 -0
  60. Cython/Compiler/Scanning.pxd +48 -0
  61. Cython/Compiler/Scanning.py +701 -0
  62. Cython/Compiler/Scanning.pyd +0 -0
  63. Cython/Compiler/StringEncoding.py +298 -0
  64. Cython/Compiler/Symtab.py +3073 -0
  65. Cython/Compiler/Tests/TestBuffer.py +105 -0
  66. Cython/Compiler/Tests/TestBuiltin.py +72 -0
  67. Cython/Compiler/Tests/TestCmdLine.py +586 -0
  68. Cython/Compiler/Tests/TestCode.py +144 -0
  69. Cython/Compiler/Tests/TestFlowControl.py +65 -0
  70. Cython/Compiler/Tests/TestGrammar.py +202 -0
  71. Cython/Compiler/Tests/TestMemView.py +71 -0
  72. Cython/Compiler/Tests/TestParseTreeTransforms.py +285 -0
  73. Cython/Compiler/Tests/TestScanning.py +134 -0
  74. Cython/Compiler/Tests/TestSignatureMatching.py +73 -0
  75. Cython/Compiler/Tests/TestStringEncoding.py +21 -0
  76. Cython/Compiler/Tests/TestTreeFragment.py +63 -0
  77. Cython/Compiler/Tests/TestTreePath.py +103 -0
  78. Cython/Compiler/Tests/TestTypes.py +75 -0
  79. Cython/Compiler/Tests/TestUtilityLoad.py +112 -0
  80. Cython/Compiler/Tests/TestVisitor.py +61 -0
  81. Cython/Compiler/Tests/Utils.py +36 -0
  82. Cython/Compiler/Tests/__init__.py +1 -0
  83. Cython/Compiler/TreeFragment.py +278 -0
  84. Cython/Compiler/TreePath.py +303 -0
  85. Cython/Compiler/TypeInference.py +591 -0
  86. Cython/Compiler/TypeSlots.py +1174 -0
  87. Cython/Compiler/UFuncs.py +311 -0
  88. Cython/Compiler/UtilNodes.py +389 -0
  89. Cython/Compiler/UtilityCode.py +344 -0
  90. Cython/Compiler/Version.py +8 -0
  91. Cython/Compiler/Visitor.pxd +53 -0
  92. Cython/Compiler/Visitor.py +861 -0
  93. Cython/Compiler/Visitor.pyd +0 -0
  94. Cython/Compiler/__init__.py +1 -0
  95. Cython/Coverage.py +448 -0
  96. Cython/Debugger/Cygdb.py +177 -0
  97. Cython/Debugger/DebugWriter.py +82 -0
  98. Cython/Debugger/Tests/TestLibCython.py +275 -0
  99. Cython/Debugger/Tests/__init__.py +1 -0
  100. Cython/Debugger/Tests/cfuncs.c +8 -0
  101. Cython/Debugger/Tests/codefile +49 -0
  102. Cython/Debugger/Tests/test_libcython_in_gdb.py +578 -0
  103. Cython/Debugger/Tests/test_libpython_in_gdb.py +90 -0
  104. Cython/Debugger/__init__.py +1 -0
  105. Cython/Debugger/libcython.py +1548 -0
  106. Cython/Debugger/libpython.py +2821 -0
  107. Cython/Debugging.py +20 -0
  108. Cython/Distutils/__init__.py +2 -0
  109. Cython/Distutils/build_ext.py +139 -0
  110. Cython/Distutils/extension.py +96 -0
  111. Cython/Distutils/old_build_ext.py +351 -0
  112. Cython/Includes/cpython/__init__.pxd +173 -0
  113. Cython/Includes/cpython/array.pxd +178 -0
  114. Cython/Includes/cpython/bool.pxd +37 -0
  115. Cython/Includes/cpython/buffer.pxd +112 -0
  116. Cython/Includes/cpython/bytearray.pxd +33 -0
  117. Cython/Includes/cpython/bytes.pxd +200 -0
  118. Cython/Includes/cpython/cellobject.pxd +35 -0
  119. Cython/Includes/cpython/ceval.pxd +8 -0
  120. Cython/Includes/cpython/codecs.pxd +121 -0
  121. Cython/Includes/cpython/complex.pxd +60 -0
  122. Cython/Includes/cpython/contextvars.pxd +145 -0
  123. Cython/Includes/cpython/conversion.pxd +36 -0
  124. Cython/Includes/cpython/datetime.pxd +395 -0
  125. Cython/Includes/cpython/descr.pxd +26 -0
  126. Cython/Includes/cpython/dict.pxd +187 -0
  127. Cython/Includes/cpython/exc.pxd +263 -0
  128. Cython/Includes/cpython/fileobject.pxd +57 -0
  129. Cython/Includes/cpython/float.pxd +47 -0
  130. Cython/Includes/cpython/function.pxd +65 -0
  131. Cython/Includes/cpython/genobject.pxd +25 -0
  132. Cython/Includes/cpython/getargs.pxd +12 -0
  133. Cython/Includes/cpython/instance.pxd +25 -0
  134. Cython/Includes/cpython/iterator.pxd +36 -0
  135. Cython/Includes/cpython/iterobject.pxd +24 -0
  136. Cython/Includes/cpython/list.pxd +92 -0
  137. Cython/Includes/cpython/long.pxd +149 -0
  138. Cython/Includes/cpython/longintrepr.pxd +14 -0
  139. Cython/Includes/cpython/mapping.pxd +63 -0
  140. Cython/Includes/cpython/marshal.pxd +66 -0
  141. Cython/Includes/cpython/mem.pxd +120 -0
  142. Cython/Includes/cpython/memoryview.pxd +50 -0
  143. Cython/Includes/cpython/method.pxd +49 -0
  144. Cython/Includes/cpython/module.pxd +208 -0
  145. Cython/Includes/cpython/number.pxd +258 -0
  146. Cython/Includes/cpython/object.pxd +433 -0
  147. Cython/Includes/cpython/pycapsule.pxd +143 -0
  148. Cython/Includes/cpython/pylifecycle.pxd +68 -0
  149. Cython/Includes/cpython/pyport.pxd +8 -0
  150. Cython/Includes/cpython/pystate.pxd +95 -0
  151. Cython/Includes/cpython/pythread.pxd +53 -0
  152. Cython/Includes/cpython/ref.pxd +141 -0
  153. Cython/Includes/cpython/sequence.pxd +134 -0
  154. Cython/Includes/cpython/set.pxd +119 -0
  155. Cython/Includes/cpython/slice.pxd +70 -0
  156. Cython/Includes/cpython/time.pxd +129 -0
  157. Cython/Includes/cpython/tuple.pxd +72 -0
  158. Cython/Includes/cpython/type.pxd +53 -0
  159. Cython/Includes/cpython/unicode.pxd +639 -0
  160. Cython/Includes/cpython/version.pxd +32 -0
  161. Cython/Includes/cpython/weakref.pxd +78 -0
  162. Cython/Includes/libc/__init__.pxd +1 -0
  163. Cython/Includes/libc/complex.pxd +35 -0
  164. Cython/Includes/libc/errno.pxd +127 -0
  165. Cython/Includes/libc/float.pxd +43 -0
  166. Cython/Includes/libc/limits.pxd +28 -0
  167. Cython/Includes/libc/locale.pxd +46 -0
  168. Cython/Includes/libc/math.pxd +209 -0
  169. Cython/Includes/libc/setjmp.pxd +10 -0
  170. Cython/Includes/libc/signal.pxd +64 -0
  171. Cython/Includes/libc/stddef.pxd +9 -0
  172. Cython/Includes/libc/stdint.pxd +105 -0
  173. Cython/Includes/libc/stdio.pxd +80 -0
  174. Cython/Includes/libc/stdlib.pxd +72 -0
  175. Cython/Includes/libc/string.pxd +50 -0
  176. Cython/Includes/libc/threads.pxd +234 -0
  177. Cython/Includes/libc/time.pxd +52 -0
  178. Cython/Includes/libcpp/__init__.pxd +4 -0
  179. Cython/Includes/libcpp/algorithm.pxd +320 -0
  180. Cython/Includes/libcpp/any.pxd +16 -0
  181. Cython/Includes/libcpp/atomic.pxd +59 -0
  182. Cython/Includes/libcpp/barrier.pxd +22 -0
  183. Cython/Includes/libcpp/bit.pxd +29 -0
  184. Cython/Includes/libcpp/cast.pxd +12 -0
  185. Cython/Includes/libcpp/cmath.pxd +518 -0
  186. Cython/Includes/libcpp/complex.pxd +106 -0
  187. Cython/Includes/libcpp/condition_variable.pxd +322 -0
  188. Cython/Includes/libcpp/deque.pxd +165 -0
  189. Cython/Includes/libcpp/exception.pxd +86 -0
  190. Cython/Includes/libcpp/execution.pxd +15 -0
  191. Cython/Includes/libcpp/forward_list.pxd +63 -0
  192. Cython/Includes/libcpp/functional.pxd +26 -0
  193. Cython/Includes/libcpp/future.pxd +103 -0
  194. Cython/Includes/libcpp/iterator.pxd +34 -0
  195. Cython/Includes/libcpp/latch.pxd +17 -0
  196. Cython/Includes/libcpp/limits.pxd +61 -0
  197. Cython/Includes/libcpp/list.pxd +117 -0
  198. Cython/Includes/libcpp/map.pxd +252 -0
  199. Cython/Includes/libcpp/memory.pxd +115 -0
  200. Cython/Includes/libcpp/mutex.pxd +387 -0
  201. Cython/Includes/libcpp/numbers.pxd +15 -0
  202. Cython/Includes/libcpp/numeric.pxd +131 -0
  203. Cython/Includes/libcpp/optional.pxd +34 -0
  204. Cython/Includes/libcpp/pair.pxd +1 -0
  205. Cython/Includes/libcpp/queue.pxd +25 -0
  206. Cython/Includes/libcpp/random.pxd +166 -0
  207. Cython/Includes/libcpp/semaphore.pxd +43 -0
  208. Cython/Includes/libcpp/set.pxd +228 -0
  209. Cython/Includes/libcpp/shared_mutex.pxd +96 -0
  210. Cython/Includes/libcpp/span.pxd +87 -0
  211. Cython/Includes/libcpp/stack.pxd +11 -0
  212. Cython/Includes/libcpp/stop_token.pxd +117 -0
  213. Cython/Includes/libcpp/string.pxd +355 -0
  214. Cython/Includes/libcpp/string_view.pxd +183 -0
  215. Cython/Includes/libcpp/typeindex.pxd +15 -0
  216. Cython/Includes/libcpp/typeinfo.pxd +10 -0
  217. Cython/Includes/libcpp/unordered_map.pxd +193 -0
  218. Cython/Includes/libcpp/unordered_set.pxd +152 -0
  219. Cython/Includes/libcpp/utility.pxd +30 -0
  220. Cython/Includes/libcpp/vector.pxd +186 -0
  221. Cython/Includes/numpy/math.pxd +150 -0
  222. Cython/Includes/openmp.pxd +50 -0
  223. Cython/Includes/posix/__init__.pxd +1 -0
  224. Cython/Includes/posix/dlfcn.pxd +14 -0
  225. Cython/Includes/posix/fcntl.pxd +86 -0
  226. Cython/Includes/posix/ioctl.pxd +4 -0
  227. Cython/Includes/posix/mman.pxd +101 -0
  228. Cython/Includes/posix/resource.pxd +57 -0
  229. Cython/Includes/posix/select.pxd +21 -0
  230. Cython/Includes/posix/signal.pxd +73 -0
  231. Cython/Includes/posix/stat.pxd +98 -0
  232. Cython/Includes/posix/stdio.pxd +37 -0
  233. Cython/Includes/posix/stdlib.pxd +29 -0
  234. Cython/Includes/posix/strings.pxd +9 -0
  235. Cython/Includes/posix/time.pxd +71 -0
  236. Cython/Includes/posix/types.pxd +30 -0
  237. Cython/Includes/posix/uio.pxd +26 -0
  238. Cython/Includes/posix/unistd.pxd +271 -0
  239. Cython/Includes/posix/wait.pxd +38 -0
  240. Cython/Plex/Actions.pxd +24 -0
  241. Cython/Plex/Actions.py +119 -0
  242. Cython/Plex/Actions.pyd +0 -0
  243. Cython/Plex/DFA.pxd +14 -0
  244. Cython/Plex/DFA.py +164 -0
  245. Cython/Plex/DFA.pyd +0 -0
  246. Cython/Plex/Errors.py +48 -0
  247. Cython/Plex/Lexicons.py +178 -0
  248. Cython/Plex/Machines.pxd +36 -0
  249. Cython/Plex/Machines.py +238 -0
  250. Cython/Plex/Machines.pyd +0 -0
  251. Cython/Plex/Regexps.py +535 -0
  252. Cython/Plex/Scanners.pxd +45 -0
  253. Cython/Plex/Scanners.py +328 -0
  254. Cython/Plex/Scanners.pyd +0 -0
  255. Cython/Plex/Transitions.pxd +14 -0
  256. Cython/Plex/Transitions.py +239 -0
  257. Cython/Plex/Transitions.pyd +0 -0
  258. Cython/Plex/__init__.py +34 -0
  259. Cython/Runtime/__init__.py +1 -0
  260. Cython/Runtime/refnanny.pyd +0 -0
  261. Cython/Runtime/refnanny.pyx +237 -0
  262. Cython/Shadow.py +690 -0
  263. Cython/Shadow.pyi +521 -0
  264. Cython/StringIOTree.py +170 -0
  265. Cython/StringIOTree.pyd +0 -0
  266. Cython/Tempita/__init__.py +4 -0
  267. Cython/Tempita/_looper.py +154 -0
  268. Cython/Tempita/_tempita.py +1091 -0
  269. Cython/Tempita/_tempita.pyd +0 -0
  270. Cython/TestUtils.py +422 -0
  271. Cython/Tests/TestCodeWriter.py +128 -0
  272. Cython/Tests/TestCythonUtils.py +202 -0
  273. Cython/Tests/TestJediTyper.py +223 -0
  274. Cython/Tests/TestShadow.py +114 -0
  275. Cython/Tests/TestStringIOTree.py +67 -0
  276. Cython/Tests/TestTestUtils.py +90 -0
  277. Cython/Tests/__init__.py +1 -0
  278. Cython/Tests/xmlrunner.py +390 -0
  279. Cython/Utility/AsyncGen.c +1031 -0
  280. Cython/Utility/Buffer.c +865 -0
  281. Cython/Utility/BufferFormatFromTypeInfo.pxd +2 -0
  282. Cython/Utility/Builtins.c +810 -0
  283. Cython/Utility/CConvert.pyx +134 -0
  284. Cython/Utility/CMath.c +104 -0
  285. Cython/Utility/CommonStructures.c +226 -0
  286. Cython/Utility/Complex.c +378 -0
  287. Cython/Utility/Coroutine.c +2300 -0
  288. Cython/Utility/CpdefEnums.pyx +103 -0
  289. Cython/Utility/CppConvert.pyx +282 -0
  290. Cython/Utility/CppSupport.cpp +151 -0
  291. Cython/Utility/CythonFunction.c +1832 -0
  292. Cython/Utility/Dataclasses.c +101 -0
  293. Cython/Utility/Embed.c +121 -0
  294. Cython/Utility/Exceptions.c +1016 -0
  295. Cython/Utility/ExtensionTypes.c +996 -0
  296. Cython/Utility/FunctionArguments.c +1043 -0
  297. Cython/Utility/FusedFunction.pyx +44 -0
  298. Cython/Utility/ImportExport.c +907 -0
  299. Cython/Utility/MemoryView.pxd +188 -0
  300. Cython/Utility/MemoryView.pyx +1482 -0
  301. Cython/Utility/MemoryView_C.c +927 -0
  302. Cython/Utility/ModuleSetupCode.c +3203 -0
  303. Cython/Utility/NumpyImportArray.c +46 -0
  304. Cython/Utility/ObjectHandling.c +3273 -0
  305. Cython/Utility/Optimize.c +1603 -0
  306. Cython/Utility/Overflow.c +384 -0
  307. Cython/Utility/Printing.c +86 -0
  308. Cython/Utility/Profile.c +732 -0
  309. Cython/Utility/StringTools.c +1379 -0
  310. Cython/Utility/Synchronization.c +399 -0
  311. Cython/Utility/TString.c +356 -0
  312. Cython/Utility/TestCyUtilityLoader.pyx +8 -0
  313. Cython/Utility/TestCythonScope.pyx +75 -0
  314. Cython/Utility/TestUtilityLoader.c +12 -0
  315. Cython/Utility/TypeConversion.c +1385 -0
  316. Cython/Utility/UFuncs.pyx +50 -0
  317. Cython/Utility/UFuncs_C.c +89 -0
  318. Cython/Utility/__init__.py +28 -0
  319. Cython/Utility/arrayarray.h +167 -0
  320. Cython/Utils.py +687 -0
  321. Cython/Utils.pyd +0 -0
  322. Cython/__init__.py +10 -0
  323. Cython/__init__.pyi +7 -0
  324. Cython/py.typed +0 -0
  325. cython-3.2.0.dist-info/METADATA +85 -0
  326. cython-3.2.0.dist-info/RECORD +333 -0
  327. cython-3.2.0.dist-info/WHEEL +5 -0
  328. cython-3.2.0.dist-info/entry_points.txt +4 -0
  329. cython-3.2.0.dist-info/top_level.txt +3 -0
  330. cython.py +29 -0
  331. pyximport/__init__.py +4 -0
  332. pyximport/pyxbuild.py +160 -0
  333. pyximport/pyximport.py +482 -0
@@ -0,0 +1,320 @@
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(allow_unknown_nodes=True)
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\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 is_constructor:
221
+ class_name = None
222
+ func_name = node.name
223
+ if self.is_format_c:
224
+ func_name = self.class_name
225
+ hide_self = True
226
+ else:
227
+ class_name, func_name = self.class_name, node.name
228
+ else:
229
+ class_name, func_name = self.class_name, node.name
230
+
231
+ npoargs = getattr(node, 'num_posonly_args', 0)
232
+ nkargs = getattr(node, 'num_kwonly_args', 0)
233
+ npargs = len(node.args) - nkargs - npoargs
234
+ signature = self._fmt_signature(
235
+ class_name, func_name, node.args,
236
+ npoargs, npargs, node.star_arg,
237
+ nkargs, node.starstar_arg,
238
+ return_expr=node.return_type_annotation,
239
+ return_type=None, hide_self=hide_self)
240
+ if signature:
241
+ if is_constructor and self.is_format_c:
242
+ doc_holder = self.class_node.entry.type.scope
243
+ else:
244
+ doc_holder = node.entry
245
+ if doc_holder.doc is not None:
246
+ old_doc = doc_holder.doc
247
+ elif not is_constructor and getattr(node, 'py_func', None) is not None:
248
+ old_doc = node.py_func.entry.doc
249
+ else:
250
+ old_doc = None
251
+ new_doc = self._embed_signature(signature, old_doc)
252
+ if not node.entry.is_special or is_constructor or node.entry.wrapperbase_cname is not None:
253
+ # TODO: the wrapperbase must be generated for __doc__ to exist;
254
+ # however this phase is run later in the pipeline than
255
+ # Compiler/Nodes.py:declare_pyfunction, so wrapperbase_cname
256
+ # may already be set to None
257
+ doc_holder.doc = EncodedString(new_doc)
258
+ if not is_constructor and getattr(node, 'py_func', None) is not None:
259
+ node.py_func.entry.doc = EncodedString(new_doc)
260
+ return node
261
+
262
+ def visit_CFuncDefNode(self, node):
263
+ if not node.overridable: # not cpdef FOO(...):
264
+ return node
265
+ if not self.current_directives['embedsignature']:
266
+ return node
267
+ self._setup_format()
268
+
269
+ signature = self._fmt_signature(
270
+ self.class_name, node.declarator.base.name,
271
+ node.declarator.args,
272
+ return_type=node.return_type)
273
+ if signature:
274
+ if node.entry.doc is not None:
275
+ old_doc = node.entry.doc
276
+ elif getattr(node, 'py_func', None) is not None:
277
+ old_doc = node.py_func.entry.doc
278
+ else:
279
+ old_doc = None
280
+ new_doc = self._embed_signature(signature, old_doc)
281
+ node.entry.doc = EncodedString(new_doc)
282
+ py_func = getattr(node, 'py_func', None)
283
+ if py_func is not None:
284
+ py_func.entry.doc = EncodedString(new_doc)
285
+ return node
286
+
287
+ def visit_PropertyNode(self, node):
288
+ if not self.current_directives['embedsignature']:
289
+ return node
290
+ self._setup_format()
291
+
292
+ entry = node.entry
293
+ body = node.body
294
+ prop_name = entry.name
295
+ type_name = None
296
+ if entry.visibility == 'public':
297
+ if self.is_format_c:
298
+ # property synthesised from a cdef public attribute
299
+ type_name = entry.type.declaration_code("", for_display=1)
300
+ if not entry.type.is_pyobject:
301
+ type_name = "'%s'" % type_name
302
+ elif entry.type.is_extension_type:
303
+ type_name = entry.type.module_name + '.' + type_name
304
+ elif self.is_format_python:
305
+ type_name = self._fmt_type(entry.type)
306
+ if type_name is None:
307
+ for stat in body.stats:
308
+ if stat.name != '__get__':
309
+ continue
310
+ if self.is_format_c:
311
+ prop_name = '%s.%s' % (self.class_name, prop_name)
312
+ ret_annotation = stat.return_type_annotation
313
+ if ret_annotation:
314
+ type_name = self._fmt_annotation(ret_annotation)
315
+ if type_name is not None :
316
+ signature = '%s: %s' % (prop_name, type_name)
317
+ new_doc = self._embed_signature(signature, entry.doc)
318
+ if not self.is_format_clinic:
319
+ entry.doc = EncodedString(new_doc)
320
+ return node