tpy-lang 0.3.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 (333) hide show
  1. tpy_lang-0.3.0.dev0.dist-info/METADATA +151 -0
  2. tpy_lang-0.3.0.dev0.dist-info/RECORD +333 -0
  3. tpy_lang-0.3.0.dev0.dist-info/WHEEL +4 -0
  4. tpy_lang-0.3.0.dev0.dist-info/entry_points.txt +3 -0
  5. tpyc/__init__.py +104 -0
  6. tpyc/__main__.py +6 -0
  7. tpyc/_buildinfo.py +1 -0
  8. tpyc/_data/docs/LANGUAGE_FEATURES.md +6278 -0
  9. tpyc/_data/docs/STDLIB_ROADMAP.md +1258 -0
  10. tpyc/_data/docs/TPY_FOR_AGENTS.md +556 -0
  11. tpyc/_data/lib/tpy/_bindings/__init__.py +6 -0
  12. tpyc/_data/lib/tpy/_bindings/pcre2.py +173 -0
  13. tpyc/_data/lib/tpy/_bindings/posix_socket.py +161 -0
  14. tpyc/_data/lib/tpy/_functools_macros.py +80 -0
  15. tpyc/_data/lib/tpy/_macro_helpers.py +161 -0
  16. tpyc/_data/lib/tpy/argparse.py +2062 -0
  17. tpyc/_data/lib/tpy/asyncio/__init__.py +744 -0
  18. tpyc/_data/lib/tpy/asyncio/_executor.py +515 -0
  19. tpyc/_data/lib/tpy/base64.py +410 -0
  20. tpyc/_data/lib/tpy/bisect.py +39 -0
  21. tpyc/_data/lib/tpy/builtins.py +38 -0
  22. tpyc/_data/lib/tpy/dataclasses.py +354 -0
  23. tpyc/_data/lib/tpy/enum.py +23 -0
  24. tpyc/_data/lib/tpy/functools.py +33 -0
  25. tpyc/_data/lib/tpy/hashlib.py +206 -0
  26. tpyc/_data/lib/tpy/heapq.py +118 -0
  27. tpyc/_data/lib/tpy/io.py +395 -0
  28. tpyc/_data/lib/tpy/json.py +221 -0
  29. tpyc/_data/lib/tpy/math.py +406 -0
  30. tpyc/_data/lib/tpy/random.py +597 -0
  31. tpyc/_data/lib/tpy/re.py +467 -0
  32. tpyc/_data/lib/tpy/socket.py +379 -0
  33. tpyc/_data/lib/tpy/struct.py +178 -0
  34. tpyc/_data/lib/tpy/sys.py +40 -0
  35. tpyc/_data/lib/tpy/time.py +39 -0
  36. tpyc/_data/lib/tpy/tpy/__init__.py +78 -0
  37. tpyc/_data/lib/tpy/tpy/_bootstrap/__init__.py +10 -0
  38. tpyc/_data/lib/tpy/tpy/_bootstrap/_decorators.py +37 -0
  39. tpyc/_data/lib/tpy/tpy/_bootstrap/_extern.py +64 -0
  40. tpyc/_data/lib/tpy/tpy/_builtins/__init__.py +11 -0
  41. tpyc/_data/lib/tpy/tpy/_builtins/_bytes.py +378 -0
  42. tpyc/_data/lib/tpy/tpy/_builtins/_dict.py +151 -0
  43. tpyc/_data/lib/tpy/tpy/_builtins/_exceptions.py +125 -0
  44. tpyc/_data/lib/tpy/tpy/_builtins/_funcs.py +681 -0
  45. tpyc/_data/lib/tpy/tpy/_builtins/_io.py +97 -0
  46. tpyc/_data/lib/tpy/tpy/_builtins/_list.py +127 -0
  47. tpyc/_data/lib/tpy/tpy/_builtins/_range.py +52 -0
  48. tpyc/_data/lib/tpy/tpy/_builtins/_set.py +139 -0
  49. tpyc/_data/lib/tpy/tpy/_builtins/_super.py +11 -0
  50. tpyc/_data/lib/tpy/tpy/_builtins/_types.py +661 -0
  51. tpyc/_data/lib/tpy/tpy/_core/__init__.py +23 -0
  52. tpyc/_data/lib/tpy/tpy/_core/_bytes_view.py +129 -0
  53. tpyc/_data/lib/tpy/tpy/_core/_containers.py +137 -0
  54. tpyc/_data/lib/tpy/tpy/_core/_functions.py +40 -0
  55. tpyc/_data/lib/tpy/tpy/_core/_types.py +2061 -0
  56. tpyc/_data/lib/tpy/tpy/_typing/__init__.py +77 -0
  57. tpyc/_data/lib/tpy/tpy/_version.py +29 -0
  58. tpyc/_data/lib/tpy/tpy/bits.py +28 -0
  59. tpyc/_data/lib/tpy/tpy/coro/__init__.py +127 -0
  60. tpyc/_data/lib/tpy/tpy/extern.py +8 -0
  61. tpyc/_data/lib/tpy/tpy/mem.py +49 -0
  62. tpyc/_data/lib/tpy/tpy/unsafe.py +195 -0
  63. tpyc/_data/lib/tpy/tpy/version.py +21 -0
  64. tpyc/_data/lib/tpy/typing.py +13 -0
  65. tpyc/_data/runtime/cpp/include/tpy/any.hpp +461 -0
  66. tpyc/_data/runtime/cpp/include/tpy/as_ostream.hpp +117 -0
  67. tpyc/_data/runtime/cpp/include/tpy/async.hpp +76 -0
  68. tpyc/_data/runtime/cpp/include/tpy/bigint.hpp +1343 -0
  69. tpyc/_data/runtime/cpp/include/tpy/builtins.hpp +400 -0
  70. tpyc/_data/runtime/cpp/include/tpy/bytes_ops.hpp +469 -0
  71. tpyc/_data/runtime/cpp/include/tpy/container_ops.hpp +487 -0
  72. tpyc/_data/runtime/cpp/include/tpy/copy_iter.hpp +82 -0
  73. tpyc/_data/runtime/cpp/include/tpy/core.hpp +558 -0
  74. tpyc/_data/runtime/cpp/include/tpy/dict_ops.hpp +289 -0
  75. tpyc/_data/runtime/cpp/include/tpy/dunder.hpp +750 -0
  76. tpyc/_data/runtime/cpp/include/tpy/dynamic.hpp +44 -0
  77. tpyc/_data/runtime/cpp/include/tpy/enum.hpp +40 -0
  78. tpyc/_data/runtime/cpp/include/tpy/file.hpp +245 -0
  79. tpyc/_data/runtime/cpp/include/tpy/fixed_int.hpp +317 -0
  80. tpyc/_data/runtime/cpp/include/tpy/format.hpp +954 -0
  81. tpyc/_data/runtime/cpp/include/tpy/frame_slot.hpp +120 -0
  82. tpyc/_data/runtime/cpp/include/tpy/generator.hpp +47 -0
  83. tpyc/_data/runtime/cpp/include/tpy/iterable_ops.hpp +122 -0
  84. tpyc/_data/runtime/cpp/include/tpy/itertools.hpp +749 -0
  85. tpyc/_data/runtime/cpp/include/tpy/next_iter.hpp +82 -0
  86. tpyc/_data/runtime/cpp/include/tpy/ordered_map.hpp +518 -0
  87. tpyc/_data/runtime/cpp/include/tpy/ordered_set.hpp +337 -0
  88. tpyc/_data/runtime/cpp/include/tpy/own_iter.hpp +54 -0
  89. tpyc/_data/runtime/cpp/include/tpy/pascal_graph_sdl.hpp +192 -0
  90. tpyc/_data/runtime/cpp/include/tpy/printing.hpp +302 -0
  91. tpyc/_data/runtime/cpp/include/tpy/protocols.hpp +61 -0
  92. tpyc/_data/runtime/cpp/include/tpy/range.hpp +115 -0
  93. tpyc/_data/runtime/cpp/include/tpy/ranges.hpp +212 -0
  94. tpyc/_data/runtime/cpp/include/tpy/set_ops.hpp +265 -0
  95. tpyc/_data/runtime/cpp/include/tpy/slice.hpp +47 -0
  96. tpyc/_data/runtime/cpp/include/tpy/span_iter.hpp +42 -0
  97. tpyc/_data/runtime/cpp/include/tpy/stdlib/math.hpp +41 -0
  98. tpyc/_data/runtime/cpp/include/tpy/stdlib/pcre2_h.hpp +96 -0
  99. tpyc/_data/runtime/cpp/include/tpy/stdlib/random.hpp +25 -0
  100. tpyc/_data/runtime/cpp/include/tpy/stdlib/socket_h.hpp +145 -0
  101. tpyc/_data/runtime/cpp/include/tpy/stdlib/time.hpp +62 -0
  102. tpyc/_data/runtime/cpp/include/tpy/system.hpp +121 -0
  103. tpyc/_data/runtime/cpp/include/tpy/throwable.hpp +55 -0
  104. tpyc/_data/runtime/cpp/include/tpy/tpy.hpp +156 -0
  105. tpyc/_data/runtime/cpp/include/tpy/type_name.hpp +77 -0
  106. tpyc/_data/runtime/cpp/include/tpy/type_traits.hpp +240 -0
  107. tpyc/_data/runtime/cpp/include/tpy/uninit_array_storage.hpp +250 -0
  108. tpyc/_data/runtime/cpp/include/tpy/uninit_heap_storage.hpp +277 -0
  109. tpyc/_data/runtime/cpp/include/tpy/varargs.hpp +174 -0
  110. tpyc/_data/runtime/cpp/include/tpy/variant_ref.hpp +118 -0
  111. tpyc/_data/runtime/cpp/src/stdlib/socket_impl.cpp +104 -0
  112. tpyc/_data/runtime/cpp/third_party/README.md +58 -0
  113. tpyc/_data/runtime/cpp/third_party/pcre2/AUTHORS +36 -0
  114. tpyc/_data/runtime/cpp/third_party/pcre2/CMakeLists.txt +1233 -0
  115. tpyc/_data/runtime/cpp/third_party/pcre2/COPYING +5 -0
  116. tpyc/_data/runtime/cpp/third_party/pcre2/ChangeLog +3097 -0
  117. tpyc/_data/runtime/cpp/third_party/pcre2/HACKING +853 -0
  118. tpyc/_data/runtime/cpp/third_party/pcre2/INSTALL +368 -0
  119. tpyc/_data/runtime/cpp/third_party/pcre2/LICENCE +94 -0
  120. tpyc/_data/runtime/cpp/third_party/pcre2/NEWS +492 -0
  121. tpyc/_data/runtime/cpp/third_party/pcre2/NON-AUTOTOOLS-BUILD +430 -0
  122. tpyc/_data/runtime/cpp/third_party/pcre2/README +956 -0
  123. tpyc/_data/runtime/cpp/third_party/pcre2/cmake/COPYING-CMAKE-SCRIPTS +22 -0
  124. tpyc/_data/runtime/cpp/third_party/pcre2/cmake/FindEditline.cmake +16 -0
  125. tpyc/_data/runtime/cpp/third_party/pcre2/cmake/FindPackageHandleStandardArgs.cmake +58 -0
  126. tpyc/_data/runtime/cpp/third_party/pcre2/cmake/FindReadline.cmake +29 -0
  127. tpyc/_data/runtime/cpp/third_party/pcre2/cmake/pcre2-config-version.cmake.in +15 -0
  128. tpyc/_data/runtime/cpp/third_party/pcre2/cmake/pcre2-config.cmake.in +148 -0
  129. tpyc/_data/runtime/cpp/third_party/pcre2/config-cmake.h.in +56 -0
  130. tpyc/_data/runtime/cpp/third_party/pcre2/libpcre2-16.pc.in +13 -0
  131. tpyc/_data/runtime/cpp/third_party/pcre2/libpcre2-32.pc.in +13 -0
  132. tpyc/_data/runtime/cpp/third_party/pcre2/libpcre2-8.pc.in +13 -0
  133. tpyc/_data/runtime/cpp/third_party/pcre2/libpcre2-posix.pc.in +13 -0
  134. tpyc/_data/runtime/cpp/third_party/pcre2/pcre2-config.in +121 -0
  135. tpyc/_data/runtime/cpp/third_party/pcre2/src/config.h +483 -0
  136. tpyc/_data/runtime/cpp/third_party/pcre2/src/config.h.generic +483 -0
  137. tpyc/_data/runtime/cpp/third_party/pcre2/src/config.h.in +460 -0
  138. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2.h +1010 -0
  139. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2.h.generic +1010 -0
  140. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2.h.in +1010 -0
  141. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_auto_possess.c +1371 -0
  142. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_chartables.c +196 -0
  143. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_chartables.c.dist +196 -0
  144. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_chkdint.c +96 -0
  145. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_compile.c +11001 -0
  146. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_config.c +252 -0
  147. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_context.c +510 -0
  148. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_convert.c +1189 -0
  149. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_dfa_match.c +4119 -0
  150. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_dftables.c +297 -0
  151. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_error.c +345 -0
  152. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_extuni.c +162 -0
  153. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_find_bracket.c +219 -0
  154. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_fuzzsupport.c +792 -0
  155. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_internal.h +2084 -0
  156. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_intmodedep.h +940 -0
  157. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_jit_compile.c +14972 -0
  158. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_jit_match.c +200 -0
  159. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_jit_misc.c +234 -0
  160. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_jit_neon_inc.h +354 -0
  161. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_jit_simd_inc.h +2355 -0
  162. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_jit_test.c +2528 -0
  163. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_maketables.c +165 -0
  164. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_match.c +7777 -0
  165. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_match_data.c +185 -0
  166. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_newline.c +243 -0
  167. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_ord2utf.c +120 -0
  168. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_pattern_info.c +432 -0
  169. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_printint.c +886 -0
  170. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_script_run.c +344 -0
  171. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_serialize.c +286 -0
  172. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_string_utils.c +237 -0
  173. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_study.c +1915 -0
  174. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_substitute.c +1009 -0
  175. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_substring.c +550 -0
  176. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_tables.c +234 -0
  177. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_ucd.c +5460 -0
  178. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_ucp.h +396 -0
  179. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_ucptables.c +1533 -0
  180. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_valid_utf.c +398 -0
  181. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_xclass.c +308 -0
  182. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2demo.c +497 -0
  183. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2grep.c +4606 -0
  184. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2posix.c +425 -0
  185. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2posix.h +187 -0
  186. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2posix_test.c +209 -0
  187. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2test.c +9708 -0
  188. tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/allocator_src/sljitExecAllocatorApple.c +137 -0
  189. tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/allocator_src/sljitExecAllocatorCore.c +327 -0
  190. tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/allocator_src/sljitExecAllocatorFreeBSD.c +89 -0
  191. tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/allocator_src/sljitExecAllocatorPosix.c +62 -0
  192. tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/allocator_src/sljitExecAllocatorWindows.c +40 -0
  193. tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/allocator_src/sljitProtExecAllocatorNetBSD.c +72 -0
  194. tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/allocator_src/sljitProtExecAllocatorPosix.c +172 -0
  195. tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/allocator_src/sljitWXExecAllocatorPosix.c +141 -0
  196. tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/allocator_src/sljitWXExecAllocatorWindows.c +102 -0
  197. tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitConfig.h +142 -0
  198. tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitConfigCPU.h +188 -0
  199. tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitConfigInternal.h +907 -0
  200. tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitLir.c +3561 -0
  201. tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitLir.h +2466 -0
  202. tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitNativeARM_32.c +4636 -0
  203. tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitNativeARM_64.c +3491 -0
  204. tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitNativeARM_T2_32.c +4302 -0
  205. tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitNativeLOONGARCH_64.c +3765 -0
  206. tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitNativeMIPS_32.c +472 -0
  207. tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitNativeMIPS_64.c +387 -0
  208. tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitNativeMIPS_common.c +4259 -0
  209. tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitNativePPC_32.c +485 -0
  210. tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitNativePPC_64.c +719 -0
  211. tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitNativePPC_common.c +3161 -0
  212. tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitNativeRISCV_32.c +142 -0
  213. tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitNativeRISCV_64.c +222 -0
  214. tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitNativeRISCV_common.c +3121 -0
  215. tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitNativeS390X.c +4526 -0
  216. tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitNativeX86_32.c +1685 -0
  217. tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitNativeX86_64.c +1398 -0
  218. tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitNativeX86_common.c +5001 -0
  219. tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitSerialize.c +516 -0
  220. tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitUtils.c +344 -0
  221. tpyc/_data/runtime/cpp/third_party/pcre2.sources.txt +54 -0
  222. tpyc/_data/runtime/cpp/third_party/pcre2.vendor.json +7 -0
  223. tpyc/build/__init__.py +7 -0
  224. tpyc/build/pcre2.py +122 -0
  225. tpyc/build/third_party.py +413 -0
  226. tpyc/cli.py +822 -0
  227. tpyc/codegen_cpp/__init__.py +18 -0
  228. tpyc/codegen_cpp/builtins.py +484 -0
  229. tpyc/codegen_cpp/context.py +2064 -0
  230. tpyc/codegen_cpp/expressions.py +5940 -0
  231. tpyc/codegen_cpp/functions.py +1913 -0
  232. tpyc/codegen_cpp/gen_async.py +3258 -0
  233. tpyc/codegen_cpp/gen_generators.py +657 -0
  234. tpyc/codegen_cpp/generator.py +2258 -0
  235. tpyc/codegen_cpp/match.py +1997 -0
  236. tpyc/codegen_cpp/param_const.py +172 -0
  237. tpyc/codegen_cpp/protocols.py +907 -0
  238. tpyc/codegen_cpp/records.py +1654 -0
  239. tpyc/codegen_cpp/resumable_cfg.py +1651 -0
  240. tpyc/codegen_cpp/statements.py +4963 -0
  241. tpyc/codegen_cpp/string_dispatch.py +76 -0
  242. tpyc/codegen_cpp/test_context.py +46 -0
  243. tpyc/codegen_cpp/test_param_const.py +113 -0
  244. tpyc/codegen_cpp/test_resumable_cfg.py +182 -0
  245. tpyc/codegen_cpp/type_resolution.py +53 -0
  246. tpyc/codegen_cpp/types.py +436 -0
  247. tpyc/codegen_cpp/variant_access.py +135 -0
  248. tpyc/coercions.py +749 -0
  249. tpyc/compilation_context.py +57 -0
  250. tpyc/compiler.py +3945 -0
  251. tpyc/cycle_detection.py +358 -0
  252. tpyc/diagnostics.py +135 -0
  253. tpyc/dump_types.py +353 -0
  254. tpyc/frontend_diagnostics.py +47 -0
  255. tpyc/frontend_ir/__init__.py +140 -0
  256. tpyc/frontend_ir/lower.py +1098 -0
  257. tpyc/frontend_ir/nodes.py +718 -0
  258. tpyc/frontend_ir/resolver_adapter.py +151 -0
  259. tpyc/frontend_plugin.py +209 -0
  260. tpyc/install_docs.py +81 -0
  261. tpyc/liveness.py +756 -0
  262. tpyc/macro_api.py +1724 -0
  263. tpyc/macro_loader.py +497 -0
  264. tpyc/module_names.py +64 -0
  265. tpyc/modules/__init__.py +31 -0
  266. tpyc/modules/defs.py +89 -0
  267. tpyc/modules/registry.py +36 -0
  268. tpyc/modules/resolver.py +192 -0
  269. tpyc/modules/type_resolution.py +629 -0
  270. tpyc/namespace.py +172 -0
  271. tpyc/parse/__init__.py +84 -0
  272. tpyc/parse/imports.py +490 -0
  273. tpyc/parse/nodes.py +1732 -0
  274. tpyc/parse/parser.py +4043 -0
  275. tpyc/parse/resolve_refs.py +466 -0
  276. tpyc/parse/type_resolver.py +1060 -0
  277. tpyc/prescan.py +254 -0
  278. tpyc/qnames.py +149 -0
  279. tpyc/repl.py +529 -0
  280. tpyc/repl_backends.py +848 -0
  281. tpyc/sema/__init__.py +21 -0
  282. tpyc/sema/analyzer.py +3625 -0
  283. tpyc/sema/bound_check.py +72 -0
  284. tpyc/sema/builder_trace.py +684 -0
  285. tpyc/sema/calls.py +5406 -0
  286. tpyc/sema/compatibility.py +2107 -0
  287. tpyc/sema/context.py +1243 -0
  288. tpyc/sema/expressions.py +3737 -0
  289. tpyc/sema/flow_facts.py +199 -0
  290. tpyc/sema/init_tracker.py +150 -0
  291. tpyc/sema/list_literals.py +69 -0
  292. tpyc/sema/literal_utils.py +27 -0
  293. tpyc/sema/local_deduction.py +1088 -0
  294. tpyc/sema/macros.py +179 -0
  295. tpyc/sema/match.py +1177 -0
  296. tpyc/sema/method_expansion.py +347 -0
  297. tpyc/sema/methods.py +2197 -0
  298. tpyc/sema/mutation_propagation.py +268 -0
  299. tpyc/sema/narrowing.py +857 -0
  300. tpyc/sema/numeric_lattice.py +160 -0
  301. tpyc/sema/operators.py +402 -0
  302. tpyc/sema/overloads.py +841 -0
  303. tpyc/sema/protocols.py +1209 -0
  304. tpyc/sema/reach_analysis.py +202 -0
  305. tpyc/sema/registration.py +3156 -0
  306. tpyc/sema/scope_tracker.py +193 -0
  307. tpyc/sema/statements.py +4426 -0
  308. tpyc/sema/type_ops.py +1879 -0
  309. tpyc/sema/value_range.py +181 -0
  310. tpyc/symbol_binding.py +259 -0
  311. tpyc/test_c3_mro.py +208 -0
  312. tpyc/test_cli_argv.py +52 -0
  313. tpyc/test_compiler.py +559 -0
  314. tpyc/test_contains_type_param.py +101 -0
  315. tpyc/test_cycle_detection.py +221 -0
  316. tpyc/test_dump_types.py +225 -0
  317. tpyc/test_install_docs.py +65 -0
  318. tpyc/test_local_cpp_form.py +135 -0
  319. tpyc/test_macro_loader.py +76 -0
  320. tpyc/test_method_expansion.py +254 -0
  321. tpyc/test_nominal_identity.py +182 -0
  322. tpyc/test_overloads.py +410 -0
  323. tpyc/test_parse.py +303 -0
  324. tpyc/test_parse_type_ref.py +506 -0
  325. tpyc/test_parse_version_info.py +58 -0
  326. tpyc/test_reach_analysis.py +72 -0
  327. tpyc/test_ref_type.py +216 -0
  328. tpyc/test_send_sync_substitution.py +276 -0
  329. tpyc/test_tuple_mutation_propagation.py +206 -0
  330. tpyc/test_type_def_registry.py +1729 -0
  331. tpyc/test_union_types.py +195 -0
  332. tpyc/type_def_registry.py +975 -0
  333. tpyc/typesys.py +5104 -0
