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/test_parse.py ADDED
@@ -0,0 +1,303 @@
1
+ """Tests for parser utilities."""
2
+
3
+ import ast
4
+ import pytest
5
+ from .parse import RelativeImportKey, Parser, ParseError
6
+ from .parse.imports import (
7
+ get_tpy_exports, scan_star_exports, NonLiteralAllError, read_module_all,
8
+ )
9
+
10
+
11
+ class TestRelativeImportKey:
12
+ def test_roundtrip_simple(self):
13
+ key = RelativeImportKey(level=1, line=10, col=0, partial="")
14
+ assert RelativeImportKey.decode(key.encode()) == key
15
+
16
+ def test_roundtrip_with_partial(self):
17
+ key = RelativeImportKey(level=2, line=5, col=4, partial="utils")
18
+ assert RelativeImportKey.decode(key.encode()) == key
19
+
20
+ def test_roundtrip_dotted_partial(self):
21
+ key = RelativeImportKey(level=1, line=99, col=12, partial="pkg.sub")
22
+ assert RelativeImportKey.decode(key.encode()) == key
23
+
24
+ def test_is_placeholder_positive(self):
25
+ key = RelativeImportKey(level=1, line=1, col=0, partial="mod")
26
+ assert RelativeImportKey.is_placeholder(key.encode())
27
+
28
+ def test_is_placeholder_negative(self):
29
+ assert not RelativeImportKey.is_placeholder("mymodule")
30
+ assert not RelativeImportKey.is_placeholder("__init__")
31
+ assert not RelativeImportKey.is_placeholder("")
32
+
33
+ def test_prefix_cannot_collide_with_identifiers(self):
34
+ encoded = RelativeImportKey(level=1, line=1, col=0, partial="").encode()
35
+ assert "\x00" in encoded
36
+
37
+
38
+ class TestTpyExports:
39
+ """Tests for get_tpy_exports() reading __all__ from tpy/__init__.py."""
40
+
41
+ def test_returns_nonempty_frozenset(self):
42
+ exports = get_tpy_exports()
43
+ assert isinstance(exports, frozenset)
44
+ assert len(exports) > 0
45
+
46
+ def test_contains_core_types(self):
47
+ exports = get_tpy_exports()
48
+ for name in ["Int32", "Float32", "Span", "Array", "Ptr", "Own"]:
49
+ assert name in exports, f"{name} missing from tpy exports"
50
+
51
+ def test_contains_decorators(self):
52
+ exports = get_tpy_exports()
53
+ for name in ["readonly", "noalloc", "nocopy", "pure"]:
54
+ assert name in exports, f"{name} missing from tpy exports"
55
+
56
+ def test_contains_parser_keywords(self):
57
+ exports = get_tpy_exports()
58
+ assert "auto_readonly" in exports
59
+ assert "auto_own" in exports
60
+
61
+ def test_no_python_builtins(self):
62
+ """__all__ should not include Python builtins like int, str, float."""
63
+ exports = get_tpy_exports()
64
+ for name in ["int", "float", "str", "bool", "None"]:
65
+ assert name not in exports, f"Python builtin {name} should not be in tpy exports"
66
+
67
+
68
+ class TestStarImportResolution:
69
+ """Tests for 'from tpy import *' name resolution."""
70
+
71
+ def test_star_import_resolves_types(self):
72
+ p = Parser()
73
+ # All core tpy types should resolve with star import
74
+ module = p.parse("from tpy import *\ndef f(x: Span[Int32]) -> Int32:\n return x[0]\n")
75
+ assert module.tpy_star_import is True
76
+
77
+ def test_star_import_resolves_decorators(self):
78
+ p = Parser()
79
+ module = p.parse("from tpy import *\n@readonly\ndef f(x: Int32) -> Int32:\n return x\n")
80
+ assert module.tpy_star_import is True
81
+
82
+ def test_star_import_does_not_resolve_unknown(self):
83
+ """Names not in __all__ should not resolve as tpy imports."""
84
+ p = Parser()
85
+ module = p.parse("from tpy import *\ndef f(x: Int32) -> Int32:\n return x\n")
86
+ # Int32 should resolve, but a name not in exports should not
87
+ source = module.imports.get("tpy")
88
+ assert source is not None
89
+ exported_locals = {local for _, local in source}
90
+ assert "Int32" in exported_locals
91
+ assert "not_a_tpy_name" not in exported_locals
92
+
93
+
94
+ class TestParserStateIsolation:
95
+ """Verify that `Parser.parse()` resets import-related state between calls.
96
+
97
+ Scope of these tests (narrowed in Phase F.3b.5): we verify that the
98
+ second parse's `module.imports` does not include the first parse's
99
+ imports, AND that invoking the attached `module.resolver` on the
100
+ second parse's AST refs raises (because the required import is
101
+ absent from the parser's current state). They do NOT verify that
102
+ modules produced by separate `parse()` calls hold independent
103
+ resolvers -- in this codebase `resolver` is the same bound method
104
+ across parses on the same Parser instance, so calling the first
105
+ module's resolver AFTER the second parse will see the second
106
+ parse's state. That sharing is safe in production (each module
107
+ gets a fresh Parser) and out of scope for these tests.
108
+ """
109
+
110
+ def test_module_alias_does_not_leak(self):
111
+ p = Parser()
112
+ # First parse has 'import typing as t'
113
+ p.parse("import typing as t\nfrom tpy import Int32\ndef f(x: t.Optional[Int32]) -> Int32:\n return Int32(0)\n")
114
+ # Second parse has no typing import -- t.Optional must fail to resolve
115
+ m = p.parse("from tpy import Int32\ndef f(x: t.Optional[Int32]) -> Int32:\n return Int32(0)\n")
116
+ assert "typing" not in m.imports
117
+ func = next(f for f in m.functions if f.name == "f")
118
+ with pytest.raises(ParseError):
119
+ m.resolver.resolve(func.params[0][1])
120
+
121
+ def test_tpy_star_import_does_not_leak(self):
122
+ p = Parser()
123
+ # First parse has 'from tpy import *'
124
+ p.parse("from tpy import *\ndef f(x: Int32) -> Int32:\n return x\n")
125
+ # Second parse has no tpy import -- Int32 must fail to resolve
126
+ m = p.parse("def f(x: Int32) -> Int32:\n return x\n")
127
+ assert not m.tpy_star_import
128
+ func = next(f for f in m.functions if f.name == "f")
129
+ with pytest.raises(ParseError):
130
+ m.resolver.resolve(func.params[0][1])
131
+
132
+ def test_typing_import_does_not_leak(self):
133
+ p = Parser()
134
+ # First parse has 'from typing import Optional'
135
+ p.parse("from typing import Optional\nfrom tpy import Int32\ndef f(x: Optional[Int32]) -> Int32:\n return Int32(0)\n")
136
+ # Second parse has no typing import -- Optional must fail to resolve
137
+ m = p.parse("from tpy import Int32\ndef f(x: Optional[Int32]) -> Int32:\n return Int32(0)\n")
138
+ typing_source = m.imports.get("typing")
139
+ assert typing_source is None or "Optional" not in {orig for orig, _ in (typing_source or set())}
140
+ func = next(f for f in m.functions if f.name == "f")
141
+ with pytest.raises(ParseError):
142
+ m.resolver.resolve(func.params[0][1])
143
+
144
+
145
+ class TestScanStarExports:
146
+ """Tests for scan_star_exports()."""
147
+
148
+ def test_with_all(self):
149
+ source = '__all__ = ["foo", "bar"]\ndef foo(): pass\ndef bar(): pass\ndef baz(): pass\n'
150
+ assert scan_star_exports(source) == frozenset({"foo", "bar"})
151
+
152
+ def test_without_all_functions(self):
153
+ source = "def foo(): pass\ndef bar(): pass\n"
154
+ assert scan_star_exports(source) == frozenset({"foo", "bar"})
155
+
156
+ def test_without_all_classes(self):
157
+ source = "class Foo: pass\nclass Bar: pass\n"
158
+ assert scan_star_exports(source) == frozenset({"Foo", "Bar"})
159
+
160
+ def test_without_all_assignments(self):
161
+ source = "X = 1\nY = 2\n"
162
+ assert scan_star_exports(source) == frozenset({"X", "Y"})
163
+
164
+ def test_without_all_annotated_assignments(self):
165
+ source = "x: int = 1\n"
166
+ assert scan_star_exports(source) == frozenset({"x"})
167
+
168
+ def test_underscore_filtered(self):
169
+ source = "def _private(): pass\ndef public(): pass\nclass _Internal: pass\n_x = 1\n"
170
+ assert scan_star_exports(source) == frozenset({"public"})
171
+
172
+ def test_imports_included_without_all(self):
173
+ source = "from foo import bar\ndef baz(): pass\n"
174
+ assert scan_star_exports(source) == frozenset({"bar", "baz"})
175
+
176
+ def test_all_overrides_definitions(self):
177
+ source = '__all__ = ["x"]\ndef x(): pass\ndef y(): pass\n'
178
+ assert scan_star_exports(source) == frozenset({"x"})
179
+
180
+ def test_empty_module(self):
181
+ assert scan_star_exports("") == frozenset()
182
+
183
+ def test_mixed_definitions(self):
184
+ source = "def add(): pass\nclass Point: pass\nShape = None\n"
185
+ assert scan_star_exports(source) == frozenset({"add", "Point", "Shape"})
186
+
187
+ def test_non_literal_all_raises(self):
188
+ source = '__all__ = _base + ["extra"]\ndef foo(): pass\ndef bar(): pass\n'
189
+ with pytest.raises(NonLiteralAllError):
190
+ scan_star_exports(source)
191
+
192
+ def test_annotated_all(self):
193
+ source = '__all__: list[str] = ["foo"]\ndef foo(): pass\ndef bar(): pass\n'
194
+ assert scan_star_exports(source) == frozenset({"foo"})
195
+
196
+ def test_last_all_wins(self):
197
+ source = '__all__ = ["a"]\n__all__ = ["b"]\ndef a(): pass\ndef b(): pass\n'
198
+ assert scan_star_exports(source) == frozenset({"b"})
199
+
200
+ def test_underscore_import_filtered(self):
201
+ source = "from foo import _private, public\n"
202
+ assert scan_star_exports(source) == frozenset({"public"})
203
+
204
+
205
+ class TestReadModuleAll:
206
+ """Tests for read_module_all()."""
207
+
208
+ def _parse(self, source: str) -> ast.Module:
209
+ return ast.parse(source)
210
+
211
+ def test_no_all_returns_none(self):
212
+ assert read_module_all(self._parse("x = 1\ndef foo(): pass\n")) is None
213
+
214
+ def test_empty_module_returns_none(self):
215
+ assert read_module_all(self._parse("")) is None
216
+
217
+ def test_literal_list(self):
218
+ result = read_module_all(self._parse('__all__ = ["foo", "bar"]\n'))
219
+ assert result is not None
220
+ assert result[0] == frozenset({"foo", "bar"})
221
+ assert result[1].line == 1
222
+
223
+ def test_empty_literal_list(self):
224
+ # `__all__ = []` is the Python idiom for "export nothing"; the
225
+ # empty frozenset must come through cleanly here so the
226
+ # downstream variable-deduction shortcut in
227
+ # `sema/local_deduction.py` (which infers `list[str]` for this
228
+ # exact shape) has the right metadata to work with.
229
+ result = read_module_all(self._parse('__all__ = []\n'))
230
+ assert result is not None
231
+ assert result[0] == frozenset()
232
+ assert result[1].line == 1
233
+
234
+ def test_literal_tuple(self):
235
+ result = read_module_all(self._parse('__all__ = ("foo",)\n'))
236
+ assert result is not None
237
+ assert result[0] == frozenset({"foo"})
238
+
239
+ def test_literal_set(self):
240
+ result = read_module_all(self._parse('__all__ = {"foo", "bar"}\n'))
241
+ assert result is not None
242
+ assert result[0] == frozenset({"foo", "bar"})
243
+
244
+ def test_annotated_all(self):
245
+ result = read_module_all(self._parse('__all__: list[str] = ["foo"]\n'))
246
+ assert result is not None
247
+ assert result[0] == frozenset({"foo"})
248
+
249
+ def test_last_assignment_wins(self):
250
+ result = read_module_all(
251
+ self._parse('__all__ = ["a"]\n__all__ = ["b"]\n'))
252
+ assert result is not None
253
+ assert result[0] == frozenset({"b"})
254
+ # Line should be the line of the *winning* assignment's RHS.
255
+ assert result[1].line == 2
256
+
257
+ def test_non_literal_raises(self):
258
+ with pytest.raises(NonLiteralAllError):
259
+ read_module_all(self._parse('__all__ = _base + ["x"]\n'))
260
+
261
+ def test_annotated_then_plain(self):
262
+ # Mix of AnnAssign followed by plain Assign -- last wins.
263
+ source = '__all__: list[str] = ["a"]\n__all__ = ["b"]\n'
264
+ result = read_module_all(self._parse(source))
265
+ assert result is not None
266
+ assert result[0] == frozenset({"b"})
267
+
268
+ def test_conditional_all_ignored(self):
269
+ # read_module_all walks only top-level children, so `__all__`
270
+ # nested inside an `if` / `try` / function body is invisible.
271
+ # Pins this boundary; CPython evaluates it at import time.
272
+ source = 'if True:\n __all__ = ["x"]\n'
273
+ assert read_module_all(self._parse(source)) is None
274
+
275
+
276
+ class TestUserModuleStarImport:
277
+ """Star imports from user modules are deferred: parser records a
278
+ placeholder, Compiler._expand_star_imports_for_module fills the
279
+ actual name set against the source module's per-attribute table at
280
+ compile time. The unit tests below pin the parser side of that
281
+ contract -- end-to-end expansion is covered by the
282
+ `tests/cases/imports/star_import_*` snippets."""
283
+
284
+ def test_user_star_import_records_placeholder(self):
285
+ p = Parser()
286
+ module = p.parse("from mymod import *\ndef f() -> None:\n pass\n")
287
+ # Parser leaves a placeholder set; expansion happens at compile time.
288
+ assert "mymod" in module.star_imports
289
+ assert module.imports.get("mymod") == set()
290
+
291
+ def test_user_star_import_unknown_module_defers_to_compile(self):
292
+ # Parser no longer errors on unknown user modules in star imports
293
+ # (Compiler._process_user_import handles the not-found check
294
+ # downstream). The parser path is purely syntactic.
295
+ p = Parser()
296
+ module = p.parse("from unknown import *\n")
297
+ assert "unknown" in module.star_imports
298
+
299
+ def test_tpy_star_import_still_tracked(self):
300
+ p = Parser()
301
+ module = p.parse("from tpy import *\ndef f(x: Int32) -> Int32:\n return x\n")
302
+ assert module.tpy_star_import is True
303
+ assert "tpy" in module.star_imports