mypy-dev 1.9.0.dev0__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 (1018) hide show
  1. mypy/__init__.py +1 -0
  2. mypy/__main__.py +37 -0
  3. mypy/api.py +94 -0
  4. mypy/applytype.py +156 -0
  5. mypy/argmap.py +268 -0
  6. mypy/binder.py +538 -0
  7. mypy/bogus_type.py +27 -0
  8. mypy/build.py +3562 -0
  9. mypy/checker.py +8372 -0
  10. mypy/checkexpr.py +6615 -0
  11. mypy/checkmember.py +1356 -0
  12. mypy/checkpattern.py +801 -0
  13. mypy/checkstrformat.py +1109 -0
  14. mypy/config_parser.py +670 -0
  15. mypy/constant_fold.py +187 -0
  16. mypy/constraints.py +1624 -0
  17. mypy/copytype.py +133 -0
  18. mypy/defaults.py +46 -0
  19. mypy/dmypy/__init__.py +0 -0
  20. mypy/dmypy/__main__.py +6 -0
  21. mypy/dmypy/client.py +749 -0
  22. mypy/dmypy_os.py +42 -0
  23. mypy/dmypy_server.py +1107 -0
  24. mypy/dmypy_util.py +117 -0
  25. mypy/erasetype.py +278 -0
  26. mypy/errorcodes.py +285 -0
  27. mypy/errors.py +1280 -0
  28. mypy/evalexpr.py +205 -0
  29. mypy/expandtype.py +510 -0
  30. mypy/exprtotype.py +206 -0
  31. mypy/fastparse.py +2147 -0
  32. mypy/find_sources.py +243 -0
  33. mypy/fixup.py +426 -0
  34. mypy/freetree.py +23 -0
  35. mypy/fscache.py +309 -0
  36. mypy/fswatcher.py +106 -0
  37. mypy/gclogger.py +47 -0
  38. mypy/git.py +34 -0
  39. mypy/graph_utils.py +112 -0
  40. mypy/indirection.py +121 -0
  41. mypy/infer.py +75 -0
  42. mypy/inspections.py +627 -0
  43. mypy/ipc.py +310 -0
  44. mypy/join.py +866 -0
  45. mypy/literals.py +306 -0
  46. mypy/lookup.py +61 -0
  47. mypy/main.py +1574 -0
  48. mypy/maptype.py +106 -0
  49. mypy/meet.py +1140 -0
  50. mypy/memprofile.py +121 -0
  51. mypy/message_registry.py +326 -0
  52. mypy/messages.py +3171 -0
  53. mypy/metastore.py +225 -0
  54. mypy/mixedtraverser.py +112 -0
  55. mypy/modulefinder.py +875 -0
  56. mypy/moduleinspect.py +184 -0
  57. mypy/mro.py +62 -0
  58. mypy/nodes.py +4112 -0
  59. mypy/operators.py +126 -0
  60. mypy/options.py +556 -0
  61. mypy/parse.py +30 -0
  62. mypy/partially_defined.py +675 -0
  63. mypy/patterns.py +150 -0
  64. mypy/plugin.py +901 -0
  65. mypy/plugins/__init__.py +0 -0
  66. mypy/plugins/attrs.py +1152 -0
  67. mypy/plugins/common.py +440 -0
  68. mypy/plugins/ctypes.py +245 -0
  69. mypy/plugins/dataclasses.py +1101 -0
  70. mypy/plugins/default.py +518 -0
  71. mypy/plugins/enums.py +259 -0
  72. mypy/plugins/functools.py +104 -0
  73. mypy/plugins/proper_plugin.py +175 -0
  74. mypy/plugins/singledispatch.py +224 -0
  75. mypy/py.typed +1 -0
  76. mypy/pyinfo.py +78 -0
  77. mypy/reachability.py +362 -0
  78. mypy/refinfo.py +92 -0
  79. mypy/renaming.py +568 -0
  80. mypy/report.py +924 -0
  81. mypy/scope.py +125 -0
  82. mypy/semanal.py +7023 -0
  83. mypy/semanal_classprop.py +187 -0
  84. mypy/semanal_enum.py +253 -0
  85. mypy/semanal_infer.py +128 -0
  86. mypy/semanal_main.py +511 -0
  87. mypy/semanal_namedtuple.py +670 -0
  88. mypy/semanal_newtype.py +273 -0
  89. mypy/semanal_pass1.py +156 -0
  90. mypy/semanal_shared.py +490 -0
  91. mypy/semanal_typeargs.py +265 -0
  92. mypy/semanal_typeddict.py +575 -0
  93. mypy/server/__init__.py +0 -0
  94. mypy/server/astdiff.py +518 -0
  95. mypy/server/astmerge.py +562 -0
  96. mypy/server/aststrip.py +281 -0
  97. mypy/server/deps.py +1137 -0
  98. mypy/server/mergecheck.py +83 -0
  99. mypy/server/objgraph.py +101 -0
  100. mypy/server/subexpr.py +198 -0
  101. mypy/server/target.py +11 -0
  102. mypy/server/trigger.py +26 -0
  103. mypy/server/update.py +1339 -0
  104. mypy/sharedparse.py +112 -0
  105. mypy/solve.py +562 -0
  106. mypy/split_namespace.py +35 -0
  107. mypy/state.py +28 -0
  108. mypy/stats.py +489 -0
  109. mypy/strconv.py +641 -0
  110. mypy/stubdoc.py +491 -0
  111. mypy/stubgen.py +1873 -0
  112. mypy/stubgenc.py +993 -0
  113. mypy/stubinfo.py +173 -0
  114. mypy/stubtest.py +2079 -0
  115. mypy/stubutil.py +807 -0
  116. mypy/subtypes.py +1967 -0
  117. mypy/suggestions.py +1046 -0
  118. mypy/test/__init__.py +0 -0
  119. mypy/test/config.py +28 -0
  120. mypy/test/data.py +823 -0
  121. mypy/test/helpers.py +476 -0
  122. mypy/test/meta/__init__.py +0 -0
  123. mypy/test/meta/_pytest.py +72 -0
  124. mypy/test/meta/test_diff_helper.py +47 -0
  125. mypy/test/meta/test_parse_data.py +73 -0
  126. mypy/test/meta/test_update_data.py +135 -0
  127. mypy/test/test_find_sources.py +376 -0
  128. mypy/test/test_ref_info.py +45 -0
  129. mypy/test/testapi.py +45 -0
  130. mypy/test/testargs.py +77 -0
  131. mypy/test/testcheck.py +322 -0
  132. mypy/test/testcmdline.py +152 -0
  133. mypy/test/testconstraints.py +134 -0
  134. mypy/test/testdaemon.py +132 -0
  135. mypy/test/testdeps.py +77 -0
  136. mypy/test/testdiff.py +67 -0
  137. mypy/test/testerrorstream.py +46 -0
  138. mypy/test/testfinegrained.py +438 -0
  139. mypy/test/testfinegrainedcache.py +18 -0
  140. mypy/test/testformatter.py +85 -0
  141. mypy/test/testfscache.py +101 -0
  142. mypy/test/testgraph.py +83 -0
  143. mypy/test/testinfer.py +373 -0
  144. mypy/test/testipc.py +119 -0
  145. mypy/test/testmerge.py +238 -0
  146. mypy/test/testmodulefinder.py +278 -0
  147. mypy/test/testmypyc.py +14 -0
  148. mypy/test/testparse.py +107 -0
  149. mypy/test/testpep561.py +211 -0
  150. mypy/test/testpythoneval.py +117 -0
  151. mypy/test/testreports.py +55 -0
  152. mypy/test/testsemanal.py +209 -0
  153. mypy/test/testsolve.py +285 -0
  154. mypy/test/teststubgen.py +1412 -0
  155. mypy/test/teststubinfo.py +12 -0
  156. mypy/test/teststubtest.py +2492 -0
  157. mypy/test/testsubtypes.py +303 -0
  158. mypy/test/testtransform.py +64 -0
  159. mypy/test/testtypegen.py +83 -0
  160. mypy/test/testtypes.py +1551 -0
  161. mypy/test/testutil.py +111 -0
  162. mypy/test/typefixture.py +415 -0
  163. mypy/test/update_data.py +87 -0
  164. mypy/test/visitors.py +63 -0
  165. mypy/traverser.py +961 -0
  166. mypy/treetransform.py +800 -0
  167. mypy/tvar_scope.py +147 -0
  168. mypy/type_visitor.py +564 -0
  169. mypy/typeanal.py +2510 -0
  170. mypy/typeops.py +1082 -0
  171. mypy/types.py +3686 -0
  172. mypy/types_utils.py +166 -0
  173. mypy/typeshed/LICENSE +237 -0
  174. mypy/typeshed/stdlib/VERSIONS +308 -0
  175. mypy/typeshed/stdlib/__future__.pyi +36 -0
  176. mypy/typeshed/stdlib/__main__.pyi +3 -0
  177. mypy/typeshed/stdlib/_ast.pyi +587 -0
  178. mypy/typeshed/stdlib/_bisect.pyi +84 -0
  179. mypy/typeshed/stdlib/_bootlocale.pyi +1 -0
  180. mypy/typeshed/stdlib/_codecs.pyi +133 -0
  181. mypy/typeshed/stdlib/_collections_abc.pyi +94 -0
  182. mypy/typeshed/stdlib/_compat_pickle.pyi +8 -0
  183. mypy/typeshed/stdlib/_compression.pyi +25 -0
  184. mypy/typeshed/stdlib/_csv.pyi +90 -0
  185. mypy/typeshed/stdlib/_ctypes.pyi +205 -0
  186. mypy/typeshed/stdlib/_curses.pyi +557 -0
  187. mypy/typeshed/stdlib/_decimal.pyi +281 -0
  188. mypy/typeshed/stdlib/_dummy_thread.pyi +27 -0
  189. mypy/typeshed/stdlib/_dummy_threading.pyi +164 -0
  190. mypy/typeshed/stdlib/_heapq.pyi +11 -0
  191. mypy/typeshed/stdlib/_imp.pyi +28 -0
  192. mypy/typeshed/stdlib/_json.pyi +49 -0
  193. mypy/typeshed/stdlib/_locale.pyi +100 -0
  194. mypy/typeshed/stdlib/_markupbase.pyi +16 -0
  195. mypy/typeshed/stdlib/_msi.pyi +91 -0
  196. mypy/typeshed/stdlib/_operator.pyi +147 -0
  197. mypy/typeshed/stdlib/_osx_support.pyi +34 -0
  198. mypy/typeshed/stdlib/_posixsubprocess.pyi +32 -0
  199. mypy/typeshed/stdlib/_py_abc.pyi +14 -0
  200. mypy/typeshed/stdlib/_pydecimal.pyi +43 -0
  201. mypy/typeshed/stdlib/_random.pyi +12 -0
  202. mypy/typeshed/stdlib/_sitebuiltins.pyi +16 -0
  203. mypy/typeshed/stdlib/_socket.pyi +802 -0
  204. mypy/typeshed/stdlib/_stat.pyi +103 -0
  205. mypy/typeshed/stdlib/_thread.pyi +52 -0
  206. mypy/typeshed/stdlib/_threading_local.pyi +17 -0
  207. mypy/typeshed/stdlib/_tkinter.pyi +120 -0
  208. mypy/typeshed/stdlib/_tracemalloc.pyi +17 -0
  209. mypy/typeshed/stdlib/_typeshed/__init__.pyi +347 -0
  210. mypy/typeshed/stdlib/_typeshed/dbapi.pyi +37 -0
  211. mypy/typeshed/stdlib/_typeshed/wsgi.pyi +44 -0
  212. mypy/typeshed/stdlib/_typeshed/xml.pyi +9 -0
  213. mypy/typeshed/stdlib/_warnings.pyi +55 -0
  214. mypy/typeshed/stdlib/_weakref.pyi +41 -0
  215. mypy/typeshed/stdlib/_weakrefset.pyi +51 -0
  216. mypy/typeshed/stdlib/_winapi.pyi +251 -0
  217. mypy/typeshed/stdlib/abc.pyi +49 -0
  218. mypy/typeshed/stdlib/aifc.pyi +91 -0
  219. mypy/typeshed/stdlib/antigravity.pyi +3 -0
  220. mypy/typeshed/stdlib/argparse.pyi +571 -0
  221. mypy/typeshed/stdlib/array.pyi +92 -0
  222. mypy/typeshed/stdlib/ast.pyi +277 -0
  223. mypy/typeshed/stdlib/asynchat.pyi +21 -0
  224. mypy/typeshed/stdlib/asyncio/__init__.pyi +41 -0
  225. mypy/typeshed/stdlib/asyncio/base_events.pyi +440 -0
  226. mypy/typeshed/stdlib/asyncio/base_futures.pyi +19 -0
  227. mypy/typeshed/stdlib/asyncio/base_subprocess.pyi +63 -0
  228. mypy/typeshed/stdlib/asyncio/base_tasks.pyi +9 -0
  229. mypy/typeshed/stdlib/asyncio/constants.pyi +20 -0
  230. mypy/typeshed/stdlib/asyncio/coroutines.pyi +26 -0
  231. mypy/typeshed/stdlib/asyncio/events.pyi +574 -0
  232. mypy/typeshed/stdlib/asyncio/exceptions.pyi +43 -0
  233. mypy/typeshed/stdlib/asyncio/format_helpers.pyi +20 -0
  234. mypy/typeshed/stdlib/asyncio/futures.pyi +57 -0
  235. mypy/typeshed/stdlib/asyncio/locks.pyi +121 -0
  236. mypy/typeshed/stdlib/asyncio/log.pyi +3 -0
  237. mypy/typeshed/stdlib/asyncio/mixins.pyi +9 -0
  238. mypy/typeshed/stdlib/asyncio/proactor_events.pyi +64 -0
  239. mypy/typeshed/stdlib/asyncio/protocols.pyi +34 -0
  240. mypy/typeshed/stdlib/asyncio/queues.pyi +47 -0
  241. mypy/typeshed/stdlib/asyncio/runners.pyi +32 -0
  242. mypy/typeshed/stdlib/asyncio/selector_events.pyi +8 -0
  243. mypy/typeshed/stdlib/asyncio/sslproto.pyi +163 -0
  244. mypy/typeshed/stdlib/asyncio/staggered.pyi +10 -0
  245. mypy/typeshed/stdlib/asyncio/streams.pyi +148 -0
  246. mypy/typeshed/stdlib/asyncio/subprocess.pyi +229 -0
  247. mypy/typeshed/stdlib/asyncio/taskgroups.pyi +25 -0
  248. mypy/typeshed/stdlib/asyncio/tasks.pyi +477 -0
  249. mypy/typeshed/stdlib/asyncio/threads.pyi +9 -0
  250. mypy/typeshed/stdlib/asyncio/timeouts.pyi +19 -0
  251. mypy/typeshed/stdlib/asyncio/transports.pyi +47 -0
  252. mypy/typeshed/stdlib/asyncio/trsock.pyi +98 -0
  253. mypy/typeshed/stdlib/asyncio/unix_events.pyi +173 -0
  254. mypy/typeshed/stdlib/asyncio/windows_events.pyi +83 -0
  255. mypy/typeshed/stdlib/asyncio/windows_utils.pyi +49 -0
  256. mypy/typeshed/stdlib/asyncore.pyi +90 -0
  257. mypy/typeshed/stdlib/atexit.pyi +12 -0
  258. mypy/typeshed/stdlib/audioop.pyi +42 -0
  259. mypy/typeshed/stdlib/base64.pyi +59 -0
  260. mypy/typeshed/stdlib/bdb.pyi +102 -0
  261. mypy/typeshed/stdlib/binascii.pyi +36 -0
  262. mypy/typeshed/stdlib/binhex.pyi +45 -0
  263. mypy/typeshed/stdlib/bisect.pyi +4 -0
  264. mypy/typeshed/stdlib/builtins.pyi +1937 -0
  265. mypy/typeshed/stdlib/bz2.pyi +146 -0
  266. mypy/typeshed/stdlib/cProfile.pyi +35 -0
  267. mypy/typeshed/stdlib/calendar.pyi +206 -0
  268. mypy/typeshed/stdlib/cgi.pyi +118 -0
  269. mypy/typeshed/stdlib/cgitb.pyi +32 -0
  270. mypy/typeshed/stdlib/chunk.pyi +20 -0
  271. mypy/typeshed/stdlib/cmath.pyi +36 -0
  272. mypy/typeshed/stdlib/cmd.pyi +45 -0
  273. mypy/typeshed/stdlib/code.pyi +33 -0
  274. mypy/typeshed/stdlib/codecs.pyi +285 -0
  275. mypy/typeshed/stdlib/codeop.pyi +13 -0
  276. mypy/typeshed/stdlib/collections/__init__.pyi +477 -0
  277. mypy/typeshed/stdlib/collections/abc.pyi +2 -0
  278. mypy/typeshed/stdlib/colorsys.pyi +13 -0
  279. mypy/typeshed/stdlib/compileall.pyi +111 -0
  280. mypy/typeshed/stdlib/concurrent/__init__.pyi +0 -0
  281. mypy/typeshed/stdlib/concurrent/futures/__init__.pyi +32 -0
  282. mypy/typeshed/stdlib/concurrent/futures/_base.pyi +120 -0
  283. mypy/typeshed/stdlib/concurrent/futures/process.pyi +233 -0
  284. mypy/typeshed/stdlib/concurrent/futures/thread.pyi +80 -0
  285. mypy/typeshed/stdlib/configparser.pyi +313 -0
  286. mypy/typeshed/stdlib/contextlib.pyi +207 -0
  287. mypy/typeshed/stdlib/contextvars.pyi +63 -0
  288. mypy/typeshed/stdlib/copy.pyi +16 -0
  289. mypy/typeshed/stdlib/copyreg.pyi +21 -0
  290. mypy/typeshed/stdlib/crypt.pyi +12 -0
  291. mypy/typeshed/stdlib/csv.pyi +147 -0
  292. mypy/typeshed/stdlib/ctypes/__init__.pyi +187 -0
  293. mypy/typeshed/stdlib/ctypes/_endian.pyi +19 -0
  294. mypy/typeshed/stdlib/ctypes/util.pyi +6 -0
  295. mypy/typeshed/stdlib/ctypes/wintypes.pyi +298 -0
  296. mypy/typeshed/stdlib/curses/__init__.pyi +21 -0
  297. mypy/typeshed/stdlib/curses/ascii.pyi +63 -0
  298. mypy/typeshed/stdlib/curses/has_key.pyi +4 -0
  299. mypy/typeshed/stdlib/curses/panel.pyi +25 -0
  300. mypy/typeshed/stdlib/curses/textpad.pyi +13 -0
  301. mypy/typeshed/stdlib/dataclasses.pyi +313 -0
  302. mypy/typeshed/stdlib/datetime.pyi +295 -0
  303. mypy/typeshed/stdlib/dbm/__init__.pyi +95 -0
  304. mypy/typeshed/stdlib/dbm/dumb.pyi +31 -0
  305. mypy/typeshed/stdlib/dbm/gnu.pyi +40 -0
  306. mypy/typeshed/stdlib/dbm/ndbm.pyi +36 -0
  307. mypy/typeshed/stdlib/decimal.pyi +2 -0
  308. mypy/typeshed/stdlib/difflib.pyi +140 -0
  309. mypy/typeshed/stdlib/dis.pyi +144 -0
  310. mypy/typeshed/stdlib/distutils/__init__.pyi +5 -0
  311. mypy/typeshed/stdlib/distutils/archive_util.pyi +20 -0
  312. mypy/typeshed/stdlib/distutils/bcppcompiler.pyi +3 -0
  313. mypy/typeshed/stdlib/distutils/ccompiler.pyi +152 -0
  314. mypy/typeshed/stdlib/distutils/cmd.pyi +66 -0
  315. mypy/typeshed/stdlib/distutils/command/__init__.pyi +0 -0
  316. mypy/typeshed/stdlib/distutils/command/bdist.pyi +25 -0
  317. mypy/typeshed/stdlib/distutils/command/bdist_dumb.pyi +21 -0
  318. mypy/typeshed/stdlib/distutils/command/bdist_msi.pyi +45 -0
  319. mypy/typeshed/stdlib/distutils/command/bdist_packager.pyi +0 -0
  320. mypy/typeshed/stdlib/distutils/command/bdist_rpm.pyi +52 -0
  321. mypy/typeshed/stdlib/distutils/command/bdist_wininst.pyi +16 -0
  322. mypy/typeshed/stdlib/distutils/command/build.pyi +31 -0
  323. mypy/typeshed/stdlib/distutils/command/build_clib.pyi +27 -0
  324. mypy/typeshed/stdlib/distutils/command/build_ext.pyi +50 -0
  325. mypy/typeshed/stdlib/distutils/command/build_py.pyi +44 -0
  326. mypy/typeshed/stdlib/distutils/command/build_scripts.pyi +24 -0
  327. mypy/typeshed/stdlib/distutils/command/check.pyi +39 -0
  328. mypy/typeshed/stdlib/distutils/command/clean.pyi +17 -0
  329. mypy/typeshed/stdlib/distutils/command/config.pyi +83 -0
  330. mypy/typeshed/stdlib/distutils/command/install.pyi +63 -0
  331. mypy/typeshed/stdlib/distutils/command/install_data.pyi +19 -0
  332. mypy/typeshed/stdlib/distutils/command/install_egg_info.pyi +18 -0
  333. mypy/typeshed/stdlib/distutils/command/install_headers.pyi +16 -0
  334. mypy/typeshed/stdlib/distutils/command/install_lib.pyi +25 -0
  335. mypy/typeshed/stdlib/distutils/command/install_scripts.pyi +18 -0
  336. mypy/typeshed/stdlib/distutils/command/register.pyi +18 -0
  337. mypy/typeshed/stdlib/distutils/command/sdist.pyi +42 -0
  338. mypy/typeshed/stdlib/distutils/command/upload.pyi +17 -0
  339. mypy/typeshed/stdlib/distutils/config.pyi +17 -0
  340. mypy/typeshed/stdlib/distutils/core.pyi +57 -0
  341. mypy/typeshed/stdlib/distutils/cygwinccompiler.pyi +20 -0
  342. mypy/typeshed/stdlib/distutils/debug.pyi +1 -0
  343. mypy/typeshed/stdlib/distutils/dep_util.pyi +3 -0
  344. mypy/typeshed/stdlib/distutils/dir_util.pyi +13 -0
  345. mypy/typeshed/stdlib/distutils/dist.pyi +146 -0
  346. mypy/typeshed/stdlib/distutils/errors.pyi +19 -0
  347. mypy/typeshed/stdlib/distutils/extension.pyi +36 -0
  348. mypy/typeshed/stdlib/distutils/fancy_getopt.pyi +34 -0
  349. mypy/typeshed/stdlib/distutils/file_util.pyi +14 -0
  350. mypy/typeshed/stdlib/distutils/filelist.pyi +50 -0
  351. mypy/typeshed/stdlib/distutils/log.pyi +25 -0
  352. mypy/typeshed/stdlib/distutils/msvccompiler.pyi +3 -0
  353. mypy/typeshed/stdlib/distutils/spawn.pyi +2 -0
  354. mypy/typeshed/stdlib/distutils/sysconfig.pyi +22 -0
  355. mypy/typeshed/stdlib/distutils/text_file.pyi +21 -0
  356. mypy/typeshed/stdlib/distutils/unixccompiler.pyi +3 -0
  357. mypy/typeshed/stdlib/distutils/util.pyi +46 -0
  358. mypy/typeshed/stdlib/distutils/version.pyi +36 -0
  359. mypy/typeshed/stdlib/doctest.pyi +248 -0
  360. mypy/typeshed/stdlib/dummy_threading.pyi +2 -0
  361. mypy/typeshed/stdlib/email/__init__.pyi +29 -0
  362. mypy/typeshed/stdlib/email/_header_value_parser.pyi +392 -0
  363. mypy/typeshed/stdlib/email/_policybase.pyi +51 -0
  364. mypy/typeshed/stdlib/email/base64mime.pyi +13 -0
  365. mypy/typeshed/stdlib/email/charset.pyi +34 -0
  366. mypy/typeshed/stdlib/email/contentmanager.pyi +11 -0
  367. mypy/typeshed/stdlib/email/encoders.pyi +8 -0
  368. mypy/typeshed/stdlib/email/errors.pyi +39 -0
  369. mypy/typeshed/stdlib/email/feedparser.pyi +23 -0
  370. mypy/typeshed/stdlib/email/generator.pyi +40 -0
  371. mypy/typeshed/stdlib/email/header.pyi +31 -0
  372. mypy/typeshed/stdlib/email/headerregistry.pyi +178 -0
  373. mypy/typeshed/stdlib/email/iterators.pyi +12 -0
  374. mypy/typeshed/stdlib/email/message.pyi +161 -0
  375. mypy/typeshed/stdlib/email/mime/__init__.pyi +0 -0
  376. mypy/typeshed/stdlib/email/mime/application.pyi +17 -0
  377. mypy/typeshed/stdlib/email/mime/audio.pyi +17 -0
  378. mypy/typeshed/stdlib/email/mime/base.pyi +8 -0
  379. mypy/typeshed/stdlib/email/mime/image.pyi +17 -0
  380. mypy/typeshed/stdlib/email/mime/message.pyi +8 -0
  381. mypy/typeshed/stdlib/email/mime/multipart.pyi +18 -0
  382. mypy/typeshed/stdlib/email/mime/nonmultipart.pyi +5 -0
  383. mypy/typeshed/stdlib/email/mime/text.pyi +9 -0
  384. mypy/typeshed/stdlib/email/parser.pyi +26 -0
  385. mypy/typeshed/stdlib/email/policy.pyi +38 -0
  386. mypy/typeshed/stdlib/email/quoprimime.pyi +28 -0
  387. mypy/typeshed/stdlib/email/utils.pyi +66 -0
  388. mypy/typeshed/stdlib/encodings/__init__.pyi +10 -0
  389. mypy/typeshed/stdlib/encodings/utf_8.pyi +21 -0
  390. mypy/typeshed/stdlib/encodings/utf_8_sig.pyi +22 -0
  391. mypy/typeshed/stdlib/ensurepip/__init__.pyi +12 -0
  392. mypy/typeshed/stdlib/enum.pyi +317 -0
  393. mypy/typeshed/stdlib/errno.pyi +222 -0
  394. mypy/typeshed/stdlib/faulthandler.pyi +13 -0
  395. mypy/typeshed/stdlib/fcntl.pyi +127 -0
  396. mypy/typeshed/stdlib/filecmp.pyi +57 -0
  397. mypy/typeshed/stdlib/fileinput.pyi +213 -0
  398. mypy/typeshed/stdlib/fnmatch.pyi +9 -0
  399. mypy/typeshed/stdlib/formatter.pyi +88 -0
  400. mypy/typeshed/stdlib/fractions.pyi +150 -0
  401. mypy/typeshed/stdlib/ftplib.pyi +178 -0
  402. mypy/typeshed/stdlib/functools.pyi +200 -0
  403. mypy/typeshed/stdlib/gc.pyi +37 -0
  404. mypy/typeshed/stdlib/genericpath.pyi +52 -0
  405. mypy/typeshed/stdlib/getopt.pyi +11 -0
  406. mypy/typeshed/stdlib/getpass.pyi +8 -0
  407. mypy/typeshed/stdlib/gettext.pyi +169 -0
  408. mypy/typeshed/stdlib/glob.pyi +42 -0
  409. mypy/typeshed/stdlib/graphlib.pyi +28 -0
  410. mypy/typeshed/stdlib/grp.pyi +21 -0
  411. mypy/typeshed/stdlib/gzip.pyi +160 -0
  412. mypy/typeshed/stdlib/hashlib.pyi +165 -0
  413. mypy/typeshed/stdlib/heapq.pyi +17 -0
  414. mypy/typeshed/stdlib/hmac.pyi +38 -0
  415. mypy/typeshed/stdlib/html/__init__.pyi +6 -0
  416. mypy/typeshed/stdlib/html/entities.pyi +6 -0
  417. mypy/typeshed/stdlib/html/parser.pyi +34 -0
  418. mypy/typeshed/stdlib/http/__init__.pyi +105 -0
  419. mypy/typeshed/stdlib/http/client.pyi +259 -0
  420. mypy/typeshed/stdlib/http/cookiejar.pyi +159 -0
  421. mypy/typeshed/stdlib/http/cookies.pyi +60 -0
  422. mypy/typeshed/stdlib/http/server.pyi +83 -0
  423. mypy/typeshed/stdlib/imaplib.pyi +168 -0
  424. mypy/typeshed/stdlib/imghdr.pyi +17 -0
  425. mypy/typeshed/stdlib/imp.pyi +62 -0
  426. mypy/typeshed/stdlib/importlib/__init__.pyi +24 -0
  427. mypy/typeshed/stdlib/importlib/_abc.pyi +15 -0
  428. mypy/typeshed/stdlib/importlib/abc.pyi +172 -0
  429. mypy/typeshed/stdlib/importlib/machinery.pyi +179 -0
  430. mypy/typeshed/stdlib/importlib/metadata/__init__.pyi +276 -0
  431. mypy/typeshed/stdlib/importlib/metadata/_meta.pyi +40 -0
  432. mypy/typeshed/stdlib/importlib/readers.pyi +68 -0
  433. mypy/typeshed/stdlib/importlib/resources/__init__.pyi +46 -0
  434. mypy/typeshed/stdlib/importlib/resources/abc.pyi +12 -0
  435. mypy/typeshed/stdlib/importlib/resources/readers.pyi +14 -0
  436. mypy/typeshed/stdlib/importlib/resources/simple.pyi +49 -0
  437. mypy/typeshed/stdlib/importlib/simple.pyi +11 -0
  438. mypy/typeshed/stdlib/importlib/util.pyi +43 -0
  439. mypy/typeshed/stdlib/inspect.pyi +631 -0
  440. mypy/typeshed/stdlib/io.pyi +204 -0
  441. mypy/typeshed/stdlib/ipaddress.pyi +208 -0
  442. mypy/typeshed/stdlib/itertools.pyi +293 -0
  443. mypy/typeshed/stdlib/json/__init__.pyi +61 -0
  444. mypy/typeshed/stdlib/json/decoder.pyi +32 -0
  445. mypy/typeshed/stdlib/json/encoder.pyi +38 -0
  446. mypy/typeshed/stdlib/json/tool.pyi +1 -0
  447. mypy/typeshed/stdlib/keyword.pyi +21 -0
  448. mypy/typeshed/stdlib/lib2to3/__init__.pyi +0 -0
  449. mypy/typeshed/stdlib/lib2to3/btm_matcher.pyi +28 -0
  450. mypy/typeshed/stdlib/lib2to3/fixer_base.pyi +42 -0
  451. mypy/typeshed/stdlib/lib2to3/fixes/__init__.pyi +0 -0
  452. mypy/typeshed/stdlib/lib2to3/fixes/fix_apply.pyi +8 -0
  453. mypy/typeshed/stdlib/lib2to3/fixes/fix_asserts.pyi +10 -0
  454. mypy/typeshed/stdlib/lib2to3/fixes/fix_basestring.pyi +8 -0
  455. mypy/typeshed/stdlib/lib2to3/fixes/fix_buffer.pyi +8 -0
  456. mypy/typeshed/stdlib/lib2to3/fixes/fix_dict.pyi +16 -0
  457. mypy/typeshed/stdlib/lib2to3/fixes/fix_except.pyi +14 -0
  458. mypy/typeshed/stdlib/lib2to3/fixes/fix_exec.pyi +8 -0
  459. mypy/typeshed/stdlib/lib2to3/fixes/fix_execfile.pyi +8 -0
  460. mypy/typeshed/stdlib/lib2to3/fixes/fix_exitfunc.pyi +13 -0
  461. mypy/typeshed/stdlib/lib2to3/fixes/fix_filter.pyi +9 -0
  462. mypy/typeshed/stdlib/lib2to3/fixes/fix_funcattrs.pyi +8 -0
  463. mypy/typeshed/stdlib/lib2to3/fixes/fix_future.pyi +8 -0
  464. mypy/typeshed/stdlib/lib2to3/fixes/fix_getcwdu.pyi +8 -0
  465. mypy/typeshed/stdlib/lib2to3/fixes/fix_has_key.pyi +8 -0
  466. mypy/typeshed/stdlib/lib2to3/fixes/fix_idioms.pyi +15 -0
  467. mypy/typeshed/stdlib/lib2to3/fixes/fix_import.pyi +16 -0
  468. mypy/typeshed/stdlib/lib2to3/fixes/fix_imports.pyi +21 -0
  469. mypy/typeshed/stdlib/lib2to3/fixes/fix_imports2.pyi +6 -0
  470. mypy/typeshed/stdlib/lib2to3/fixes/fix_input.pyi +11 -0
  471. mypy/typeshed/stdlib/lib2to3/fixes/fix_intern.pyi +9 -0
  472. mypy/typeshed/stdlib/lib2to3/fixes/fix_isinstance.pyi +8 -0
  473. mypy/typeshed/stdlib/lib2to3/fixes/fix_itertools.pyi +9 -0
  474. mypy/typeshed/stdlib/lib2to3/fixes/fix_itertools_imports.pyi +7 -0
  475. mypy/typeshed/stdlib/lib2to3/fixes/fix_long.pyi +7 -0
  476. mypy/typeshed/stdlib/lib2to3/fixes/fix_map.pyi +9 -0
  477. mypy/typeshed/stdlib/lib2to3/fixes/fix_metaclass.pyi +17 -0
  478. mypy/typeshed/stdlib/lib2to3/fixes/fix_methodattrs.pyi +10 -0
  479. mypy/typeshed/stdlib/lib2to3/fixes/fix_ne.pyi +8 -0
  480. mypy/typeshed/stdlib/lib2to3/fixes/fix_next.pyi +19 -0
  481. mypy/typeshed/stdlib/lib2to3/fixes/fix_nonzero.pyi +8 -0
  482. mypy/typeshed/stdlib/lib2to3/fixes/fix_numliterals.pyi +8 -0
  483. mypy/typeshed/stdlib/lib2to3/fixes/fix_operator.pyi +12 -0
  484. mypy/typeshed/stdlib/lib2to3/fixes/fix_paren.pyi +8 -0
  485. mypy/typeshed/stdlib/lib2to3/fixes/fix_print.pyi +12 -0
  486. mypy/typeshed/stdlib/lib2to3/fixes/fix_raise.pyi +8 -0
  487. mypy/typeshed/stdlib/lib2to3/fixes/fix_raw_input.pyi +8 -0
  488. mypy/typeshed/stdlib/lib2to3/fixes/fix_reduce.pyi +8 -0
  489. mypy/typeshed/stdlib/lib2to3/fixes/fix_reload.pyi +9 -0
  490. mypy/typeshed/stdlib/lib2to3/fixes/fix_renames.pyi +17 -0
  491. mypy/typeshed/stdlib/lib2to3/fixes/fix_repr.pyi +8 -0
  492. mypy/typeshed/stdlib/lib2to3/fixes/fix_set_literal.pyi +7 -0
  493. mypy/typeshed/stdlib/lib2to3/fixes/fix_standarderror.pyi +8 -0
  494. mypy/typeshed/stdlib/lib2to3/fixes/fix_sys_exc.pyi +9 -0
  495. mypy/typeshed/stdlib/lib2to3/fixes/fix_throw.pyi +8 -0
  496. mypy/typeshed/stdlib/lib2to3/fixes/fix_tuple_params.pyi +17 -0
  497. mypy/typeshed/stdlib/lib2to3/fixes/fix_types.pyi +8 -0
  498. mypy/typeshed/stdlib/lib2to3/fixes/fix_unicode.pyi +12 -0
  499. mypy/typeshed/stdlib/lib2to3/fixes/fix_urllib.pyi +15 -0
  500. mypy/typeshed/stdlib/lib2to3/fixes/fix_ws_comma.pyi +12 -0
  501. mypy/typeshed/stdlib/lib2to3/fixes/fix_xrange.pyi +20 -0
  502. mypy/typeshed/stdlib/lib2to3/fixes/fix_xreadlines.pyi +8 -0
  503. mypy/typeshed/stdlib/lib2to3/fixes/fix_zip.pyi +9 -0
  504. mypy/typeshed/stdlib/lib2to3/main.pyi +42 -0
  505. mypy/typeshed/stdlib/lib2to3/pgen2/__init__.pyi +9 -0
  506. mypy/typeshed/stdlib/lib2to3/pgen2/driver.pyi +27 -0
  507. mypy/typeshed/stdlib/lib2to3/pgen2/grammar.pyi +24 -0
  508. mypy/typeshed/stdlib/lib2to3/pgen2/literals.pyi +7 -0
  509. mypy/typeshed/stdlib/lib2to3/pgen2/parse.pyi +30 -0
  510. mypy/typeshed/stdlib/lib2to3/pgen2/pgen.pyi +50 -0
  511. mypy/typeshed/stdlib/lib2to3/pgen2/token.pyi +67 -0
  512. mypy/typeshed/stdlib/lib2to3/pgen2/tokenize.pyi +96 -0
  513. mypy/typeshed/stdlib/lib2to3/pygram.pyi +114 -0
  514. mypy/typeshed/stdlib/lib2to3/pytree.pyi +117 -0
  515. mypy/typeshed/stdlib/lib2to3/refactor.pyi +82 -0
  516. mypy/typeshed/stdlib/linecache.pyi +23 -0
  517. mypy/typeshed/stdlib/locale.pyi +152 -0
  518. mypy/typeshed/stdlib/logging/__init__.pyi +655 -0
  519. mypy/typeshed/stdlib/logging/config.pyi +134 -0
  520. mypy/typeshed/stdlib/logging/handlers.pyi +275 -0
  521. mypy/typeshed/stdlib/lzma.pyi +197 -0
  522. mypy/typeshed/stdlib/mailbox.pyi +256 -0
  523. mypy/typeshed/stdlib/mailcap.pyi +11 -0
  524. mypy/typeshed/stdlib/marshal.pyi +33 -0
  525. mypy/typeshed/stdlib/math.pyi +125 -0
  526. mypy/typeshed/stdlib/mimetypes.pyi +46 -0
  527. mypy/typeshed/stdlib/mmap.pyi +113 -0
  528. mypy/typeshed/stdlib/modulefinder.pyi +66 -0
  529. mypy/typeshed/stdlib/msilib/__init__.pyi +176 -0
  530. mypy/typeshed/stdlib/msilib/schema.pyi +94 -0
  531. mypy/typeshed/stdlib/msilib/sequence.pyi +13 -0
  532. mypy/typeshed/stdlib/msilib/text.pyi +7 -0
  533. mypy/typeshed/stdlib/msvcrt.pyi +32 -0
  534. mypy/typeshed/stdlib/multiprocessing/__init__.pyi +90 -0
  535. mypy/typeshed/stdlib/multiprocessing/connection.pyi +75 -0
  536. mypy/typeshed/stdlib/multiprocessing/context.pyi +187 -0
  537. mypy/typeshed/stdlib/multiprocessing/dummy/__init__.pyi +77 -0
  538. mypy/typeshed/stdlib/multiprocessing/dummy/connection.pyi +39 -0
  539. mypy/typeshed/stdlib/multiprocessing/forkserver.pyi +31 -0
  540. mypy/typeshed/stdlib/multiprocessing/heap.pyi +36 -0
  541. mypy/typeshed/stdlib/multiprocessing/managers.pyi +212 -0
  542. mypy/typeshed/stdlib/multiprocessing/pool.pyi +103 -0
  543. mypy/typeshed/stdlib/multiprocessing/popen_fork.pyi +23 -0
  544. mypy/typeshed/stdlib/multiprocessing/popen_forkserver.pyi +16 -0
  545. mypy/typeshed/stdlib/multiprocessing/popen_spawn_posix.pyi +20 -0
  546. mypy/typeshed/stdlib/multiprocessing/popen_spawn_win32.pyi +30 -0
  547. mypy/typeshed/stdlib/multiprocessing/process.pyi +39 -0
  548. mypy/typeshed/stdlib/multiprocessing/queues.pyi +41 -0
  549. mypy/typeshed/stdlib/multiprocessing/reduction.pyi +89 -0
  550. mypy/typeshed/stdlib/multiprocessing/resource_sharer.pyi +20 -0
  551. mypy/typeshed/stdlib/multiprocessing/resource_tracker.pyi +18 -0
  552. mypy/typeshed/stdlib/multiprocessing/shared_memory.pyi +40 -0
  553. mypy/typeshed/stdlib/multiprocessing/sharedctypes.pyi +101 -0
  554. mypy/typeshed/stdlib/multiprocessing/spawn.pyi +32 -0
  555. mypy/typeshed/stdlib/multiprocessing/synchronize.pyi +54 -0
  556. mypy/typeshed/stdlib/multiprocessing/util.pyi +79 -0
  557. mypy/typeshed/stdlib/netrc.pyi +23 -0
  558. mypy/typeshed/stdlib/nis.pyi +9 -0
  559. mypy/typeshed/stdlib/nntplib.pyi +125 -0
  560. mypy/typeshed/stdlib/nt.pyi +111 -0
  561. mypy/typeshed/stdlib/ntpath.pyi +119 -0
  562. mypy/typeshed/stdlib/nturl2path.pyi +2 -0
  563. mypy/typeshed/stdlib/numbers.pyi +154 -0
  564. mypy/typeshed/stdlib/opcode.pyi +59 -0
  565. mypy/typeshed/stdlib/operator.pyi +110 -0
  566. mypy/typeshed/stdlib/optparse.pyi +252 -0
  567. mypy/typeshed/stdlib/os/__init__.pyi +1139 -0
  568. mypy/typeshed/stdlib/os/path.pyi +8 -0
  569. mypy/typeshed/stdlib/ossaudiodev.pyi +131 -0
  570. mypy/typeshed/stdlib/parser.pyi +24 -0
  571. mypy/typeshed/stdlib/pathlib.pyi +232 -0
  572. mypy/typeshed/stdlib/pdb.pyi +181 -0
  573. mypy/typeshed/stdlib/pickle.pyi +270 -0
  574. mypy/typeshed/stdlib/pickletools.pyi +167 -0
  575. mypy/typeshed/stdlib/pipes.pyi +16 -0
  576. mypy/typeshed/stdlib/pkgutil.pyi +53 -0
  577. mypy/typeshed/stdlib/platform.pyi +42 -0
  578. mypy/typeshed/stdlib/plistlib.pyi +113 -0
  579. mypy/typeshed/stdlib/poplib.pyi +71 -0
  580. mypy/typeshed/stdlib/posix.pyi +359 -0
  581. mypy/typeshed/stdlib/posixpath.pyi +161 -0
  582. mypy/typeshed/stdlib/pprint.pyi +112 -0
  583. mypy/typeshed/stdlib/profile.pyi +31 -0
  584. mypy/typeshed/stdlib/pstats.pyi +78 -0
  585. mypy/typeshed/stdlib/pty.pyi +19 -0
  586. mypy/typeshed/stdlib/pwd.pyi +27 -0
  587. mypy/typeshed/stdlib/py_compile.pyi +34 -0
  588. mypy/typeshed/stdlib/pyclbr.pyi +74 -0
  589. mypy/typeshed/stdlib/pydoc.pyi +261 -0
  590. mypy/typeshed/stdlib/pydoc_data/__init__.pyi +0 -0
  591. mypy/typeshed/stdlib/pydoc_data/topics.pyi +1 -0
  592. mypy/typeshed/stdlib/pyexpat/__init__.pyi +80 -0
  593. mypy/typeshed/stdlib/pyexpat/errors.pyi +49 -0
  594. mypy/typeshed/stdlib/pyexpat/model.pyi +11 -0
  595. mypy/typeshed/stdlib/queue.pyi +58 -0
  596. mypy/typeshed/stdlib/quopri.pyi +11 -0
  597. mypy/typeshed/stdlib/random.pyi +138 -0
  598. mypy/typeshed/stdlib/re.pyi +290 -0
  599. mypy/typeshed/stdlib/readline.pyi +36 -0
  600. mypy/typeshed/stdlib/reprlib.pyi +65 -0
  601. mypy/typeshed/stdlib/resource.pyi +92 -0
  602. mypy/typeshed/stdlib/rlcompleter.pyi +9 -0
  603. mypy/typeshed/stdlib/runpy.pyi +24 -0
  604. mypy/typeshed/stdlib/sched.pyi +42 -0
  605. mypy/typeshed/stdlib/secrets.pyi +15 -0
  606. mypy/typeshed/stdlib/select.pyi +151 -0
  607. mypy/typeshed/stdlib/selectors.pyi +67 -0
  608. mypy/typeshed/stdlib/shelve.pyi +46 -0
  609. mypy/typeshed/stdlib/shlex.pyi +43 -0
  610. mypy/typeshed/stdlib/shutil.pyi +189 -0
  611. mypy/typeshed/stdlib/signal.pyi +189 -0
  612. mypy/typeshed/stdlib/site.pyi +27 -0
  613. mypy/typeshed/stdlib/smtpd.pyi +91 -0
  614. mypy/typeshed/stdlib/smtplib.pyi +204 -0
  615. mypy/typeshed/stdlib/sndhdr.pyi +14 -0
  616. mypy/typeshed/stdlib/socket.pyi +825 -0
  617. mypy/typeshed/stdlib/socketserver.pyi +168 -0
  618. mypy/typeshed/stdlib/spwd.pyi +40 -0
  619. mypy/typeshed/stdlib/sqlite3/__init__.pyi +1 -0
  620. mypy/typeshed/stdlib/sqlite3/dbapi2.pyi +469 -0
  621. mypy/typeshed/stdlib/sre_compile.pyi +11 -0
  622. mypy/typeshed/stdlib/sre_constants.pyi +130 -0
  623. mypy/typeshed/stdlib/sre_parse.pyi +104 -0
  624. mypy/typeshed/stdlib/ssl.pyi +529 -0
  625. mypy/typeshed/stdlib/stat.pyi +1 -0
  626. mypy/typeshed/stdlib/statistics.pyi +132 -0
  627. mypy/typeshed/stdlib/string.pyi +83 -0
  628. mypy/typeshed/stdlib/stringprep.pyi +27 -0
  629. mypy/typeshed/stdlib/struct.pyi +26 -0
  630. mypy/typeshed/stdlib/subprocess.pyi +2614 -0
  631. mypy/typeshed/stdlib/sunau.pyi +86 -0
  632. mypy/typeshed/stdlib/symbol.pyi +93 -0
  633. mypy/typeshed/stdlib/symtable.pyi +58 -0
  634. mypy/typeshed/stdlib/sys/__init__.pyi +373 -0
  635. mypy/typeshed/stdlib/sys/_monitoring.pyi +52 -0
  636. mypy/typeshed/stdlib/sysconfig.pyi +43 -0
  637. mypy/typeshed/stdlib/syslog.pyi +46 -0
  638. mypy/typeshed/stdlib/tabnanny.pyi +16 -0
  639. mypy/typeshed/stdlib/tarfile.pyi +438 -0
  640. mypy/typeshed/stdlib/telnetlib.pyi +122 -0
  641. mypy/typeshed/stdlib/tempfile.pyi +477 -0
  642. mypy/typeshed/stdlib/termios.pyi +267 -0
  643. mypy/typeshed/stdlib/textwrap.pyi +103 -0
  644. mypy/typeshed/stdlib/this.pyi +2 -0
  645. mypy/typeshed/stdlib/threading.pyi +187 -0
  646. mypy/typeshed/stdlib/time.pyi +107 -0
  647. mypy/typeshed/stdlib/timeit.pyi +32 -0
  648. mypy/typeshed/stdlib/tkinter/__init__.pyi +3641 -0
  649. mypy/typeshed/stdlib/tkinter/colorchooser.pyi +20 -0
  650. mypy/typeshed/stdlib/tkinter/commondialog.pyi +14 -0
  651. mypy/typeshed/stdlib/tkinter/constants.pyi +80 -0
  652. mypy/typeshed/stdlib/tkinter/dialog.pyi +16 -0
  653. mypy/typeshed/stdlib/tkinter/dnd.pyi +20 -0
  654. mypy/typeshed/stdlib/tkinter/filedialog.pyi +151 -0
  655. mypy/typeshed/stdlib/tkinter/font.pyi +116 -0
  656. mypy/typeshed/stdlib/tkinter/messagebox.pyi +44 -0
  657. mypy/typeshed/stdlib/tkinter/scrolledtext.pyi +10 -0
  658. mypy/typeshed/stdlib/tkinter/simpledialog.pyi +54 -0
  659. mypy/typeshed/stdlib/tkinter/tix.pyi +299 -0
  660. mypy/typeshed/stdlib/tkinter/ttk.pyi +1191 -0
  661. mypy/typeshed/stdlib/token.pyi +159 -0
  662. mypy/typeshed/stdlib/tokenize.pyi +177 -0
  663. mypy/typeshed/stdlib/tomllib.pyi +10 -0
  664. mypy/typeshed/stdlib/trace.pyi +79 -0
  665. mypy/typeshed/stdlib/traceback.pyi +260 -0
  666. mypy/typeshed/stdlib/tracemalloc.pyi +124 -0
  667. mypy/typeshed/stdlib/tty.pyi +30 -0
  668. mypy/typeshed/stdlib/turtle.pyi +713 -0
  669. mypy/typeshed/stdlib/types.pyi +605 -0
  670. mypy/typeshed/stdlib/typing.pyi +968 -0
  671. mypy/typeshed/stdlib/typing_extensions.pyi +503 -0
  672. mypy/typeshed/stdlib/unicodedata.pyi +71 -0
  673. mypy/typeshed/stdlib/unittest/__init__.pyi +67 -0
  674. mypy/typeshed/stdlib/unittest/_log.pyi +27 -0
  675. mypy/typeshed/stdlib/unittest/async_case.pyi +21 -0
  676. mypy/typeshed/stdlib/unittest/case.pyi +342 -0
  677. mypy/typeshed/stdlib/unittest/loader.pyi +51 -0
  678. mypy/typeshed/stdlib/unittest/main.pyi +69 -0
  679. mypy/typeshed/stdlib/unittest/mock.pyi +430 -0
  680. mypy/typeshed/stdlib/unittest/result.pyi +46 -0
  681. mypy/typeshed/stdlib/unittest/runner.pyi +72 -0
  682. mypy/typeshed/stdlib/unittest/signals.pyi +15 -0
  683. mypy/typeshed/stdlib/unittest/suite.pyi +22 -0
  684. mypy/typeshed/stdlib/unittest/util.pyi +23 -0
  685. mypy/typeshed/stdlib/urllib/__init__.pyi +0 -0
  686. mypy/typeshed/stdlib/urllib/error.pyi +23 -0
  687. mypy/typeshed/stdlib/urllib/parse.pyi +210 -0
  688. mypy/typeshed/stdlib/urllib/request.pyi +399 -0
  689. mypy/typeshed/stdlib/urllib/response.pyi +43 -0
  690. mypy/typeshed/stdlib/urllib/robotparser.pyi +20 -0
  691. mypy/typeshed/stdlib/uu.pyi +13 -0
  692. mypy/typeshed/stdlib/uuid.pyi +100 -0
  693. mypy/typeshed/stdlib/venv/__init__.pyi +79 -0
  694. mypy/typeshed/stdlib/warnings.pyi +112 -0
  695. mypy/typeshed/stdlib/wave.pyi +85 -0
  696. mypy/typeshed/stdlib/weakref.pyi +150 -0
  697. mypy/typeshed/stdlib/webbrowser.pyi +74 -0
  698. mypy/typeshed/stdlib/winreg.pyi +103 -0
  699. mypy/typeshed/stdlib/winsound.pyi +28 -0
  700. mypy/typeshed/stdlib/wsgiref/__init__.pyi +0 -0
  701. mypy/typeshed/stdlib/wsgiref/handlers.pyi +91 -0
  702. mypy/typeshed/stdlib/wsgiref/headers.pyi +26 -0
  703. mypy/typeshed/stdlib/wsgiref/simple_server.pyi +37 -0
  704. mypy/typeshed/stdlib/wsgiref/types.pyi +32 -0
  705. mypy/typeshed/stdlib/wsgiref/util.pyi +24 -0
  706. mypy/typeshed/stdlib/wsgiref/validate.pyi +50 -0
  707. mypy/typeshed/stdlib/xdrlib.pyi +57 -0
  708. mypy/typeshed/stdlib/xml/__init__.pyi +1 -0
  709. mypy/typeshed/stdlib/xml/dom/NodeFilter.pyi +19 -0
  710. mypy/typeshed/stdlib/xml/dom/__init__.pyi +69 -0
  711. mypy/typeshed/stdlib/xml/dom/domreg.pyi +8 -0
  712. mypy/typeshed/stdlib/xml/dom/expatbuilder.pyi +100 -0
  713. mypy/typeshed/stdlib/xml/dom/minicompat.pyi +22 -0
  714. mypy/typeshed/stdlib/xml/dom/minidom.pyi +404 -0
  715. mypy/typeshed/stdlib/xml/dom/pulldom.pyi +94 -0
  716. mypy/typeshed/stdlib/xml/dom/xmlbuilder.pyi +108 -0
  717. mypy/typeshed/stdlib/xml/etree/ElementInclude.pyi +28 -0
  718. mypy/typeshed/stdlib/xml/etree/ElementPath.pyi +34 -0
  719. mypy/typeshed/stdlib/xml/etree/ElementTree.pyi +321 -0
  720. mypy/typeshed/stdlib/xml/etree/__init__.pyi +0 -0
  721. mypy/typeshed/stdlib/xml/etree/cElementTree.pyi +1 -0
  722. mypy/typeshed/stdlib/xml/parsers/__init__.pyi +1 -0
  723. mypy/typeshed/stdlib/xml/parsers/expat/__init__.pyi +1 -0
  724. mypy/typeshed/stdlib/xml/parsers/expat/errors.pyi +1 -0
  725. mypy/typeshed/stdlib/xml/parsers/expat/model.pyi +1 -0
  726. mypy/typeshed/stdlib/xml/sax/__init__.pyi +25 -0
  727. mypy/typeshed/stdlib/xml/sax/_exceptions.pyi +19 -0
  728. mypy/typeshed/stdlib/xml/sax/handler.pyi +55 -0
  729. mypy/typeshed/stdlib/xml/sax/saxutils.pyi +60 -0
  730. mypy/typeshed/stdlib/xml/sax/xmlreader.pyi +87 -0
  731. mypy/typeshed/stdlib/xmlrpc/__init__.pyi +0 -0
  732. mypy/typeshed/stdlib/xmlrpc/client.pyi +296 -0
  733. mypy/typeshed/stdlib/xmlrpc/server.pyi +143 -0
  734. mypy/typeshed/stdlib/xxlimited.pyi +22 -0
  735. mypy/typeshed/stdlib/zipapp.pyi +20 -0
  736. mypy/typeshed/stdlib/zipfile/__init__.pyi +306 -0
  737. mypy/typeshed/stdlib/zipfile/_path.pyi +95 -0
  738. mypy/typeshed/stdlib/zipimport.pyi +32 -0
  739. mypy/typeshed/stdlib/zlib.pyi +56 -0
  740. mypy/typeshed/stdlib/zoneinfo/__init__.pyi +38 -0
  741. mypy/typeshed/stubs/mypy-extensions/mypy_extensions.pyi +218 -0
  742. mypy/typestate.py +323 -0
  743. mypy/typetraverser.py +142 -0
  744. mypy/typevars.py +93 -0
  745. mypy/typevartuples.py +32 -0
  746. mypy/util.py +869 -0
  747. mypy/version.py +1 -0
  748. mypy/visitor.py +621 -0
  749. mypy/xml/mypy-html.css +104 -0
  750. mypy/xml/mypy-html.xslt +81 -0
  751. mypy/xml/mypy-txt.xslt +100 -0
  752. mypy/xml/mypy.xsd +50 -0
  753. mypy_dev-1.9.0.dev0.dist-info/LICENSE +229 -0
  754. mypy_dev-1.9.0.dev0.dist-info/METADATA +39 -0
  755. mypy_dev-1.9.0.dev0.dist-info/RECORD +1018 -0
  756. mypy_dev-1.9.0.dev0.dist-info/WHEEL +5 -0
  757. mypy_dev-1.9.0.dev0.dist-info/entry_points.txt +6 -0
  758. mypy_dev-1.9.0.dev0.dist-info/top_level.txt +2 -0
  759. mypyc/README.md +133 -0
  760. mypyc/__init__.py +0 -0
  761. mypyc/__main__.py +57 -0
  762. mypyc/analysis/__init__.py +0 -0
  763. mypyc/analysis/attrdefined.py +436 -0
  764. mypyc/analysis/blockfreq.py +32 -0
  765. mypyc/analysis/dataflow.py +624 -0
  766. mypyc/analysis/ircheck.py +429 -0
  767. mypyc/analysis/selfleaks.py +207 -0
  768. mypyc/build.py +616 -0
  769. mypyc/codegen/__init__.py +0 -0
  770. mypyc/codegen/cstring.py +54 -0
  771. mypyc/codegen/emit.py +1193 -0
  772. mypyc/codegen/emitclass.py +1060 -0
  773. mypyc/codegen/emitfunc.py +846 -0
  774. mypyc/codegen/emitmodule.py +1131 -0
  775. mypyc/codegen/emitwrapper.py +979 -0
  776. mypyc/codegen/literals.py +302 -0
  777. mypyc/common.py +136 -0
  778. mypyc/crash.py +31 -0
  779. mypyc/doc/Makefile +20 -0
  780. mypyc/doc/bool_operations.rst +27 -0
  781. mypyc/doc/compilation_units.rst +20 -0
  782. mypyc/doc/conf.py +59 -0
  783. mypyc/doc/cpython-timings.md +25 -0
  784. mypyc/doc/dev-intro.md +548 -0
  785. mypyc/doc/dict_operations.rst +59 -0
  786. mypyc/doc/differences_from_python.rst +332 -0
  787. mypyc/doc/float_operations.rst +50 -0
  788. mypyc/doc/future.md +42 -0
  789. mypyc/doc/getting_started.rst +240 -0
  790. mypyc/doc/index.rst +61 -0
  791. mypyc/doc/int_operations.rst +162 -0
  792. mypyc/doc/introduction.rst +150 -0
  793. mypyc/doc/list_operations.rst +65 -0
  794. mypyc/doc/make.bat +35 -0
  795. mypyc/doc/native_classes.rst +206 -0
  796. mypyc/doc/native_operations.rst +55 -0
  797. mypyc/doc/performance_tips_and_tricks.rst +244 -0
  798. mypyc/doc/set_operations.rst +47 -0
  799. mypyc/doc/str_operations.rst +35 -0
  800. mypyc/doc/tuple_operations.rst +33 -0
  801. mypyc/doc/using_type_annotations.rst +398 -0
  802. mypyc/errors.py +29 -0
  803. mypyc/external/googletest/LICENSE +28 -0
  804. mypyc/external/googletest/README.md +280 -0
  805. mypyc/external/googletest/include/gtest/gtest-death-test.h +294 -0
  806. mypyc/external/googletest/include/gtest/gtest-message.h +250 -0
  807. mypyc/external/googletest/include/gtest/gtest-param-test.h +1444 -0
  808. mypyc/external/googletest/include/gtest/gtest-param-test.h.pump +510 -0
  809. mypyc/external/googletest/include/gtest/gtest-printers.h +993 -0
  810. mypyc/external/googletest/include/gtest/gtest-spi.h +232 -0
  811. mypyc/external/googletest/include/gtest/gtest-test-part.h +179 -0
  812. mypyc/external/googletest/include/gtest/gtest-typed-test.h +263 -0
  813. mypyc/external/googletest/include/gtest/gtest.h +2236 -0
  814. mypyc/external/googletest/include/gtest/gtest_pred_impl.h +358 -0
  815. mypyc/external/googletest/include/gtest/gtest_prod.h +58 -0
  816. mypyc/external/googletest/include/gtest/internal/custom/gtest-port.h +69 -0
  817. mypyc/external/googletest/include/gtest/internal/custom/gtest-printers.h +42 -0
  818. mypyc/external/googletest/include/gtest/internal/custom/gtest.h +41 -0
  819. mypyc/external/googletest/include/gtest/internal/gtest-death-test-internal.h +319 -0
  820. mypyc/external/googletest/include/gtest/internal/gtest-filepath.h +206 -0
  821. mypyc/external/googletest/include/gtest/internal/gtest-internal.h +1238 -0
  822. mypyc/external/googletest/include/gtest/internal/gtest-linked_ptr.h +243 -0
  823. mypyc/external/googletest/include/gtest/internal/gtest-param-util-generated.h +5146 -0
  824. mypyc/external/googletest/include/gtest/internal/gtest-param-util-generated.h.pump +286 -0
  825. mypyc/external/googletest/include/gtest/internal/gtest-param-util.h +731 -0
  826. mypyc/external/googletest/include/gtest/internal/gtest-port-arch.h +93 -0
  827. mypyc/external/googletest/include/gtest/internal/gtest-port.h +2560 -0
  828. mypyc/external/googletest/include/gtest/internal/gtest-string.h +167 -0
  829. mypyc/external/googletest/include/gtest/internal/gtest-tuple.h +1020 -0
  830. mypyc/external/googletest/include/gtest/internal/gtest-tuple.h.pump +347 -0
  831. mypyc/external/googletest/include/gtest/internal/gtest-type-util.h +3331 -0
  832. mypyc/external/googletest/include/gtest/internal/gtest-type-util.h.pump +297 -0
  833. mypyc/external/googletest/make/Makefile +61 -0
  834. mypyc/external/googletest/src/gtest-all.cc +48 -0
  835. mypyc/external/googletest/src/gtest-death-test.cc +1342 -0
  836. mypyc/external/googletest/src/gtest-filepath.cc +387 -0
  837. mypyc/external/googletest/src/gtest-internal-inl.h +1183 -0
  838. mypyc/external/googletest/src/gtest-port.cc +1259 -0
  839. mypyc/external/googletest/src/gtest-printers.cc +373 -0
  840. mypyc/external/googletest/src/gtest-test-part.cc +110 -0
  841. mypyc/external/googletest/src/gtest-typed-test.cc +118 -0
  842. mypyc/external/googletest/src/gtest.cc +5388 -0
  843. mypyc/external/googletest/src/gtest_main.cc +38 -0
  844. mypyc/ir/__init__.py +0 -0
  845. mypyc/ir/class_ir.py +499 -0
  846. mypyc/ir/func_ir.py +370 -0
  847. mypyc/ir/module_ir.py +88 -0
  848. mypyc/ir/ops.py +1642 -0
  849. mypyc/ir/pprint.py +496 -0
  850. mypyc/ir/rtypes.py +1038 -0
  851. mypyc/irbuild/__init__.py +0 -0
  852. mypyc/irbuild/ast_helpers.py +120 -0
  853. mypyc/irbuild/builder.py +1398 -0
  854. mypyc/irbuild/callable_class.py +173 -0
  855. mypyc/irbuild/classdef.py +850 -0
  856. mypyc/irbuild/constant_fold.py +95 -0
  857. mypyc/irbuild/context.py +186 -0
  858. mypyc/irbuild/env_class.py +223 -0
  859. mypyc/irbuild/expression.py +1067 -0
  860. mypyc/irbuild/for_helpers.py +1046 -0
  861. mypyc/irbuild/format_str_tokenizer.py +250 -0
  862. mypyc/irbuild/function.py +1089 -0
  863. mypyc/irbuild/generator.py +346 -0
  864. mypyc/irbuild/ll_builder.py +2407 -0
  865. mypyc/irbuild/main.py +153 -0
  866. mypyc/irbuild/mapper.py +221 -0
  867. mypyc/irbuild/match.py +355 -0
  868. mypyc/irbuild/nonlocalcontrol.py +197 -0
  869. mypyc/irbuild/prebuildvisitor.py +203 -0
  870. mypyc/irbuild/prepare.py +609 -0
  871. mypyc/irbuild/specialize.py +822 -0
  872. mypyc/irbuild/statement.py +1017 -0
  873. mypyc/irbuild/targets.py +57 -0
  874. mypyc/irbuild/util.py +189 -0
  875. mypyc/irbuild/visitor.py +401 -0
  876. mypyc/irbuild/vtable.py +82 -0
  877. mypyc/lib-rt/CPy.h +643 -0
  878. mypyc/lib-rt/bytes_ops.c +143 -0
  879. mypyc/lib-rt/dict_ops.c +446 -0
  880. mypyc/lib-rt/exc_ops.c +259 -0
  881. mypyc/lib-rt/float_ops.c +192 -0
  882. mypyc/lib-rt/generic_ops.c +64 -0
  883. mypyc/lib-rt/getargs.c +450 -0
  884. mypyc/lib-rt/getargsfast.c +569 -0
  885. mypyc/lib-rt/init.c +13 -0
  886. mypyc/lib-rt/int_ops.c +803 -0
  887. mypyc/lib-rt/list_ops.c +335 -0
  888. mypyc/lib-rt/misc_ops.c +942 -0
  889. mypyc/lib-rt/module_shim.tmpl +18 -0
  890. mypyc/lib-rt/mypyc_util.h +118 -0
  891. mypyc/lib-rt/pythoncapi_compat.h +497 -0
  892. mypyc/lib-rt/pythonsupport.h +548 -0
  893. mypyc/lib-rt/set_ops.c +17 -0
  894. mypyc/lib-rt/setup.py +70 -0
  895. mypyc/lib-rt/str_ops.c +241 -0
  896. mypyc/lib-rt/test_capi.cc +585 -0
  897. mypyc/lib-rt/tuple_ops.c +61 -0
  898. mypyc/namegen.py +115 -0
  899. mypyc/options.py +32 -0
  900. mypyc/primitives/__init__.py +0 -0
  901. mypyc/primitives/bytes_ops.py +101 -0
  902. mypyc/primitives/dict_ops.py +325 -0
  903. mypyc/primitives/exc_ops.py +101 -0
  904. mypyc/primitives/float_ops.py +168 -0
  905. mypyc/primitives/generic_ops.py +384 -0
  906. mypyc/primitives/int_ops.py +304 -0
  907. mypyc/primitives/list_ops.py +300 -0
  908. mypyc/primitives/misc_ops.py +241 -0
  909. mypyc/primitives/registry.py +323 -0
  910. mypyc/primitives/set_ops.py +121 -0
  911. mypyc/primitives/str_ops.py +229 -0
  912. mypyc/primitives/tuple_ops.py +83 -0
  913. mypyc/rt_subtype.py +77 -0
  914. mypyc/sametype.py +83 -0
  915. mypyc/subtype.py +88 -0
  916. mypyc/test/__init__.py +0 -0
  917. mypyc/test/config.py +13 -0
  918. mypyc/test/test_alwaysdefined.py +46 -0
  919. mypyc/test/test_analysis.py +77 -0
  920. mypyc/test/test_cheader.py +45 -0
  921. mypyc/test/test_commandline.py +82 -0
  922. mypyc/test/test_emit.py +69 -0
  923. mypyc/test/test_emitclass.py +35 -0
  924. mypyc/test/test_emitfunc.py +926 -0
  925. mypyc/test/test_emitwrapper.py +60 -0
  926. mypyc/test/test_exceptions.py +56 -0
  927. mypyc/test/test_external.py +49 -0
  928. mypyc/test/test_irbuild.py +87 -0
  929. mypyc/test/test_ircheck.py +199 -0
  930. mypyc/test/test_literals.py +90 -0
  931. mypyc/test/test_namegen.py +48 -0
  932. mypyc/test/test_pprint.py +42 -0
  933. mypyc/test/test_rarray.py +48 -0
  934. mypyc/test/test_refcount.py +59 -0
  935. mypyc/test/test_run.py +426 -0
  936. mypyc/test/test_serialization.py +108 -0
  937. mypyc/test/test_struct.py +112 -0
  938. mypyc/test/test_tuplename.py +33 -0
  939. mypyc/test/test_typeops.py +97 -0
  940. mypyc/test/testutil.py +283 -0
  941. mypyc/test-data/alwaysdefined.test +732 -0
  942. mypyc/test-data/analysis.test +603 -0
  943. mypyc/test-data/commandline.test +245 -0
  944. mypyc/test-data/driver/driver.py +48 -0
  945. mypyc/test-data/exceptions-freq.test +125 -0
  946. mypyc/test-data/exceptions.test +713 -0
  947. mypyc/test-data/fixtures/ir.py +373 -0
  948. mypyc/test-data/fixtures/testutil.py +103 -0
  949. mypyc/test-data/fixtures/typing-full.pyi +169 -0
  950. mypyc/test-data/irbuild-any.test +238 -0
  951. mypyc/test-data/irbuild-basic.test +3690 -0
  952. mypyc/test-data/irbuild-bool.test +463 -0
  953. mypyc/test-data/irbuild-bytes.test +184 -0
  954. mypyc/test-data/irbuild-classes.test +1303 -0
  955. mypyc/test-data/irbuild-constant-fold.test +480 -0
  956. mypyc/test-data/irbuild-dict.test +585 -0
  957. mypyc/test-data/irbuild-dunders.test +223 -0
  958. mypyc/test-data/irbuild-float.test +497 -0
  959. mypyc/test-data/irbuild-generics.test +151 -0
  960. mypyc/test-data/irbuild-glue-methods.test +437 -0
  961. mypyc/test-data/irbuild-i16.test +526 -0
  962. mypyc/test-data/irbuild-i32.test +598 -0
  963. mypyc/test-data/irbuild-i64.test +2164 -0
  964. mypyc/test-data/irbuild-int.test +235 -0
  965. mypyc/test-data/irbuild-isinstance.test +109 -0
  966. mypyc/test-data/irbuild-lists.test +547 -0
  967. mypyc/test-data/irbuild-match.test +1708 -0
  968. mypyc/test-data/irbuild-math.test +64 -0
  969. mypyc/test-data/irbuild-nested.test +807 -0
  970. mypyc/test-data/irbuild-optional.test +536 -0
  971. mypyc/test-data/irbuild-set.test +838 -0
  972. mypyc/test-data/irbuild-singledispatch.test +257 -0
  973. mypyc/test-data/irbuild-statements.test +1149 -0
  974. mypyc/test-data/irbuild-str.test +314 -0
  975. mypyc/test-data/irbuild-strip-asserts.test +12 -0
  976. mypyc/test-data/irbuild-try.test +523 -0
  977. mypyc/test-data/irbuild-tuple.test +462 -0
  978. mypyc/test-data/irbuild-u8.test +543 -0
  979. mypyc/test-data/irbuild-unreachable.test +241 -0
  980. mypyc/test-data/irbuild-vectorcall.test +153 -0
  981. mypyc/test-data/refcount.test +1588 -0
  982. mypyc/test-data/run-async.test +145 -0
  983. mypyc/test-data/run-attrs.test +318 -0
  984. mypyc/test-data/run-bench.test +196 -0
  985. mypyc/test-data/run-bools.test +229 -0
  986. mypyc/test-data/run-bytes.test +302 -0
  987. mypyc/test-data/run-classes.test +2505 -0
  988. mypyc/test-data/run-dicts.test +334 -0
  989. mypyc/test-data/run-dunders.test +945 -0
  990. mypyc/test-data/run-exceptions.test +448 -0
  991. mypyc/test-data/run-floats.test +516 -0
  992. mypyc/test-data/run-functions.test +1310 -0
  993. mypyc/test-data/run-generators.test +681 -0
  994. mypyc/test-data/run-i16.test +338 -0
  995. mypyc/test-data/run-i32.test +336 -0
  996. mypyc/test-data/run-i64.test +1519 -0
  997. mypyc/test-data/run-imports.test +265 -0
  998. mypyc/test-data/run-integers.test +540 -0
  999. mypyc/test-data/run-lists.test +411 -0
  1000. mypyc/test-data/run-loops.test +485 -0
  1001. mypyc/test-data/run-match.test +283 -0
  1002. mypyc/test-data/run-math.test +106 -0
  1003. mypyc/test-data/run-misc.test +1168 -0
  1004. mypyc/test-data/run-multimodule.test +887 -0
  1005. mypyc/test-data/run-mypy-sim.test +138 -0
  1006. mypyc/test-data/run-primitives.test +375 -0
  1007. mypyc/test-data/run-python37.test +159 -0
  1008. mypyc/test-data/run-python38.test +88 -0
  1009. mypyc/test-data/run-sets.test +150 -0
  1010. mypyc/test-data/run-singledispatch.test +698 -0
  1011. mypyc/test-data/run-strings.test +641 -0
  1012. mypyc/test-data/run-traits.test +411 -0
  1013. mypyc/test-data/run-tuples.test +258 -0
  1014. mypyc/test-data/run-u8.test +303 -0
  1015. mypyc/transform/__init__.py +0 -0
  1016. mypyc/transform/exceptions.py +182 -0
  1017. mypyc/transform/refcount.py +294 -0
  1018. mypyc/transform/uninit.py +190 -0
