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
@@ -0,0 +1,118 @@
1
+ # heapq -- min-heap priority queue over list[T], following CPython's algorithm.
2
+ #
3
+ # Constraint: T must be copyable. `_siftup` / `_siftdown` stash and shift
4
+ # elements via `copy(heap[i])`, so `@nocopy` element types fail at C++
5
+ # compile time with a deleted-copy-constructor error. The diagnostic gap
6
+ # is tracked in BUGS.md; wrap a `@nocopy` payload in `Rc[T]` or `Box[T]`
7
+ # if you need shared ownership in a heap.
8
+ #
9
+ # Gaps vs. CPython, tracked in STDLIB_ROADMAP.md:
10
+ # - nsmallest/nlargest take list[T] instead of Iterable[T]
11
+ # (same list-literal-vs-protocol conformance gap as math.prod/fsum;
12
+ # TODO: switch to Iterable[T] once that blocker is resolved).
13
+ # - nlargest is sort-based (O(n log n)); CPython uses a size-k min-heap
14
+ # (O(n log k)). TODO: port the size-k-heap impl once it matters.
15
+ # - No `key=` arg on nsmallest/nlargest.
16
+ # TODO: thread `Callable[[T], K: Comparable]` through, matches CPython.
17
+ # - merge(*iterables, key=, reverse=) not implemented.
18
+ # Blocked on variadic-in-method-call codegen (same gate as math.hypot
19
+ # variadic) plus a generator-driven n-way iterator-heads heap.
20
+ #
21
+ # Codegen perf gap affecting this module (see TODO.md "Missed optimizations" and
22
+ # `docs/IR_DESIGN.md` "Open Questions" item 8):
23
+ # - For `T = str`, the heap's element storage is `std::string` (TPy `str` and
24
+ # TPy `String` share `std::string` storage and the trait machinery can't
25
+ # distinguish them). Push (`item: Own[T]`) lowers to `std::string&&`, so a
26
+ # literal `heappush(words, "cherry")` materializes a `std::string` at the
27
+ # call site instead of passing through a `std::string_view`. SSO covers
28
+ # short literals. No fix planned -- the perf gap is small in practice and
29
+ # every idiomatic alternative pays a real cost. See IR_DESIGN.md for the
30
+ # design landscape.
31
+ # tpy: cpp_namespace("tpystd::heapq")
32
+ from tpy import Int32, Comparable, Own, copy
33
+
34
+ def _siftdown[T: Comparable](heap: list[T], startpos: Int32, pos: Int32) -> None:
35
+ newitem: T = copy(heap[pos])
36
+ while pos > startpos:
37
+ parentpos: Int32 = (pos - 1) >> 1
38
+ if newitem < heap[parentpos]:
39
+ heap[pos] = copy(heap[parentpos])
40
+ pos = parentpos
41
+ continue
42
+ break
43
+ heap[pos] = newitem
44
+
45
+ def _siftup[T: Comparable](heap: list[T], pos: Int32) -> None:
46
+ endpos: Int32 = Int32(len(heap))
47
+ startpos: Int32 = pos
48
+ newitem: T = copy(heap[pos])
49
+ childpos: Int32 = 2 * pos + 1
50
+ while childpos < endpos:
51
+ rightpos: Int32 = childpos + 1
52
+ if rightpos < endpos and not heap[childpos] < heap[rightpos]:
53
+ childpos = rightpos
54
+ heap[pos] = copy(heap[childpos])
55
+ pos = childpos
56
+ childpos = 2 * pos + 1
57
+ heap[pos] = newitem
58
+ _siftdown(heap, startpos, pos)
59
+
60
+ def heappush[T: Comparable](heap: list[T], item: Own[T]) -> None:
61
+ heap.append(item)
62
+ _siftdown(heap, 0, Int32(len(heap)) - 1)
63
+
64
+ def heappop[T: Comparable](heap: list[T]) -> Own[T]:
65
+ lastelt = heap.pop()
66
+ if len(heap) == 0:
67
+ return lastelt
68
+ returnitem = copy(heap[0])
69
+ heap[0] = copy(lastelt)
70
+ _siftup(heap, 0)
71
+ return returnitem
72
+
73
+ def heapify[T: Comparable](x: list[T]) -> None:
74
+ n: Int32 = Int32(len(x))
75
+ i: Int32 = n // 2 - 1
76
+ while i >= 0:
77
+ _siftup(x, i)
78
+ i -= 1
79
+
80
+ def heapreplace[T: Comparable](heap: list[T], item: Own[T]) -> Own[T]:
81
+ returnitem: T = copy(heap[0])
82
+ heap[0] = item
83
+ _siftup(heap, 0)
84
+ return returnitem
85
+
86
+ def heappushpop[T: Comparable](heap: list[T], item: Own[T]) -> Own[T]:
87
+ if len(heap) > 0 and heap[0] < item:
88
+ result: T = copy(heap[0])
89
+ heap[0] = item
90
+ _siftup(heap, 0)
91
+ return result
92
+ return item
93
+
94
+ def nsmallest[T: Comparable](n: Int32, a: list[T]) -> Own[list[T]]:
95
+ h: list[T] = a.copy()
96
+ heapify(h)
97
+ result: list[T] = []
98
+ total: Int32 = Int32(len(h))
99
+ k: Int32 = n if n < total else total
100
+ i: Int32 = 0
101
+ while i < k:
102
+ result.append(heappop(h))
103
+ i += 1
104
+ return result
105
+
106
+ def nlargest[T: Comparable](n: Int32, a: list[T]) -> Own[list[T]]:
107
+ # Sort-based; a size-k heap variant (O(n log k)) is a perf follow-up.
108
+ h: list[T] = a.copy()
109
+ h.sort()
110
+ h.reverse()
111
+ result: list[T] = []
112
+ total: Int32 = Int32(len(h))
113
+ k: Int32 = n if n < total else total
114
+ i: Int32 = 0
115
+ while i < k:
116
+ result.append(copy(h[i]))
117
+ i += 1
118
+ return result
@@ -0,0 +1,395 @@
1
+ # io -- in-memory text/binary buffers and the IO protocol surface.
2
+ #
3
+ # v1 surface: StringIO, BytesIO, plus the IO protocols from tpy core
4
+ # (Readable / Writable / BinaryReadable / BinaryWritable / Seekable /
5
+ # Closable) which both buffer types explicitly conform to. Users can
6
+ # write `def f(fp: io.Writable): ...` etc. SEEK_SET/CUR/END constants
7
+ # are not exposed yet -- the names collide with <cstdio> macros; pass
8
+ # the integer values 0/1/2 to seek() as a workaround.
9
+ #
10
+ # Storage strategies:
11
+ # - StringIO: list[str] chunks. Fast append-at-end; mid-buffer writes
12
+ # and reads collapse to a single chunk first.
13
+ # - BytesIO: list[bytes] chunks (mirrors StringIO). bytearray would
14
+ # allow in-place splice but slice-assignment is not on the Python
15
+ # surface today, so the chunked approach is simpler.
16
+ #
17
+ # v1 divergences from CPython, all documented:
18
+ # - seek past end is clamped to total (CPython back-fills with NUL/0).
19
+ # - newline= / encoding= / errors= kwargs not supported.
20
+ # - read(size=-1) takes no arg today (returns "all remaining").
21
+ # - close() drops the buffer; CPython matches.
22
+ # - getvalue() does not collapse chunks (avoids unsolicited mutation).
23
+ #
24
+ # tpy: cpp_namespace("tpystd::io")
25
+ from typing import Iterator
26
+ from tpy import (
27
+ Int32, Own, nocopy,
28
+ Writable, Readable, BinaryWritable, BinaryReadable,
29
+ Seekable, Closable,
30
+ )
31
+
32
+
33
+ # NOTE: io.SEEK_SET / SEEK_CUR / SEEK_END are not exposed yet because the
34
+ # names collide with <cstdio> preprocessor macros. seek(whence=0|1|2) below
35
+ # accepts the integer values directly. The public constants need either a
36
+ # `#undef` shim from codegen or namespacing on the C++ side -- followup.
37
+ _SEEK_SET: Int32 = 0
38
+ _SEEK_CUR: Int32 = 1
39
+ _SEEK_END: Int32 = 2
40
+
41
+
42
+ @nocopy
43
+ class StringIO(Writable, Readable, Seekable, Closable):
44
+ _chunks: list[str]
45
+ _pos: Int32
46
+ _total: Int32
47
+ _closed: bool
48
+
49
+ def __init__(self, initial: str = "") -> None:
50
+ self._chunks = []
51
+ if len(initial) > 0:
52
+ self._chunks.append(str(initial))
53
+ self._pos = 0
54
+ self._total = Int32(len(initial))
55
+ self._closed = False
56
+
57
+ def write(self, s: str) -> Int32:
58
+ self._check_open()
59
+ n: Int32 = Int32(len(s))
60
+ if n == 0:
61
+ return n
62
+ # Param `s: str` arrives as std::string_view; the chunks list stores
63
+ # owned strings, so wrap with `str(...)` to materialize.
64
+ owned: str = str(s)
65
+ if self._pos == self._total:
66
+ # Fast path: append-at-end. The dominant pattern (build payload
67
+ # then getvalue / read) stays O(1) per write here.
68
+ self._chunks.append(owned)
69
+ self._total = self._total + n
70
+ self._pos = self._total
71
+ return n
72
+ # Slow path: mid-buffer overwrite. Collapse + splice + re-store as
73
+ # a single chunk; subsequent appends rejoin the fast path.
74
+ self._collapse()
75
+ buf: str = self._chunks[0]
76
+ end: Int32 = self._pos + n
77
+ prefix: str = buf[:self._pos]
78
+ if end < Int32(len(buf)):
79
+ tail: str = buf[end:]
80
+ new_buf: str = prefix + owned + tail
81
+ else:
82
+ new_buf = prefix + owned
83
+ self._chunks = [new_buf]
84
+ self._total = Int32(len(new_buf))
85
+ self._pos = end
86
+ return n
87
+
88
+ def read(self) -> str:
89
+ self._check_open()
90
+ if self._pos >= self._total:
91
+ return ""
92
+ self._collapse()
93
+ out: str = self._chunks[0][self._pos:]
94
+ self._pos = self._total
95
+ return out
96
+
97
+ def readline(self) -> str:
98
+ self._check_open()
99
+ if self._pos >= self._total:
100
+ return ""
101
+ self._collapse()
102
+ buf: str = self._chunks[0]
103
+ # str.find takes no `start` arg today (per BUGS.md / surface gap):
104
+ # search the suffix and adjust the offset back into buf.
105
+ suffix: str = buf[self._pos:]
106
+ rel: Int32 = suffix.find("\n")
107
+ if rel < 0:
108
+ out: str = suffix
109
+ self._pos = self._total
110
+ else:
111
+ stop: Int32 = self._pos + rel + 1
112
+ out = buf[self._pos:stop]
113
+ self._pos = stop
114
+ return out
115
+
116
+ def readlines(self) -> Own[list[str]]:
117
+ # Inlined readline loop instead of `for line in self:` to side-step
118
+ # readonly auto-deduction picking the const __iter__ overload.
119
+ out: list[str] = []
120
+ while True:
121
+ line: str = self.readline()
122
+ if not line:
123
+ break
124
+ out.append(line)
125
+ return out
126
+
127
+ def __iter__(self) -> Iterator[str]:
128
+ while True:
129
+ line: str = self.readline()
130
+ if not line:
131
+ return
132
+ yield line
133
+
134
+ def getvalue(self) -> str:
135
+ self._check_open()
136
+ if len(self._chunks) == 0:
137
+ return ""
138
+ if len(self._chunks) == 1:
139
+ return self._chunks[0]
140
+ return "".join(self._chunks)
141
+
142
+ def tell(self) -> Int32:
143
+ self._check_open()
144
+ return self._pos
145
+
146
+ def seek(self, pos: Int32, whence: Int32 = 0) -> Int32:
147
+ self._check_open()
148
+ new_pos: Int32 = 0
149
+ if whence == _SEEK_SET:
150
+ new_pos = pos
151
+ elif whence == _SEEK_CUR:
152
+ new_pos = self._pos + pos
153
+ elif whence == _SEEK_END:
154
+ new_pos = self._total + pos
155
+ else:
156
+ raise ValueError("invalid whence")
157
+ if new_pos < 0:
158
+ raise ValueError("negative seek position")
159
+ # v1: clamp seek-past-end to total. CPython would back-fill on
160
+ # the next write; revisit when there's a real consumer.
161
+ if new_pos > self._total:
162
+ new_pos = self._total
163
+ self._pos = new_pos
164
+ return self._pos
165
+
166
+ def truncate(self, size: Int32 = -1) -> Int32:
167
+ self._check_open()
168
+ n: Int32 = size if size >= 0 else self._pos
169
+ if n >= self._total:
170
+ return self._total
171
+ self._collapse()
172
+ if n == 0:
173
+ self._chunks = []
174
+ else:
175
+ self._chunks = [self._chunks[0][:n]]
176
+ self._total = n
177
+ if self._pos > n:
178
+ self._pos = n
179
+ return n
180
+
181
+ def flush(self) -> None:
182
+ self._check_open()
183
+
184
+ def close(self) -> None:
185
+ self._closed = True
186
+ self._chunks = []
187
+ self._total = 0
188
+ self._pos = 0
189
+
190
+ @property
191
+ def closed(self) -> bool:
192
+ return self._closed
193
+
194
+ def readable(self) -> bool:
195
+ return not self._closed
196
+
197
+ def writable(self) -> bool:
198
+ return not self._closed
199
+
200
+ def seekable(self) -> bool:
201
+ return not self._closed
202
+
203
+ def __enter__(self) -> "StringIO":
204
+ return self
205
+
206
+ def __exit__(self, exc_type, exc_val, exc_tb) -> None:
207
+ self.close()
208
+
209
+ def _collapse(self) -> None:
210
+ # After this, _chunks has exactly one element holding the full buffer
211
+ # (or is empty if total is 0).
212
+ if len(self._chunks) > 1:
213
+ self._chunks = ["".join(self._chunks)]
214
+ elif len(self._chunks) == 0 and self._total > 0:
215
+ # Defensive: invariant says this can't happen, but keep readers
216
+ # robust against hand-edited state.
217
+ self._chunks = [""]
218
+
219
+ def _check_open(self) -> None:
220
+ if self._closed:
221
+ # CPython StringIO drops the trailing period; BytesIO keeps it.
222
+ # We match both quirks for byte-identical cpy-phase output.
223
+ raise ValueError("I/O operation on closed file")
224
+
225
+
226
+ @nocopy
227
+ class BytesIO(BinaryWritable, BinaryReadable, Seekable, Closable):
228
+ _chunks: list[bytes]
229
+ _pos: Int32
230
+ _total: Int32
231
+ _closed: bool
232
+
233
+ def __init__(self, initial: bytes | None = None) -> None:
234
+ self._chunks = []
235
+ self._pos = 0
236
+ self._total = 0
237
+ if initial is not None and len(initial) > 0:
238
+ self._chunks.append(bytes(initial))
239
+ self._total = Int32(len(initial))
240
+ self._closed = False
241
+
242
+ def write(self, data: bytes) -> Int32:
243
+ self._check_open()
244
+ n: Int32 = Int32(len(data))
245
+ if n == 0:
246
+ return n
247
+ # Param `data: bytes` arrives as std::span<const uint8_t>; chunks list
248
+ # stores owned bytes, so wrap with `bytes(...)` to materialize.
249
+ owned: bytes = bytes(data)
250
+ if self._pos == self._total:
251
+ self._chunks.append(owned)
252
+ self._total = self._total + n
253
+ self._pos = self._total
254
+ return n
255
+ self._collapse()
256
+ buf: bytes = self._chunks[0]
257
+ end: Int32 = self._pos + n
258
+ # bytes slicing: basic_slice returns BytesView; concat needs bytes.
259
+ # Wrap each slice with bytes(...) so '+' resolves to bytes+bytes.
260
+ prefix: bytes = bytes(buf[:self._pos])
261
+ if end < Int32(len(buf)):
262
+ tail: bytes = bytes(buf[end:])
263
+ new_buf: bytes = prefix + owned + tail
264
+ else:
265
+ new_buf = prefix + owned
266
+ self._chunks = [new_buf]
267
+ self._total = Int32(len(new_buf))
268
+ self._pos = end
269
+ return n
270
+
271
+ def read(self) -> bytes:
272
+ self._check_open()
273
+ if self._pos >= self._total:
274
+ return b""
275
+ self._collapse()
276
+ out: bytes = bytes(self._chunks[0][self._pos:])
277
+ self._pos = self._total
278
+ return out
279
+
280
+ def readline(self) -> bytes:
281
+ self._check_open()
282
+ if self._pos >= self._total:
283
+ return b""
284
+ self._collapse()
285
+ buf: bytes = self._chunks[0]
286
+ # Same start-arg gap as str.find: search the suffix and adjust.
287
+ suffix: bytes = bytes(buf[self._pos:])
288
+ rel: Int32 = suffix.find(b"\n")
289
+ if rel < 0:
290
+ out: bytes = suffix
291
+ self._pos = self._total
292
+ else:
293
+ stop: Int32 = self._pos + rel + 1
294
+ out = bytes(buf[self._pos:stop])
295
+ self._pos = stop
296
+ return out
297
+
298
+ def readlines(self) -> Own[list[bytes]]:
299
+ out: list[bytes] = []
300
+ while True:
301
+ line: bytes = self.readline()
302
+ if len(line) == 0:
303
+ break
304
+ out.append(line)
305
+ return out
306
+
307
+ def __iter__(self) -> Iterator[bytes]:
308
+ while True:
309
+ line: bytes = self.readline()
310
+ if len(line) == 0:
311
+ return
312
+ yield line
313
+
314
+ def getvalue(self) -> bytes:
315
+ self._check_open()
316
+ if len(self._chunks) == 0:
317
+ return b""
318
+ if len(self._chunks) == 1:
319
+ return self._chunks[0]
320
+ return b"".join(self._chunks)
321
+
322
+ def tell(self) -> Int32:
323
+ self._check_open()
324
+ return self._pos
325
+
326
+ def seek(self, pos: Int32, whence: Int32 = 0) -> Int32:
327
+ self._check_open()
328
+ new_pos: Int32 = 0
329
+ if whence == _SEEK_SET:
330
+ new_pos = pos
331
+ elif whence == _SEEK_CUR:
332
+ new_pos = self._pos + pos
333
+ elif whence == _SEEK_END:
334
+ new_pos = self._total + pos
335
+ else:
336
+ raise ValueError("invalid whence")
337
+ if new_pos < 0:
338
+ raise ValueError("negative seek position")
339
+ if new_pos > self._total:
340
+ new_pos = self._total
341
+ self._pos = new_pos
342
+ return self._pos
343
+
344
+ def truncate(self, size: Int32 = -1) -> Int32:
345
+ self._check_open()
346
+ n: Int32 = size if size >= 0 else self._pos
347
+ if n >= self._total:
348
+ return self._total
349
+ self._collapse()
350
+ if n == 0:
351
+ self._chunks = []
352
+ else:
353
+ self._chunks = [bytes(self._chunks[0][:n])]
354
+ self._total = n
355
+ if self._pos > n:
356
+ self._pos = n
357
+ return n
358
+
359
+ def flush(self) -> None:
360
+ self._check_open()
361
+
362
+ def close(self) -> None:
363
+ self._closed = True
364
+ self._chunks = []
365
+ self._total = 0
366
+ self._pos = 0
367
+
368
+ @property
369
+ def closed(self) -> bool:
370
+ return self._closed
371
+
372
+ def readable(self) -> bool:
373
+ return not self._closed
374
+
375
+ def writable(self) -> bool:
376
+ return not self._closed
377
+
378
+ def seekable(self) -> bool:
379
+ return not self._closed
380
+
381
+ def __enter__(self) -> "BytesIO":
382
+ return self
383
+
384
+ def __exit__(self, exc_type, exc_val, exc_tb) -> None:
385
+ self.close()
386
+
387
+ def _collapse(self) -> None:
388
+ if len(self._chunks) > 1:
389
+ self._chunks = [b"".join(self._chunks)]
390
+ elif len(self._chunks) == 0 and self._total > 0:
391
+ self._chunks = [b""]
392
+
393
+ def _check_open(self) -> None:
394
+ if self._closed:
395
+ raise ValueError("I/O operation on closed file.")