tpyc/prescan.py ADDED
@@ -0,0 +1,254 @@
1
+ """Pre-scan utilities for TurboPython function bodies.
2
+
3
+ Pure AST walking -- no type registry or analysis context needed.
4
+ Run once in sema; results consumed by both sema and codegen.
5
+ """
6
+
7
+ from __future__ import annotations
8
+
9
+ from dataclasses import dataclass, field, fields as dc_fields
10
+
11
+ from .parse import (
12
+ TpyStmt, TpyExpr, TpyVarDecl, TpyTupleUnpack, TpyAssign, TpyAugAssign,
13
+ TpyForEach, TpyWith, TpyName, TpySubscript,
14
+ TpyCall, TpyBinOp, TpyChainedCompare, TpyUnaryOp, TpyMethodCall,
15
+ TpyIntLiteral, TpyFloatLiteral, TpyStrLiteral,
16
+ TpyBoolLiteral, TpyNoneLiteral, TpyArrayLiteral, TpyListRepeat,
17
+ TpyCoerce, TpyFieldAccess, TpyIfExpr, TpyNamedExpr,
18
+ TpyNestedDef,
19
+ TpyFStringValue, TpyComprehensionGenerator,
20
+ TpyDictLiteral, TpySetLiteral, TpyTupleLiteral, TpyFString,
21
+ )
22
+
23
+
24
+ @dataclass
25
+ class ScanResult:
26
+ """Result of pre-scanning a function body for reassigned variables."""
27
+ reassigned: set[str] = field(default_factory=set)
28
+ rvalue_reassigned: set[str] = field(default_factory=set)
29
+ lvalue_reassigned: set[str] = field(default_factory=set)
30
+ aug_assigned: set[str] = field(default_factory=set)
31
+ # alias_name -> source_name for lvalue-initialized, non-reassigned variables
32
+ # with simple TpyName init (T& reference candidates).
33
+ alias_sources: dict[str, str] = field(default_factory=dict)
34
+ # Variables initially aliased from another name (before reassignment cleanup).
35
+ # Used by del codegen to avoid destroying through a pointer that may
36
+ # still point at the source variable's storage.
37
+ initial_alias_names: set[str] = field(default_factory=set)
38
+
39
+
40
+ def scan_reassigned_vars(stmts: list[TpyStmt],
41
+ pre_declared: set[str] | None = None) -> ScanResult:
42
+ """Pre-scan a function body to find variables that are reassigned after first declaration.
43
+
44
+ Args:
45
+ stmts: The statements to scan.
46
+ pre_declared: Names already in scope (e.g. function parameters).
47
+ Assignment to these names counts as reassignment.
48
+
49
+ Returns a ScanResult with:
50
+ - reassigned: variables with a second TpyVarDecl or TpyAssign after first declaration
51
+ - rvalue_reassigned: subset of reassigned with at least one rvalue reassignment
52
+ - lvalue_reassigned: subset of reassigned with at least one lvalue reassignment
53
+ - aug_assigned: variables targeted by augmented assignment (+=, -=, etc.)
54
+ """
55
+ declared: set[str] = set(pre_declared) if pre_declared else set()
56
+ result = ScanResult()
57
+ _scan_stmts(stmts, declared, result)
58
+ result.initial_alias_names = set(result.alias_sources.keys())
59
+ # Reassigned vars become T* pointers, not T& refs -- remove from alias map
60
+ for name in result.reassigned:
61
+ result.alias_sources.pop(name, None)
62
+ return result
63
+
64
+
65
+ def _expr_to_narrowing_key(expr: TpyExpr) -> str | None:
66
+ """Convert an expression to a narrowing key string.
67
+
68
+ Returns a simple name for TpyName, or a dotted path for multi-level
69
+ TpyFieldAccess (e.g. "obj.field", "obj.inner.field").
70
+ Returns None for unsupported expressions.
71
+ """
72
+ if isinstance(expr, TpyName):
73
+ return expr.name
74
+ if isinstance(expr, TpyNamedExpr):
75
+ return expr.target
76
+ if isinstance(expr, TpyFieldAccess):
77
+ obj_key = _expr_to_narrowing_key(expr.obj)
78
+ if obj_key is not None:
79
+ return f"{obj_key}.{expr.field}"
80
+ return None
81
+
82
+
83
+ # A deref-view narrowing rides `narrowed_types` under a distinct key: it
84
+ # narrows the polymorphic payload reached through an owning wrapper's
85
+ # reference-returning __deref__ (`if isinstance(rc, Dog): rc.bark()` resolves
86
+ # `bark` against Dog through the deref, while `rc.clone()` stays an Rc method).
87
+ # Keying it apart from the wrapper variable's own narrowing key leaves the
88
+ # wrapper type untouched and lets the existing save/restore/merge-at-joins
89
+ # machinery for narrowed_types apply unchanged -- exactly like field-path
90
+ # narrowing keys. The NUL suffix cannot collide with any source-level dotted
91
+ # path produced by _expr_to_narrowing_key.
92
+ #
93
+ # INVARIANT: a deref-view key is NOT a `name.`-dotted field path, so the
94
+ # field-path prefix sweeps (NarrowingTracker._invalidate_field_facts and
95
+ # friends) do NOT cover it. Any code that invalidates narrowed_types on a
96
+ # write/mutation of `name` must also drop deref_view_key(name) explicitly (see
97
+ # update_after_write); a prefix-scan alone silently leaves the deref-view fact
98
+ # stale -- the bug class that null-derefs a reassigned wrapper.
99
+ _DEREF_VIEW_SUFFIX = "\x00deref"
100
+
101
+
102
+ def deref_view_key(narrowing_key: str) -> str:
103
+ """Map a receiver narrowing key to its deref-view narrowing key."""
104
+ return narrowing_key + _DEREF_VIEW_SUFFIX
105
+
106
+
107
+ def parse_deref_view_key(key: str) -> 'str | None':
108
+ """If `key` is a deref-view narrowing key, return the receiver key it wraps;
109
+ otherwise None."""
110
+ if key.endswith(_DEREF_VIEW_SUFFIX):
111
+ return key[:-len(_DEREF_VIEW_SUFFIX)]
112
+ return None
113
+
114
+
115
+ def match_is_none(expr: TpyExpr) -> tuple[str, bool] | None:
116
+ """Match `v is None`, `v is not None`, `None is v`, `None is not v`.
117
+
118
+ Also matches dotted field access at any depth: `obj.field is None`,
119
+ `obj.a.b is None`, etc.
120
+ Returns (key, is_not_none) or None if the pattern doesn't match.
121
+ The key is a simple name or a dotted path ("obj.field", "obj.a.b").
122
+ """
123
+ if not isinstance(expr, TpyBinOp) or expr.op not in ("is", "is not"):
124
+ return None
125
+ key: str | None = None
126
+ if isinstance(expr.right, TpyNoneLiteral):
127
+ key = _expr_to_narrowing_key(expr.left)
128
+ elif isinstance(expr.left, TpyNoneLiteral):
129
+ key = _expr_to_narrowing_key(expr.right)
130
+ if key is None:
131
+ return None
132
+ return key, expr.op == "is not"
133
+
134
+
135
+ def is_scan_rvalue(expr: TpyExpr | None) -> bool:
136
+ """Conservative rvalue check for pre-scan (no type registry needed)."""
137
+ if expr is None:
138
+ return False
139
+ if isinstance(expr, TpyCoerce):
140
+ return is_scan_rvalue(expr.expr)
141
+ if isinstance(expr, (TpyName, TpySubscript)):
142
+ return False
143
+ if isinstance(expr, TpyFieldAccess):
144
+ return is_scan_rvalue(expr.obj)
145
+ if isinstance(expr, TpyNamedExpr):
146
+ return is_scan_rvalue(expr.value)
147
+ return isinstance(expr, (TpyCall, TpyBinOp, TpyChainedCompare, TpyUnaryOp, TpyMethodCall,
148
+ TpyIntLiteral, TpyFloatLiteral, TpyStrLiteral,
149
+ TpyBoolLiteral, TpyNoneLiteral, TpyArrayLiteral, TpyListRepeat,
150
+ TpyDictLiteral, TpySetLiteral, TpyTupleLiteral, TpyFString,
151
+ TpyIfExpr))
152
+
153
+
154
+ def _scan_walrus_in_expr(expr: TpyExpr | None, declared: set[str],
155
+ result: ScanResult) -> None:
156
+ """Walk an expression tree to find walrus operator bindings.
157
+
158
+ Uses generic dataclass field introspection so new expression types
159
+ are handled automatically without manual enumeration.
160
+ """
161
+ if expr is None:
162
+ return
163
+ if isinstance(expr, TpyNamedExpr):
164
+ if expr.target in declared:
165
+ result.reassigned.add(expr.target)
166
+ result.rvalue_reassigned.add(expr.target)
167
+ else:
168
+ declared.add(expr.target)
169
+ for f in dc_fields(expr):
170
+ val = getattr(expr, f.name)
171
+ if isinstance(val, TpyExpr):
172
+ _scan_walrus_in_expr(val, declared, result)
173
+ elif isinstance(val, TpyComprehensionGenerator):
174
+ _scan_walrus_in_expr(val.iterable, declared, result)
175
+ for cond in val.conditions:
176
+ _scan_walrus_in_expr(cond, declared, result)
177
+ elif isinstance(val, list):
178
+ for item in val:
179
+ if isinstance(item, TpyExpr):
180
+ _scan_walrus_in_expr(item, declared, result)
181
+ elif isinstance(item, TpyFStringValue):
182
+ _scan_walrus_in_expr(item.expr, declared, result)
183
+ elif isinstance(val, dict):
184
+ for v in val.values():
185
+ if isinstance(v, TpyExpr):
186
+ _scan_walrus_in_expr(v, declared, result)
187
+
188
+
189
+ def _scan_walrus_in_stmt(stmt: TpyStmt, declared: set[str],
190
+ result: ScanResult) -> None:
191
+ """Scan expressions within a statement for walrus bindings."""
192
+ for expr in stmt.exprs():
193
+ _scan_walrus_in_expr(expr, declared, result)
194
+
195
+
196
+ def _scan_stmts(stmts: list[TpyStmt], declared: set[str],
197
+ result: ScanResult) -> None:
198
+ for stmt in stmts:
199
+ # Scan for walrus bindings inside expressions before normal stmt scanning
200
+ _scan_walrus_in_stmt(stmt, declared, result)
201
+ if isinstance(stmt, TpyVarDecl):
202
+ if stmt.name in declared:
203
+ result.reassigned.add(stmt.name)
204
+ if is_scan_rvalue(stmt.init):
205
+ result.rvalue_reassigned.add(stmt.name)
206
+ else:
207
+ result.lvalue_reassigned.add(stmt.name)
208
+ else:
209
+ declared.add(stmt.name)
210
+ if (stmt.init is not None
211
+ and isinstance(stmt.init, TpyName)
212
+ and stmt.init.name != stmt.name):
213
+ result.alias_sources[stmt.name] = stmt.init.name
214
+ elif isinstance(stmt, TpyAssign):
215
+ if isinstance(stmt.target, TpyName) and stmt.target.name in declared:
216
+ result.reassigned.add(stmt.target.name)
217
+ if is_scan_rvalue(stmt.value):
218
+ result.rvalue_reassigned.add(stmt.target.name)
219
+ else:
220
+ result.lvalue_reassigned.add(stmt.target.name)
221
+ elif isinstance(stmt, TpyTupleUnpack):
222
+ for name in stmt.targets:
223
+ if name is None:
224
+ continue
225
+ if name in declared:
226
+ result.reassigned.add(name)
227
+ # std::get<i>(tmp) is always an rvalue
228
+ result.rvalue_reassigned.add(name)
229
+ else:
230
+ declared.add(name)
231
+ elif isinstance(stmt, TpyAugAssign):
232
+ if isinstance(stmt.target, TpyName) and stmt.target.name in declared:
233
+ result.aug_assigned.add(stmt.target.name)
234
+ elif isinstance(stmt, TpyNestedDef):
235
+ name = stmt.func.name
236
+ if name in declared:
237
+ result.reassigned.add(name)
238
+ result.rvalue_reassigned.add(name)
239
+ else:
240
+ declared.add(name)
241
+ # Do NOT recurse into nested body (separate scope)
242
+ # Recurse into sub-bodies (if/while/for/with)
243
+ if isinstance(stmt, TpyForEach):
244
+ declared.add(stmt.var)
245
+ if isinstance(stmt, TpyWith):
246
+ for item in stmt.items:
247
+ if item.target is not None:
248
+ if item.target in declared:
249
+ result.reassigned.add(item.target)
250
+ result.rvalue_reassigned.add(item.target)
251
+ else:
252
+ declared.add(item.target)
253
+ for body in stmt.sub_bodies():
254
+ _scan_stmts(body, declared, result)
tpyc/qnames.py ADDED
@@ -0,0 +1,149 @@
1
+ """
2
+ Qualified name constants for compiler-known types, decorators, and protocols.
3
+
4
+ These constants are the canonical identifiers used by the parser and sema to
5
+ dispatch on well-known names. They match the @builtin_type("...") and
6
+ @builtin_decorator("...") annotations in .py stubs under lib/tpy/.
7
+ """
8
+
9
+ # -- Builtin types --
10
+ BOOL = "builtins.bool"
11
+ INT = "builtins.int"
12
+ FLOAT = "builtins.float"
13
+ STR = "builtins.str"
14
+ TUPLE = "builtins.tuple"
15
+ BASIC_SLICE = "tpy.basic_slice"
16
+ SLICE = "builtins.slice"
17
+ TYPE = "builtins.type"
18
+ NONE = "builtins.None"
19
+ LIST = "builtins.list"
20
+ DICT = "builtins.dict"
21
+ DICT_KEYS = "builtins.dict_keys"
22
+ DICT_VALUES = "builtins.dict_values"
23
+ DICT_ITEMS = "builtins.dict_items"
24
+ SET = "builtins.set"
25
+ RANGE = "builtins.Range"
26
+ EXCEPTION = "builtins.Exception"
27
+ BASE_EXCEPTION = "builtins.BaseException"
28
+ STOP_ITERATION = "builtins.StopIteration"
29
+
30
+ # -- tpy types --
31
+ PTR = "tpy.Ptr"
32
+ OWN = "tpy.Own"
33
+ FN = "tpy.Fn"
34
+ SPAN = "tpy.Span"
35
+ ARRAY = "tpy.Array"
36
+ SPAN_ITER = "tpy.SpanIter"
37
+ CHAR = "tpy.Char"
38
+ FLOAT32 = "tpy.Float32"
39
+ STRING = "tpy.String"
40
+ STRVIEW = "tpy.StrView"
41
+
42
+ # Fixed-width integers
43
+ INT8 = "tpy.Int8"
44
+ INT16 = "tpy.Int16"
45
+ INT32 = "tpy.Int32"
46
+ INT64 = "tpy.Int64"
47
+ UINT8 = "tpy.UInt8"
48
+ UINT16 = "tpy.UInt16"
49
+ UINT32 = "tpy.UInt32"
50
+ UINT64 = "tpy.UInt64"
51
+
52
+ # Map from qualified name to short name for all fixed ints
53
+ FIXED_INT_NAMES = {
54
+ INT8: "Int8", INT16: "Int16", INT32: "Int32", INT64: "Int64",
55
+ UINT8: "UInt8", UINT16: "UInt16", UINT32: "UInt32", UINT64: "UInt64",
56
+ }
57
+
58
+ # -- tpy decorators / type modifiers --
59
+ READONLY = "tpy.readonly"
60
+ NOALLOC = "tpy.noalloc"
61
+ NOCOPY = "tpy.nocopy"
62
+ PURE = "tpy.pure"
63
+ INLINE = "tpy.inline"
64
+ DYNAMIC = "tpy.dynamic"
65
+ ERROR_RETURN = "tpy.error_return"
66
+ AUTO_READONLY = "tpy.auto_readonly"
67
+ AUTO_OWN = "tpy.auto_own"
68
+
69
+ # -- typing --
70
+ PROTOCOL = "typing.Protocol"
71
+ SELF = "typing.Self"
72
+ OPTIONAL = "typing.Optional"
73
+ FINAL = "typing.Final"
74
+ CLASSVAR = "typing.ClassVar"
75
+ CALLABLE = "typing.Callable"
76
+ OVERLOAD = "typing.overload"
77
+ OVERRIDE = "typing.override"
78
+ LITERAL = "typing.Literal"
79
+ TYPED_DICT = "typing.TypedDict"
80
+ UNPACK = "typing.Unpack"
81
+
82
+ # -- typing protocols --
83
+ ITERATOR = "typing.Iterator"
84
+ ITERABLE = "typing.Iterable"
85
+ SIZED = "typing.Sized"
86
+ SEQUENCE = "typing.Sequence"
87
+
88
+ # -- tpy.coro / asyncio --
89
+ AWAITABLE = "tpy.coro.Awaitable"
90
+ CANCELLABLE = "tpy.coro.Cancellable"
91
+ POLL = "tpy.coro.Poll"
92
+ ASYNCIO_RUN = "asyncio.run"
93
+ ASYNCIO_CREATE_TASK = "asyncio.create_task"
94
+
95
+ # -- tpy @builtin_function names with bespoke codegen emission --
96
+ COPY = "tpy.copy"
97
+ COPY_ITER = "tpy.copy_iter"
98
+ OWN_ITER = "tpy.own_iter"
99
+ TRY_PARSE = "tpy.try_parse"
100
+
101
+ # -- tpy protocols --
102
+ NATIVE_ITERABLE = "tpy.NativeIterable"
103
+ NATIVE_RANGE_CONSTRUCTIBLE = "tpy.NativeRangeConstructible"
104
+ SPANNABLE = "tpy.Spannable"
105
+ VALUE_TYPE = "tpy.ValueType"
106
+ COPYABLE = "tpy.Copyable"
107
+ SEND = "tpy.Send"
108
+ SYNC = "tpy.Sync"
109
+ DEFAULT = "tpy.Default"
110
+ COVARIANT = "tpy.Covariant"
111
+ RETURN_EXCEPTION = "tpy.ReturnException"
112
+ THROWABLE = "tpy.Throwable"
113
+ # Phase 20: methods auto-emitted by codegen on every concrete Throwable
114
+ # subclass (clone returns a heap-allocated polymorphic copy at the
115
+ # concrete type, __raise__ throws *this, what reads the message field).
116
+ # Sema rejects user-defined overrides of these names on Throwable
117
+ # subclasses to prevent a C++ redefinition collision.
118
+ THROWABLE_ABI_METHODS = ("clone", "__raise__", "what")
119
+ HASHABLE = "tpy.Hashable"
120
+ COMPARABLE = "tpy.Comparable"
121
+ EQUATABLE = "tpy.Equatable"
122
+ DEREF = "tpy.Deref"
123
+ TRUTHY = "tpy.Truthy"
124
+ STRINGABLE = "tpy.Stringable"
125
+ REPRESENTABLE = "tpy.Representable"
126
+ ANY_FIXED_INT = "tpy.AnyFixedInt"
127
+ ANY_FIXED_SIGNED = "tpy.AnyFixedSigned"
128
+ ANY_FIXED_UNSIGNED = "tpy.AnyFixedUnsigned"
129
+
130
+ # -- tpy.extern decorators --
131
+ NATIVE = "tpy.extern.native"
132
+ EXPORT = "tpy.extern.export"
133
+ CPP_TEMPLATE = "tpy.extern.cpp_template"
134
+ BUILTIN_TYPE = "tpy.extern.builtin_type"
135
+ BUILTIN_DECORATOR = "tpy.extern.builtin_decorator"
136
+ VALUE_PTR_COERCION = "tpy.extern.value_ptr_coercion"
137
+ NATIVE_PRESERVES_REFS = "tpy.extern.native_preserves_refs"
138
+ TYPE_PARAM_DEFAULT = "tpy.extern.type_param_default"
139
+ BUILTIN_FUNCTION = "tpy.extern.builtin_function"
140
+ DEFAULT_INT = "tpy.extern.DefaultInt"
141
+
142
+ # -- enum --
143
+ ENUM = "enum.Enum"
144
+ INT_ENUM = "enum.IntEnum"
145
+ ENUM_AUTO = "enum.auto"
146
+
147
+ # -- builtins special --
148
+ STATICMETHOD = "builtins.staticmethod"
149
+ PROPERTY = "builtins.property"