@@ -0,0 +1,1089 @@
1
+ """Transform mypy AST functions to IR (and related things).
2
+
3
+ Normal functions are translated into a list of basic blocks
4
+ containing various IR ops (defined in mypyc.ir.ops).
5
+
6
+ This also deals with generators, async functions and nested
7
+ functions. All of these are transformed into callable classes. These
8
+ have a custom __call__ method that implements the call, and state, such
9
+ as an environment containing non-local variables, is stored in the
10
+ instance of the callable class.
11
+ """
12
+
13
+ from __future__ import annotations
14
+
15
+ from collections import defaultdict
16
+ from typing import NamedTuple, Sequence
17
+
18
+ from mypy.nodes import (
19
+ ArgKind,
20
+ ClassDef,
21
+ Decorator,
22
+ FuncBase,
23
+ FuncDef,
24
+ FuncItem,
25
+ LambdaExpr,
26
+ OverloadedFuncDef,
27
+ SymbolNode,
28
+ TypeInfo,
29
+ Var,
30
+ )
31
+ from mypy.types import CallableType, get_proper_type
32
+ from mypyc.common import LAMBDA_NAME, PROPSET_PREFIX, SELF_NAME
33
+ from mypyc.ir.class_ir import ClassIR, NonExtClassInfo
34
+ from mypyc.ir.func_ir import (
35
+ FUNC_CLASSMETHOD,
36
+ FUNC_NORMAL,
37
+ FUNC_STATICMETHOD,
38
+ FuncDecl,
39
+ FuncIR,
40
+ FuncSignature,
41
+ RuntimeArg,
42
+ )
43
+ from mypyc.ir.ops import (
44
+ BasicBlock,
45
+ GetAttr,
46
+ InitStatic,
47
+ Integer,
48
+ LoadAddress,
49
+ LoadLiteral,
50
+ Register,
51
+ Return,
52
+ SetAttr,
53
+ Unbox,
54
+ Unreachable,
55
+ Value,
56
+ )
57
+ from mypyc.ir.rtypes import (
58
+ RInstance,
59
+ bool_rprimitive,
60
+ dict_rprimitive,
61
+ int_rprimitive,
62
+ object_rprimitive,
63
+ )
64
+ from mypyc.irbuild.builder import IRBuilder, SymbolTarget, gen_arg_defaults
65
+ from mypyc.irbuild.callable_class import (
66
+ add_call_to_callable_class,
67
+ add_get_to_callable_class,
68
+ instantiate_callable_class,
69
+ setup_callable_class,
70
+ )
71
+ from mypyc.irbuild.context import FuncInfo, ImplicitClass
72
+ from mypyc.irbuild.env_class import (
73
+ finalize_env_class,
74
+ load_env_registers,
75
+ load_outer_envs,
76
+ setup_env_class,
77
+ setup_func_for_recursive_call,
78
+ )
79
+ from mypyc.irbuild.generator import (
80
+ add_methods_to_generator_class,
81
+ add_raise_exception_blocks_to_generator_class,
82
+ create_switch_for_generator_class,
83
+ gen_generator_func,
84
+ populate_switch_for_generator_class,
85
+ setup_env_for_generator_class,
86
+ )
87
+ from mypyc.irbuild.targets import AssignmentTarget
88
+ from mypyc.irbuild.util import is_constant
89
+ from mypyc.primitives.dict_ops import dict_get_method_with_none, dict_new_op, dict_set_item_op
90
+ from mypyc.primitives.generic_ops import py_setattr_op
91
+ from mypyc.primitives.misc_ops import register_function
92
+ from mypyc.primitives.registry import builtin_names
93
+ from mypyc.sametype import is_same_method_signature, is_same_type
94
+
95
+ # Top-level transform functions
96
+
97
+
98
+ def transform_func_def(builder: IRBuilder, fdef: FuncDef) -> None:
99
+ func_ir, func_reg = gen_func_item(builder, fdef, fdef.name, builder.mapper.fdef_to_sig(fdef))
100
+
101
+ # If the function that was visited was a nested function, then either look it up in our
102
+ # current environment or define it if it was not already defined.
103
+ if func_reg:
104
+ builder.assign(get_func_target(builder, fdef), func_reg, fdef.line)
105
+ maybe_insert_into_registry_dict(builder, fdef)
106
+ builder.add_function(func_ir, fdef.line)
107
+
108
+
109
+ def transform_overloaded_func_def(builder: IRBuilder, o: OverloadedFuncDef) -> None:
110
+ # Handle regular overload case
111
+ assert o.impl
112
+ builder.accept(o.impl)
113
+
114
+
115
+ def transform_decorator(builder: IRBuilder, dec: Decorator) -> None:
116
+ func_ir, func_reg = gen_func_item(
117
+ builder, dec.func, dec.func.name, builder.mapper.fdef_to_sig(dec.func)
118
+ )
119
+ decorated_func: Value | None = None
120
+ if func_reg:
121
+ decorated_func = load_decorated_func(builder, dec.func, func_reg)
122
+ builder.assign(get_func_target(builder, dec.func), decorated_func, dec.func.line)
123
+ # If the prebuild pass didn't put this function in the function to decorators map (for example
124
+ # if this is a registered singledispatch implementation with no other decorators), we should
125
+ # treat this function as a regular function, not a decorated function
126
+ elif dec.func in builder.fdefs_to_decorators:
127
+ # Obtain the function name in order to construct the name of the helper function.
128
+ name = dec.func.fullname.split(".")[-1]
129
+
130
+ # Load the callable object representing the non-decorated function, and decorate it.
131
+ orig_func = builder.load_global_str(name, dec.line)
132
+ decorated_func = load_decorated_func(builder, dec.func, orig_func)
133
+
134
+ if decorated_func is not None:
135
+ # Set the callable object representing the decorated function as a global.
136
+ builder.call_c(
137
+ dict_set_item_op,
138
+ [builder.load_globals_dict(), builder.load_str(dec.func.name), decorated_func],
139
+ decorated_func.line,
140
+ )
141
+
142
+ maybe_insert_into_registry_dict(builder, dec.func)
143
+
144
+ builder.functions.append(func_ir)
145
+
146
+
147
+ def transform_lambda_expr(builder: IRBuilder, expr: LambdaExpr) -> Value:
148
+ typ = get_proper_type(builder.types[expr])
149
+ assert isinstance(typ, CallableType)
150
+
151
+ runtime_args = []
152
+ for arg, arg_type in zip(expr.arguments, typ.arg_types):
153
+ arg.variable.type = arg_type
154
+ runtime_args.append(
155
+ RuntimeArg(arg.variable.name, builder.type_to_rtype(arg_type), arg.kind)
156
+ )
157
+ ret_type = builder.type_to_rtype(typ.ret_type)
158
+
159
+ fsig = FuncSignature(runtime_args, ret_type)
160
+
161
+ fname = f"{LAMBDA_NAME}{builder.lambda_counter}"
162
+ builder.lambda_counter += 1
163
+ func_ir, func_reg = gen_func_item(builder, expr, fname, fsig)
164
+ assert func_reg is not None
165
+
166
+ builder.functions.append(func_ir)
167
+ return func_reg
168
+
169
+
170
+ # Internal functions
171
+
172
+
173
+ def gen_func_item(
174
+ builder: IRBuilder,
175
+ fitem: FuncItem,
176
+ name: str,
177
+ sig: FuncSignature,
178
+ cdef: ClassDef | None = None,
179
+ ) -> tuple[FuncIR, Value | None]:
180
+ """Generate and return the FuncIR for a given FuncDef.
181
+
182
+ If the given FuncItem is a nested function, then we generate a
183
+ callable class representing the function and use that instead of
184
+ the actual function. if the given FuncItem contains a nested
185
+ function, then we generate an environment class so that inner
186
+ nested functions can access the environment of the given FuncDef.
187
+
188
+ Consider the following nested function:
189
+
190
+ def a() -> None:
191
+ def b() -> None:
192
+ def c() -> None:
193
+ return None
194
+ return None
195
+ return None
196
+
197
+ The classes generated would look something like the following.
198
+
199
+ has pointer to +-------+
200
+ +--------------------------> | a_env |
201
+ | +-------+
202
+ | ^
203
+ | | has pointer to
204
+ +-------+ associated with +-------+
205
+ | b_obj | -------------------> | b_env |
206
+ +-------+ +-------+
207
+ ^
208
+ |
209
+ +-------+ has pointer to |
210
+ | c_obj | --------------------------+
211
+ +-------+
212
+ """
213
+
214
+ # TODO: do something about abstract methods.
215
+
216
+ func_reg: Value | None = None
217
+
218
+ # We treat lambdas as always being nested because we always generate
219
+ # a class for lambdas, no matter where they are. (It would probably also
220
+ # work to special case toplevel lambdas and generate a non-class function.)
221
+ is_nested = fitem in builder.nested_fitems or isinstance(fitem, LambdaExpr)
222
+ contains_nested = fitem in builder.encapsulating_funcs.keys()
223
+ is_decorated = fitem in builder.fdefs_to_decorators
224
+ is_singledispatch = fitem in builder.singledispatch_impls
225
+ in_non_ext = False
226
+ add_nested_funcs_to_env = has_nested_func_self_reference(builder, fitem)
227
+ class_name = None
228
+ if cdef:
229
+ ir = builder.mapper.type_to_ir[cdef.info]
230
+ in_non_ext = not ir.is_ext_class
231
+ class_name = cdef.name
232
+
233
+ if is_singledispatch:
234
+ func_name = singledispatch_main_func_name(name)
235
+ else:
236
+ func_name = name
237
+ builder.enter(
238
+ FuncInfo(
239
+ fitem=fitem,
240
+ name=func_name,
241
+ class_name=class_name,
242
+ namespace=gen_func_ns(builder),
243
+ is_nested=is_nested,
244
+ contains_nested=contains_nested,
245
+ is_decorated=is_decorated,
246
+ in_non_ext=in_non_ext,
247
+ add_nested_funcs_to_env=add_nested_funcs_to_env,
248
+ )
249
+ )
250
+
251
+ # Functions that contain nested functions need an environment class to store variables that
252
+ # are free in their nested functions. Generator functions need an environment class to
253
+ # store a variable denoting the next instruction to be executed when the __next__ function
254
+ # is called, along with all the variables inside the function itself.
255
+ if builder.fn_info.contains_nested or builder.fn_info.is_generator:
256
+ setup_env_class(builder)
257
+
258
+ if builder.fn_info.is_nested or builder.fn_info.in_non_ext:
259
+ setup_callable_class(builder)
260
+
261
+ if builder.fn_info.is_generator:
262
+ # Do a first-pass and generate a function that just returns a generator object.
263
+ gen_generator_func(builder)
264
+ args, _, blocks, ret_type, fn_info = builder.leave()
265
+ func_ir, func_reg = gen_func_ir(
266
+ builder, args, blocks, sig, fn_info, cdef, is_singledispatch
267
+ )
268
+
269
+ # Re-enter the FuncItem and visit the body of the function this time.
270
+ builder.enter(fn_info)
271
+ setup_env_for_generator_class(builder)
272
+ load_outer_envs(builder, builder.fn_info.generator_class)
273
+ top_level = builder.top_level_fn_info()
274
+ if (
275
+ builder.fn_info.is_nested
276
+ and isinstance(fitem, FuncDef)
277
+ and top_level
278
+ and top_level.add_nested_funcs_to_env
279
+ ):
280
+ setup_func_for_recursive_call(builder, fitem, builder.fn_info.generator_class)
281
+ create_switch_for_generator_class(builder)
282
+ add_raise_exception_blocks_to_generator_class(builder, fitem.line)
283
+ else:
284
+ load_env_registers(builder)
285
+ gen_arg_defaults(builder)
286
+
287
+ if builder.fn_info.contains_nested and not builder.fn_info.is_generator:
288
+ finalize_env_class(builder)
289
+
290
+ builder.ret_types[-1] = sig.ret_type
291
+
292
+ # Add all variables and functions that are declared/defined within this
293
+ # function and are referenced in functions nested within this one to this
294
+ # function's environment class so the nested functions can reference
295
+ # them even if they are declared after the nested function's definition.
296
+ # Note that this is done before visiting the body of this function.
297
+
298
+ env_for_func: FuncInfo | ImplicitClass = builder.fn_info
299
+ if builder.fn_info.is_generator:
300
+ env_for_func = builder.fn_info.generator_class
301
+ elif builder.fn_info.is_nested or builder.fn_info.in_non_ext:
302
+ env_for_func = builder.fn_info.callable_class
303
+
304
+ if builder.fn_info.fitem in builder.free_variables:
305
+ # Sort the variables to keep things deterministic
306
+ for var in sorted(builder.free_variables[builder.fn_info.fitem], key=lambda x: x.name):
307
+ if isinstance(var, Var):
308
+ rtype = builder.type_to_rtype(var.type)
309
+ builder.add_var_to_env_class(var, rtype, env_for_func, reassign=False)
310
+
311
+ if builder.fn_info.fitem in builder.encapsulating_funcs:
312
+ for nested_fn in builder.encapsulating_funcs[builder.fn_info.fitem]:
313
+ if isinstance(nested_fn, FuncDef):
314
+ # The return type is 'object' instead of an RInstance of the
315
+ # callable class because differently defined functions with
316
+ # the same name and signature across conditional blocks
317
+ # will generate different callable classes, so the callable
318
+ # class that gets instantiated must be generic.
319
+ builder.add_var_to_env_class(
320
+ nested_fn, object_rprimitive, env_for_func, reassign=False
321
+ )
322
+
323
+ builder.accept(fitem.body)
324
+ builder.maybe_add_implicit_return()
325
+
326
+ if builder.fn_info.is_generator:
327
+ populate_switch_for_generator_class(builder)
328
+
329
+ # Hang on to the local symbol table for a while, since we use it
330
+ # to calculate argument defaults below.
331
+ symtable = builder.symtables[-1]
332
+
333
+ args, _, blocks, ret_type, fn_info = builder.leave()
334
+
335
+ if fn_info.is_generator:
336
+ add_methods_to_generator_class(builder, fn_info, sig, args, blocks, fitem.is_coroutine)
337
+ else:
338
+ func_ir, func_reg = gen_func_ir(
339
+ builder, args, blocks, sig, fn_info, cdef, is_singledispatch
340
+ )
341
+
342
+ # Evaluate argument defaults in the surrounding scope, since we
343
+ # calculate them *once* when the function definition is evaluated.
344
+ calculate_arg_defaults(builder, fn_info, func_reg, symtable)
345
+
346
+ if is_singledispatch:
347
+ # add the generated main singledispatch function
348
+ builder.functions.append(func_ir)
349
+ # create the dispatch function
350
+ assert isinstance(fitem, FuncDef)
351
+ return gen_dispatch_func_ir(builder, fitem, fn_info.name, name, sig)
352
+
353
+ return func_ir, func_reg
354
+
355
+
356
+ def has_nested_func_self_reference(builder: IRBuilder, fitem: FuncItem) -> bool:
357
+ """Does a nested function contain a self-reference in its body?
358
+
359
+ If a nested function only has references in the surrounding function,
360
+ we don't need to add it to the environment.
361
+ """
362
+ if any(isinstance(sym, FuncBase) for sym in builder.free_variables.get(fitem, set())):
363
+ return True
364
+ return any(
365
+ has_nested_func_self_reference(builder, nested)
366
+ for nested in builder.encapsulating_funcs.get(fitem, [])
367
+ )
368
+
369
+
370
+ def gen_func_ir(
371
+ builder: IRBuilder,
372
+ args: list[Register],
373
+ blocks: list[BasicBlock],
374
+ sig: FuncSignature,
375
+ fn_info: FuncInfo,
376
+ cdef: ClassDef | None,
377
+ is_singledispatch_main_func: bool = False,
378
+ ) -> tuple[FuncIR, Value | None]:
379
+ """Generate the FuncIR for a function.
380
+
381
+ This takes the basic blocks and function info of a particular
382
+ function and returns the IR. If the function is nested,
383
+ also returns the register containing the instance of the
384
+ corresponding callable class.
385
+ """
386
+ func_reg: Value | None = None
387
+ if fn_info.is_nested or fn_info.in_non_ext:
388
+ func_ir = add_call_to_callable_class(builder, args, blocks, sig, fn_info)
389
+ add_get_to_callable_class(builder, fn_info)
390
+ func_reg = instantiate_callable_class(builder, fn_info)
391
+ else:
392
+ assert isinstance(fn_info.fitem, FuncDef)
393
+ func_decl = builder.mapper.func_to_decl[fn_info.fitem]
394
+ if fn_info.is_decorated or is_singledispatch_main_func:
395
+ class_name = None if cdef is None else cdef.name
396
+ func_decl = FuncDecl(
397
+ fn_info.name,
398
+ class_name,
399
+ builder.module_name,
400
+ sig,
401
+ func_decl.kind,
402
+ func_decl.is_prop_getter,
403
+ func_decl.is_prop_setter,
404
+ )
405
+ func_ir = FuncIR(
406
+ func_decl, args, blocks, fn_info.fitem.line, traceback_name=fn_info.fitem.name
407
+ )
408
+ else:
409
+ func_ir = FuncIR(
410
+ func_decl, args, blocks, fn_info.fitem.line, traceback_name=fn_info.fitem.name
411
+ )
412
+ return (func_ir, func_reg)
413
+
414
+
415
+ def handle_ext_method(builder: IRBuilder, cdef: ClassDef, fdef: FuncDef) -> None:
416
+ # Perform the function of visit_method for methods inside extension classes.
417
+ name = fdef.name
418
+ class_ir = builder.mapper.type_to_ir[cdef.info]
419
+ func_ir, func_reg = gen_func_item(builder, fdef, name, builder.mapper.fdef_to_sig(fdef), cdef)
420
+ builder.functions.append(func_ir)
421
+
422
+ if is_decorated(builder, fdef):
423
+ # Obtain the function name in order to construct the name of the helper function.
424
+ _, _, name = fdef.fullname.rpartition(".")
425
+ # Read the PyTypeObject representing the class, get the callable object
426
+ # representing the non-decorated method
427
+ typ = builder.load_native_type_object(cdef.fullname)
428
+ orig_func = builder.py_get_attr(typ, name, fdef.line)
429
+
430
+ # Decorate the non-decorated method
431
+ decorated_func = load_decorated_func(builder, fdef, orig_func)
432
+
433
+ # Set the callable object representing the decorated method as an attribute of the
434
+ # extension class.
435
+ builder.call_c(py_setattr_op, [typ, builder.load_str(name), decorated_func], fdef.line)
436
+
437
+ if fdef.is_property:
438
+ # If there is a property setter, it will be processed after the getter,
439
+ # We populate the optional setter field with none for now.
440
+ assert name not in class_ir.properties
441
+ class_ir.properties[name] = (func_ir, None)
442
+
443
+ elif fdef in builder.prop_setters:
444
+ # The respective property getter must have been processed already
445
+ assert name in class_ir.properties
446
+ getter_ir, _ = class_ir.properties[name]
447
+ class_ir.properties[name] = (getter_ir, func_ir)
448
+
449
+ class_ir.methods[func_ir.decl.name] = func_ir
450
+
451
+ # If this overrides a parent class method with a different type, we need
452
+ # to generate a glue method to mediate between them.
453
+ for base in class_ir.mro[1:]:
454
+ if (
455
+ name in base.method_decls
456
+ and name != "__init__"
457
+ and not is_same_method_signature(
458
+ class_ir.method_decls[name].sig, base.method_decls[name].sig
459
+ )
460
+ ):
461
+ # TODO: Support contravariant subtyping in the input argument for
462
+ # property setters. Need to make a special glue method for handling this,
463
+ # similar to gen_glue_property.
464
+
465
+ f = gen_glue(builder, base.method_decls[name].sig, func_ir, class_ir, base, fdef)
466
+ class_ir.glue_methods[(base, name)] = f
467
+ builder.functions.append(f)
468
+
469
+ # If the class allows interpreted children, create glue
470
+ # methods that dispatch via the Python API. These will go in a
471
+ # "shadow vtable" that will be assigned to interpreted
472
+ # children.
473
+ if class_ir.allow_interpreted_subclasses:
474
+ f = gen_glue(builder, func_ir.sig, func_ir, class_ir, class_ir, fdef, do_py_ops=True)
475
+ class_ir.glue_methods[(class_ir, name)] = f
476
+ builder.functions.append(f)
477
+
478
+
479
+ def handle_non_ext_method(
480
+ builder: IRBuilder, non_ext: NonExtClassInfo, cdef: ClassDef, fdef: FuncDef
481
+ ) -> None:
482
+ # Perform the function of visit_method for methods inside non-extension classes.
483
+ name = fdef.name
484
+ func_ir, func_reg = gen_func_item(builder, fdef, name, builder.mapper.fdef_to_sig(fdef), cdef)
485
+ assert func_reg is not None
486
+ builder.functions.append(func_ir)
487
+
488
+ if is_decorated(builder, fdef):
489
+ # The undecorated method is a generated callable class
490
+ orig_func = func_reg
491
+ func_reg = load_decorated_func(builder, fdef, orig_func)
492
+
493
+ # TODO: Support property setters in non-extension classes
494
+ if fdef.is_property:
495
+ prop = builder.load_module_attr_by_fullname("builtins.property", fdef.line)
496
+ func_reg = builder.py_call(prop, [func_reg], fdef.line)
497
+
498
+ elif builder.mapper.func_to_decl[fdef].kind == FUNC_CLASSMETHOD:
499
+ cls_meth = builder.load_module_attr_by_fullname("builtins.classmethod", fdef.line)
500
+ func_reg = builder.py_call(cls_meth, [func_reg], fdef.line)
501
+
502
+ elif builder.mapper.func_to_decl[fdef].kind == FUNC_STATICMETHOD:
503
+ stat_meth = builder.load_module_attr_by_fullname("builtins.staticmethod", fdef.line)
504
+ func_reg = builder.py_call(stat_meth, [func_reg], fdef.line)
505
+
506
+ builder.add_to_non_ext_dict(non_ext, name, func_reg, fdef.line)
507
+
508
+
509
+ def calculate_arg_defaults(
510
+ builder: IRBuilder,
511
+ fn_info: FuncInfo,
512
+ func_reg: Value | None,
513
+ symtable: dict[SymbolNode, SymbolTarget],
514
+ ) -> None:
515
+ """Calculate default argument values and store them.
516
+
517
+ They are stored in statics for top level functions and in
518
+ the function objects for nested functions (while constants are
519
+ still stored computed on demand).
520
+ """
521
+ fitem = fn_info.fitem
522
+ for arg in fitem.arguments:
523
+ # Constant values don't get stored but just recomputed
524
+ if arg.initializer and not is_constant(arg.initializer):
525
+ value = builder.coerce(
526
+ builder.accept(arg.initializer), symtable[arg.variable].type, arg.line
527
+ )
528
+ if not fn_info.is_nested:
529
+ name = fitem.fullname + "." + arg.variable.name
530
+ builder.add(InitStatic(value, name, builder.module_name))
531
+ else:
532
+ assert func_reg is not None
533
+ builder.add(SetAttr(func_reg, arg.variable.name, value, arg.line))
534
+
535
+
536
+ def gen_func_ns(builder: IRBuilder) -> str:
537
+ """Generate a namespace for a nested function using its outer function names."""
538
+ return "_".join(
539
+ info.name + ("" if not info.class_name else "_" + info.class_name)
540
+ for info in builder.fn_infos
541
+ if info.name and info.name != "<module>"
542
+ )
543
+
544
+
545
+ def load_decorated_func(builder: IRBuilder, fdef: FuncDef, orig_func_reg: Value) -> Value:
546
+ """Apply decorators to a function.
547
+
548
+ Given a decorated FuncDef and an instance of the callable class
549
+ representing that FuncDef, apply the corresponding decorator
550
+ functions on that decorated FuncDef and return the decorated
551
+ function.
552
+ """
553
+ if not is_decorated(builder, fdef):
554
+ # If there are no decorators associated with the function, then just return the
555
+ # original function.
556
+ return orig_func_reg
557
+
558
+ decorators = builder.fdefs_to_decorators[fdef]
559
+ func_reg = orig_func_reg
560
+ for d in reversed(decorators):
561
+ decorator = d.accept(builder.visitor)
562
+ assert isinstance(decorator, Value)
563
+ func_reg = builder.py_call(decorator, [func_reg], func_reg.line)
564
+ return func_reg
565
+
566
+
567
+ def is_decorated(builder: IRBuilder, fdef: FuncDef) -> bool:
568
+ return fdef in builder.fdefs_to_decorators
569
+
570
+
571
+ def gen_glue(
572
+ builder: IRBuilder,
573
+ base_sig: FuncSignature,
574
+ target: FuncIR,
575
+ cls: ClassIR,
576
+ base: ClassIR,
577
+ fdef: FuncItem,
578
+ *,
579
+ do_py_ops: bool = False,
580
+ ) -> FuncIR:
581
+ """Generate glue methods that mediate between different method types in subclasses.
582
+
583
+ Works on both properties and methods. See gen_glue_methods below
584
+ for more details.
585
+
586
+ If do_py_ops is True, then the glue methods should use generic
587
+ C API operations instead of direct calls, to enable generating
588
+ "shadow" glue methods that work with interpreted subclasses.
589
+ """
590
+ if fdef.is_property:
591
+ return gen_glue_property(builder, base_sig, target, cls, base, fdef.line, do_py_ops)
592
+ else:
593
+ return gen_glue_method(builder, base_sig, target, cls, base, fdef.line, do_py_ops)
594
+
595
+
596
+ class ArgInfo(NamedTuple):
597
+ args: list[Value]
598
+ arg_names: list[str | None]
599
+ arg_kinds: list[ArgKind]
600
+
601
+
602
+ def get_args(builder: IRBuilder, rt_args: Sequence[RuntimeArg], line: int) -> ArgInfo:
603
+ # The environment operates on Vars, so we make some up
604
+ fake_vars = [(Var(arg.name), arg.type) for arg in rt_args]
605
+ args = [
606
+ builder.read(builder.add_local_reg(var, type, is_arg=True), line)
607
+ for var, type in fake_vars
608
+ ]
609
+ arg_names = [
610
+ arg.name if arg.kind.is_named() or (arg.kind.is_optional() and not arg.pos_only) else None
611
+ for arg in rt_args
612
+ ]
613
+ arg_kinds = [arg.kind for arg in rt_args]
614
+ return ArgInfo(args, arg_names, arg_kinds)
615
+
616
+
617
+ def gen_glue_method(
618
+ builder: IRBuilder,
619
+ base_sig: FuncSignature,
620
+ target: FuncIR,
621
+ cls: ClassIR,
622
+ base: ClassIR,
623
+ line: int,
624
+ do_pycall: bool,
625
+ ) -> FuncIR:
626
+ """Generate glue methods that mediate between different method types in subclasses.
627
+
628
+ For example, if we have:
629
+
630
+ class A:
631
+ def f(builder: IRBuilder, x: int) -> object: ...
632
+
633
+ then it is totally permissible to have a subclass
634
+
635
+ class B(A):
636
+ def f(builder: IRBuilder, x: object) -> int: ...
637
+
638
+ since '(object) -> int' is a subtype of '(int) -> object' by the usual
639
+ contra/co-variant function subtyping rules.
640
+
641
+ The trickiness here is that int and object have different
642
+ runtime representations in mypyc, so A.f and B.f have
643
+ different signatures at the native C level. To deal with this,
644
+ we need to generate glue methods that mediate between the
645
+ different versions by coercing the arguments and return
646
+ values.
647
+
648
+ If do_pycall is True, then make the call using the C API
649
+ instead of a native call.
650
+ """
651
+ check_native_override(builder, base_sig, target.decl.sig, line)
652
+
653
+ builder.enter()
654
+ builder.ret_types[-1] = base_sig.ret_type
655
+
656
+ rt_args = list(base_sig.args)
657
+ if target.decl.kind == FUNC_NORMAL:
658
+ rt_args[0] = RuntimeArg(base_sig.args[0].name, RInstance(cls))
659
+
660
+ arg_info = get_args(builder, rt_args, line)
661
+ args, arg_kinds, arg_names = arg_info.args, arg_info.arg_kinds, arg_info.arg_names
662
+
663
+ bitmap_args = None
664
+ if base_sig.num_bitmap_args:
665
+ args = args[: -base_sig.num_bitmap_args]
666
+ arg_kinds = arg_kinds[: -base_sig.num_bitmap_args]
667
+ arg_names = arg_names[: -base_sig.num_bitmap_args]
668
+ bitmap_args = list(builder.builder.args[-base_sig.num_bitmap_args :])
669
+
670
+ # We can do a passthrough *args/**kwargs with a native call, but if the
671
+ # args need to get distributed out to arguments, we just let python handle it
672
+ if any(kind.is_star() for kind in arg_kinds) and any(
673
+ not arg.kind.is_star() for arg in target.decl.sig.args
674
+ ):
675
+ do_pycall = True
676
+
677
+ if do_pycall:
678
+ if target.decl.kind == FUNC_STATICMETHOD:
679
+ # FIXME: this won't work if we can do interpreted subclasses
680
+ first = builder.builder.get_native_type(cls)
681
+ st = 0
682
+ else:
683
+ first = args[0]
684
+ st = 1
685
+ retval = builder.builder.py_method_call(
686
+ first, target.name, args[st:], line, arg_kinds[st:], arg_names[st:]
687
+ )
688
+ else:
689
+ retval = builder.builder.call(
690
+ target.decl, args, arg_kinds, arg_names, line, bitmap_args=bitmap_args
691
+ )
692
+ retval = builder.coerce(retval, base_sig.ret_type, line)
693
+ builder.add(Return(retval))
694
+
695
+ arg_regs, _, blocks, ret_type, _ = builder.leave()
696
+ if base_sig.num_bitmap_args:
697
+ rt_args = rt_args[: -base_sig.num_bitmap_args]
698
+ return FuncIR(
699
+ FuncDecl(
700
+ target.name + "__" + base.name + "_glue",
701
+ cls.name,
702
+ builder.module_name,
703
+ FuncSignature(rt_args, ret_type),
704
+ target.decl.kind,
705
+ ),
706
+ arg_regs,
707
+ blocks,
708
+ )
709
+
710
+
711
+ def check_native_override(
712
+ builder: IRBuilder, base_sig: FuncSignature, sub_sig: FuncSignature, line: int
713
+ ) -> None:
714
+ """Report an error if an override changes signature in unsupported ways.
715
+
716
+ Glue methods can work around many signature changes but not all of them.
717
+ """
718
+ for base_arg, sub_arg in zip(base_sig.real_args(), sub_sig.real_args()):
719
+ if base_arg.type.error_overlap:
720
+ if not base_arg.optional and sub_arg.optional and base_sig.num_bitmap_args:
721
+ # This would change the meanings of bits in the argument defaults
722
+ # bitmap, which we don't support. We'd need to do tricky bit
723
+ # manipulations to support this generally.
724
+ builder.error(
725
+ "An argument with type "
726
+ + f'"{base_arg.type}" cannot be given a default value in a method override',
727
+ line,
728
+ )
729
+ if base_arg.type.error_overlap or sub_arg.type.error_overlap:
730
+ if not is_same_type(base_arg.type, sub_arg.type):
731
+ # This would change from signaling a default via an error value to
732
+ # signaling a default via bitmap, which we don't support.
733
+ builder.error(
734
+ "Incompatible argument type "
735
+ + f'"{sub_arg.type}" (base class has type "{base_arg.type}")',
736
+ line,
737
+ )
738
+
739
+
740
+ def gen_glue_property(
741
+ builder: IRBuilder,
742
+ sig: FuncSignature,
743
+ target: FuncIR,
744
+ cls: ClassIR,
745
+ base: ClassIR,
746
+ line: int,
747
+ do_pygetattr: bool,
748
+ ) -> FuncIR:
749
+ """Generate glue methods for properties that mediate between different subclass types.
750
+
751
+ Similarly to methods, properties of derived types can be covariantly subtyped. Thus,
752
+ properties also require glue. However, this only requires the return type to change.
753
+ Further, instead of a method call, an attribute get is performed.
754
+
755
+ If do_pygetattr is True, then get the attribute using the Python C
756
+ API instead of a native call.
757
+ """
758
+ builder.enter()
759
+
760
+ rt_arg = RuntimeArg(SELF_NAME, RInstance(cls))
761
+ self_target = builder.add_self_to_env(cls)
762
+ arg = builder.read(self_target, line)
763
+ builder.ret_types[-1] = sig.ret_type
764
+ if do_pygetattr:
765
+ retval = builder.py_get_attr(arg, target.name, line)
766
+ else:
767
+ retval = builder.add(GetAttr(arg, target.name, line))
768
+ retbox = builder.coerce(retval, sig.ret_type, line)
769
+ builder.add(Return(retbox))
770
+
771
+ args, _, blocks, return_type, _ = builder.leave()
772
+ return FuncIR(
773
+ FuncDecl(
774
+ target.name + "__" + base.name + "_glue",
775
+ cls.name,
776
+ builder.module_name,
777
+ FuncSignature([rt_arg], return_type),
778
+ ),
779
+ args,
780
+ blocks,
781
+ )
782
+
783
+
784
+ def get_func_target(builder: IRBuilder, fdef: FuncDef) -> AssignmentTarget:
785
+ """Given a FuncDef, return the target for the instance of its callable class.
786
+
787
+ If the function was not already defined somewhere, then define it
788
+ and add it to the current environment.
789
+ """
790
+ if fdef.original_def:
791
+ # Get the target associated with the previously defined FuncDef.
792
+ return builder.lookup(fdef.original_def)
793
+
794
+ if builder.fn_info.is_generator or builder.fn_info.add_nested_funcs_to_env:
795
+ return builder.lookup(fdef)
796
+
797
+ return builder.add_local_reg(fdef, object_rprimitive)
798
+
799
+
800
+ def load_type(builder: IRBuilder, typ: TypeInfo, line: int) -> Value:
801
+ if typ in builder.mapper.type_to_ir:
802
+ class_ir = builder.mapper.type_to_ir[typ]
803
+ class_obj = builder.builder.get_native_type(class_ir)
804
+ elif typ.fullname in builtin_names:
805
+ builtin_addr_type, src = builtin_names[typ.fullname]
806
+ class_obj = builder.add(LoadAddress(builtin_addr_type, src, line))
807
+ else:
808
+ class_obj = builder.load_global_str(typ.name, line)
809
+
810
+ return class_obj
811
+
812
+
813
+ def load_func(builder: IRBuilder, func_name: str, fullname: str | None, line: int) -> Value:
814
+ if fullname and not fullname.startswith(builder.current_module):
815
+ # we're calling a function in a different module
816
+
817
+ # We can't use load_module_attr_by_fullname here because we need to load the function using
818
+ # func_name, not the name specified by fullname (which can be different for underscore
819
+ # function)
820
+ module = fullname.rsplit(".")[0]
821
+ loaded_module = builder.load_module(module)
822
+
823
+ func = builder.py_get_attr(loaded_module, func_name, line)
824
+ else:
825
+ func = builder.load_global_str(func_name, line)
826
+ return func
827
+
828
+
829
+ def generate_singledispatch_dispatch_function(
830
+ builder: IRBuilder, main_singledispatch_function_name: str, fitem: FuncDef
831
+ ) -> None:
832
+ line = fitem.line
833
+ current_func_decl = builder.mapper.func_to_decl[fitem]
834
+ arg_info = get_args(builder, current_func_decl.sig.args, line)
835
+
836
+ dispatch_func_obj = builder.self()
837
+
838
+ arg_type = builder.builder.get_type_of_obj(arg_info.args[0], line)
839
+ dispatch_cache = builder.builder.get_attr(
840
+ dispatch_func_obj, "dispatch_cache", dict_rprimitive, line
841
+ )
842
+ call_find_impl, use_cache, call_func = BasicBlock(), BasicBlock(), BasicBlock()
843
+ get_result = builder.call_c(dict_get_method_with_none, [dispatch_cache, arg_type], line)
844
+ is_not_none = builder.translate_is_op(get_result, builder.none_object(), "is not", line)
845
+ impl_to_use = Register(object_rprimitive)
846
+ builder.add_bool_branch(is_not_none, use_cache, call_find_impl)
847
+
848
+ builder.activate_block(use_cache)
849
+ builder.assign(impl_to_use, get_result, line)
850
+ builder.goto(call_func)
851
+
852
+ builder.activate_block(call_find_impl)
853
+ find_impl = builder.load_module_attr_by_fullname("functools._find_impl", line)
854
+ registry = load_singledispatch_registry(builder, dispatch_func_obj, line)
855
+ uncached_impl = builder.py_call(find_impl, [arg_type, registry], line)
856
+ builder.call_c(dict_set_item_op, [dispatch_cache, arg_type, uncached_impl], line)
857
+ builder.assign(impl_to_use, uncached_impl, line)
858
+ builder.goto(call_func)
859
+
860
+ builder.activate_block(call_func)
861
+ gen_calls_to_correct_impl(builder, impl_to_use, arg_info, fitem, line)
862
+
863
+
864
+ def gen_calls_to_correct_impl(
865
+ builder: IRBuilder, impl_to_use: Value, arg_info: ArgInfo, fitem: FuncDef, line: int
866
+ ) -> None:
867
+ current_func_decl = builder.mapper.func_to_decl[fitem]
868
+
869
+ def gen_native_func_call_and_return(fdef: FuncDef) -> None:
870
+ func_decl = builder.mapper.func_to_decl[fdef]
871
+ ret_val = builder.builder.call(
872
+ func_decl, arg_info.args, arg_info.arg_kinds, arg_info.arg_names, line
873
+ )
874
+ coerced = builder.coerce(ret_val, current_func_decl.sig.ret_type, line)
875
+ builder.add(Return(coerced))
876
+
877
+ typ, src = builtin_names["builtins.int"]
878
+ int_type_obj = builder.add(LoadAddress(typ, src, line))
879
+ is_int = builder.builder.type_is_op(impl_to_use, int_type_obj, line)
880
+
881
+ native_call, non_native_call = BasicBlock(), BasicBlock()
882
+ builder.add_bool_branch(is_int, native_call, non_native_call)
883
+ builder.activate_block(native_call)
884
+
885
+ passed_id = builder.add(Unbox(impl_to_use, int_rprimitive, line))
886
+
887
+ native_ids = get_native_impl_ids(builder, fitem)
888
+ for impl, i in native_ids.items():
889
+ call_impl, next_impl = BasicBlock(), BasicBlock()
890
+
891
+ current_id = builder.load_int(i)
892
+ builder.builder.compare_tagged_condition(
893
+ passed_id, current_id, "==", call_impl, next_impl, line
894
+ )
895
+
896
+ # Call the registered implementation
897
+ builder.activate_block(call_impl)
898
+
899
+ gen_native_func_call_and_return(impl)
900
+ builder.activate_block(next_impl)
901
+
902
+ # We've already handled all the possible integer IDs, so we should never get here
903
+ builder.add(Unreachable())
904
+
905
+ builder.activate_block(non_native_call)
906
+ ret_val = builder.py_call(
907
+ impl_to_use, arg_info.args, line, arg_info.arg_kinds, arg_info.arg_names
908
+ )
909
+ coerced = builder.coerce(ret_val, current_func_decl.sig.ret_type, line)
910
+ builder.add(Return(coerced))
911
+
912
+
913
+ def gen_dispatch_func_ir(
914
+ builder: IRBuilder, fitem: FuncDef, main_func_name: str, dispatch_name: str, sig: FuncSignature
915
+ ) -> tuple[FuncIR, Value]:
916
+ """Create a dispatch function (a function that checks the first argument type and dispatches
917
+ to the correct implementation)
918
+ """
919
+ builder.enter(FuncInfo(fitem, dispatch_name))
920
+ setup_callable_class(builder)
921
+ builder.fn_info.callable_class.ir.attributes["registry"] = dict_rprimitive
922
+ builder.fn_info.callable_class.ir.attributes["dispatch_cache"] = dict_rprimitive
923
+ builder.fn_info.callable_class.ir.has_dict = True
924
+ builder.fn_info.callable_class.ir.needs_getseters = True
925
+ generate_singledispatch_callable_class_ctor(builder)
926
+
927
+ generate_singledispatch_dispatch_function(builder, main_func_name, fitem)
928
+ args, _, blocks, _, fn_info = builder.leave()
929
+ dispatch_callable_class = add_call_to_callable_class(builder, args, blocks, sig, fn_info)
930
+ builder.functions.append(dispatch_callable_class)
931
+ add_get_to_callable_class(builder, fn_info)
932
+ add_register_method_to_callable_class(builder, fn_info)
933
+ func_reg = instantiate_callable_class(builder, fn_info)
934
+ dispatch_func_ir = generate_dispatch_glue_native_function(
935
+ builder, fitem, dispatch_callable_class.decl, dispatch_name
936
+ )
937
+
938
+ return dispatch_func_ir, func_reg
939
+
940
+
941
+ def generate_dispatch_glue_native_function(
942
+ builder: IRBuilder, fitem: FuncDef, callable_class_decl: FuncDecl, dispatch_name: str
943
+ ) -> FuncIR:
944
+ line = fitem.line
945
+ builder.enter()
946
+ # We store the callable class in the globals dict for this function
947
+ callable_class = builder.load_global_str(dispatch_name, line)
948
+ decl = builder.mapper.func_to_decl[fitem]
949
+ arg_info = get_args(builder, decl.sig.args, line)
950
+ args = [callable_class] + arg_info.args
951
+ arg_kinds = [ArgKind.ARG_POS] + arg_info.arg_kinds
952
+ arg_names = arg_info.arg_names
953
+ arg_names.insert(0, "self")
954
+ ret_val = builder.builder.call(callable_class_decl, args, arg_kinds, arg_names, line)
955
+ builder.add(Return(ret_val))
956
+ arg_regs, _, blocks, _, fn_info = builder.leave()
957
+ return FuncIR(decl, arg_regs, blocks)
958
+
959
+
960
+ def generate_singledispatch_callable_class_ctor(builder: IRBuilder) -> None:
961
+ """Create an __init__ that sets registry and dispatch_cache to empty dicts"""
962
+ line = -1
963
+ class_ir = builder.fn_info.callable_class.ir
964
+ with builder.enter_method(class_ir, "__init__", bool_rprimitive):
965
+ empty_dict = builder.call_c(dict_new_op, [], line)
966
+ builder.add(SetAttr(builder.self(), "registry", empty_dict, line))
967
+ cache_dict = builder.call_c(dict_new_op, [], line)
968
+ dispatch_cache_str = builder.load_str("dispatch_cache")
969
+ # use the py_setattr_op instead of SetAttr so that it also gets added to our __dict__
970
+ builder.call_c(py_setattr_op, [builder.self(), dispatch_cache_str, cache_dict], line)
971
+ # the generated C code seems to expect that __init__ returns a char, so just return 1
972
+ builder.add(Return(Integer(1, bool_rprimitive, line), line))
973
+
974
+
975
+ def add_register_method_to_callable_class(builder: IRBuilder, fn_info: FuncInfo) -> None:
976
+ line = -1
977
+ with builder.enter_method(fn_info.callable_class.ir, "register", object_rprimitive):
978
+ cls_arg = builder.add_argument("cls", object_rprimitive)
979
+ func_arg = builder.add_argument("func", object_rprimitive, ArgKind.ARG_OPT)
980
+ ret_val = builder.call_c(register_function, [builder.self(), cls_arg, func_arg], line)
981
+ builder.add(Return(ret_val, line))
982
+
983
+
984
+ def load_singledispatch_registry(builder: IRBuilder, dispatch_func_obj: Value, line: int) -> Value:
985
+ return builder.builder.get_attr(dispatch_func_obj, "registry", dict_rprimitive, line)
986
+
987
+
988
+ def singledispatch_main_func_name(orig_name: str) -> str:
989
+ return f"__mypyc_singledispatch_main_function_{orig_name}__"
990
+
991
+
992
+ def get_registry_identifier(fitem: FuncDef) -> str:
993
+ return f"__mypyc_singledispatch_registry_{fitem.fullname}__"
994
+
995
+
996
+ def maybe_insert_into_registry_dict(builder: IRBuilder, fitem: FuncDef) -> None:
997
+ line = fitem.line
998
+ is_singledispatch_main_func = fitem in builder.singledispatch_impls
999
+ # dict of singledispatch_func to list of register_types (fitem is the function to register)
1000
+ to_register: defaultdict[FuncDef, list[TypeInfo]] = defaultdict(list)
1001
+ for main_func, impls in builder.singledispatch_impls.items():
1002
+ for dispatch_type, impl in impls:
1003
+ if fitem == impl:
1004
+ to_register[main_func].append(dispatch_type)
1005
+
1006
+ if not to_register and not is_singledispatch_main_func:
1007
+ return
1008
+
1009
+ if is_singledispatch_main_func:
1010
+ main_func_name = singledispatch_main_func_name(fitem.name)
1011
+ main_func_obj = load_func(builder, main_func_name, fitem.fullname, line)
1012
+
1013
+ loaded_object_type = builder.load_module_attr_by_fullname("builtins.object", line)
1014
+ registry_dict = builder.builder.make_dict([(loaded_object_type, main_func_obj)], line)
1015
+
1016
+ dispatch_func_obj = builder.load_global_str(fitem.name, line)
1017
+ builder.call_c(
1018
+ py_setattr_op, [dispatch_func_obj, builder.load_str("registry"), registry_dict], line
1019
+ )
1020
+
1021
+ for singledispatch_func, types in to_register.items():
1022
+ # TODO: avoid recomputing the native IDs for all the functions every time we find a new
1023
+ # function
1024
+ native_ids = get_native_impl_ids(builder, singledispatch_func)
1025
+ if fitem not in native_ids:
1026
+ to_insert = load_func(builder, fitem.name, fitem.fullname, line)
1027
+ else:
1028
+ current_id = native_ids[fitem]
1029
+ load_literal = LoadLiteral(current_id, object_rprimitive)
1030
+ to_insert = builder.add(load_literal)
1031
+ # TODO: avoid reloading the registry here if we just created it
1032
+ dispatch_func_obj = load_func(
1033
+ builder, singledispatch_func.name, singledispatch_func.fullname, line
1034
+ )
1035
+ registry = load_singledispatch_registry(builder, dispatch_func_obj, line)
1036
+ for typ in types:
1037
+ loaded_type = load_type(builder, typ, line)
1038
+ builder.call_c(dict_set_item_op, [registry, loaded_type, to_insert], line)
1039
+ dispatch_cache = builder.builder.get_attr(
1040
+ dispatch_func_obj, "dispatch_cache", dict_rprimitive, line
1041
+ )
1042
+ builder.gen_method_call(dispatch_cache, "clear", [], None, line)
1043
+
1044
+
1045
+ def get_native_impl_ids(builder: IRBuilder, singledispatch_func: FuncDef) -> dict[FuncDef, int]:
1046
+ """Return a dict of registered implementation to native implementation ID for all
1047
+ implementations
1048
+ """
1049
+ impls = builder.singledispatch_impls[singledispatch_func]
1050
+ return {impl: i for i, (typ, impl) in enumerate(impls) if not is_decorated(builder, impl)}
1051
+
1052
+
1053
+ def gen_property_getter_ir(
1054
+ builder: IRBuilder, func_decl: FuncDecl, cdef: ClassDef, is_trait: bool
1055
+ ) -> FuncIR:
1056
+ """Generate an implicit trivial property getter for an attribute.
1057
+
1058
+ These are used if an attribute can also be accessed as a property.
1059
+ """
1060
+ name = func_decl.name
1061
+ builder.enter(name)
1062
+ self_reg = builder.add_argument("self", func_decl.sig.args[0].type)
1063
+ if not is_trait:
1064
+ value = builder.builder.get_attr(self_reg, name, func_decl.sig.ret_type, -1)
1065
+ builder.add(Return(value))
1066
+ else:
1067
+ builder.add(Unreachable())
1068
+ args, _, blocks, ret_type, fn_info = builder.leave()
1069
+ return FuncIR(func_decl, args, blocks)
1070
+
1071
+
1072
+ def gen_property_setter_ir(
1073
+ builder: IRBuilder, func_decl: FuncDecl, cdef: ClassDef, is_trait: bool
1074
+ ) -> FuncIR:
1075
+ """Generate an implicit trivial property setter for an attribute.
1076
+
1077
+ These are used if an attribute can also be accessed as a property.
1078
+ """
1079
+ name = func_decl.name
1080
+ builder.enter(name)
1081
+ self_reg = builder.add_argument("self", func_decl.sig.args[0].type)
1082
+ value_reg = builder.add_argument("value", func_decl.sig.args[1].type)
1083
+ assert name.startswith(PROPSET_PREFIX)
1084
+ attr_name = name[len(PROPSET_PREFIX) :]
1085
+ if not is_trait:
1086
+ builder.add(SetAttr(self_reg, attr_name, value_reg, -1))
1087
+ builder.add(Return(builder.none()))
1088
+ args, _, blocks, ret_type, fn_info = builder.leave()
1089
+ return FuncIR(func_decl, args, blocks)