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,718 @@
1
+ """Frontend IR node definitions.
2
+
3
+ Plain dataclasses with `kind` discriminators. No methods, no behavior --
4
+ the IR is structural data that lowering walks.
5
+
6
+ M1 set: the nodes needed for a Pascal hello-world program. Subsequent
7
+ milestones extend this set without changing existing shapes.
8
+ """
9
+
10
+ from __future__ import annotations
11
+
12
+ from dataclasses import dataclass, field
13
+ from enum import Enum
14
+ from pathlib import Path
15
+ from typing import Union
16
+
17
+
18
+ API_VERSION = 1
19
+
20
+
21
+ @dataclass(frozen=True)
22
+ class Loc:
23
+ """Source location in the original (non-Python) source file.
24
+
25
+ Line and column are 1-based; end_line/end_col are inclusive. `file`
26
+ is the path of the source file the plugin parsed. `source_language`
27
+ tags the plugin that produced this location.
28
+ """
29
+ file: Path
30
+ line: int
31
+ col: int
32
+ end_line: int
33
+ end_col: int
34
+ source_language: str
35
+
36
+
37
+ # --- Operator kinds -------------------------------------------------------
38
+
39
+
40
+ class BinOpKind(Enum):
41
+ """Binary operators recognised by the IR.
42
+
43
+ Names match `docs/FRONTEND_PLUGIN_DESIGN.md`. M2 only exercises the
44
+ arithmetic set; comparison and logical operators land with control
45
+ flow (M3) and onward, but are listed here so the enum is stable.
46
+ """
47
+ ADD = "ADD"
48
+ SUB = "SUB"
49
+ MUL = "MUL"
50
+ TRUE_DIV = "TRUE_DIV"
51
+ FLOOR_DIV = "FLOOR_DIV"
52
+ MOD = "MOD"
53
+ POW = "POW"
54
+ BIT_OR = "BIT_OR"
55
+ BIT_XOR = "BIT_XOR"
56
+ BIT_AND = "BIT_AND"
57
+ LSHIFT = "LSHIFT"
58
+ RSHIFT = "RSHIFT"
59
+ LOGICAL_AND = "LOGICAL_AND"
60
+ LOGICAL_OR = "LOGICAL_OR"
61
+
62
+
63
+ class UnaryOpKind(Enum):
64
+ POS = "POS"
65
+ NEG = "NEG"
66
+ NOT = "NOT"
67
+ INVERT = "INVERT"
68
+
69
+
70
+ class CmpOpKind(Enum):
71
+ """Comparison operators recognised by the IR."""
72
+ EQ = "EQ"
73
+ NE = "NE"
74
+ LT = "LT"
75
+ LE = "LE"
76
+ GT = "GT"
77
+ GE = "GE"
78
+ IS = "IS"
79
+ IS_NOT = "IS_NOT"
80
+ IN = "IN"
81
+ NOT_IN = "NOT_IN"
82
+
83
+
84
+ class RangeDir(Enum):
85
+ """Direction of a `ForRange` loop. Mirrors Pascal's to/downto."""
86
+ ASC = "ASC"
87
+ DESC = "DESC"
88
+
89
+
90
+ # --- Type IR --------------------------------------------------------------
91
+
92
+
93
+ @dataclass
94
+ class TypeTypeArg:
95
+ """A type-valued generic argument, e.g. `list[T]`'s `T`."""
96
+ kind: str = field(default="TypeTypeArg", init=False)
97
+ value: "TypeExpr" = None # type: ignore[assignment]
98
+
99
+
100
+ @dataclass
101
+ class IntTypeArg:
102
+ """An integer-valued generic argument, e.g. `Array[T, N]`'s `N`."""
103
+ kind: str = field(default="IntTypeArg", init=False)
104
+ value: int = 0
105
+
106
+
107
+ TypeArg = Union[TypeTypeArg, IntTypeArg]
108
+
109
+
110
+ @dataclass
111
+ class NamedType:
112
+ """A type referenced by name, with optional generic args.
113
+
114
+ Mirrors the design's `NamedType("Int32")` shape. Wrapper types
115
+ (Optional, Readonly, Own, Union, Callable, Literal) land as
116
+ separate IR nodes in their respective milestones.
117
+ """
118
+ kind: str = field(default="NamedType", init=False)
119
+ name: str = ""
120
+ args: tuple[TypeArg, ...] = ()
121
+ loc: Loc | None = None
122
+
123
+
124
+ @dataclass
125
+ class PointerType:
126
+ """`Ptr[T]` -- a pointer to a pointee type.
127
+
128
+ Used to model Pascal's `var` (by-reference) parameters: the
129
+ translator emits `PointerType(NamedType("Int32"))` for a `var x:
130
+ integer` parameter, wraps caller args in `take_ptr(...)`, and
131
+ rewrites in-body uses to `deref(...)` reads and `unsafe_store(...)`
132
+ writes. Records and other non-value types pass through TPy's own
133
+ reference conventions and do not need `PointerType`.
134
+ """
135
+ kind: str = field(default="PointerType", init=False)
136
+ inner: "TypeExpr" = None # type: ignore[assignment]
137
+ loc: Loc | None = None
138
+
139
+
140
+ @dataclass
141
+ class UnionType:
142
+ """`A | B | C` -- a Python-style union annotation. Used by
143
+ plugins (e.g. Pascal variant records) to type a discriminated-
144
+ payload field as the union of its variant inner records. Lowers
145
+ to a `TpyUnionRef` so the resolver runs the same union-shape
146
+ pipeline as ordinary Python source."""
147
+ kind: str = field(default="UnionType", init=False)
148
+ members: tuple["TypeExpr", ...] = ()
149
+ loc: Loc | None = None
150
+
151
+
152
+ @dataclass
153
+ class CallableType:
154
+ """`Callable[[P1, P2], R]` -- a function-pointer-style type
155
+ annotation. Used by plugins (e.g. Pascal `type Fn = procedure
156
+ (x: integer);`) to express a first-class callable value's type.
157
+ Lowers to a `TpyCallableRef`. The `params` slot carries TypeExpr
158
+ nodes per parameter (parameter names aren't part of the type
159
+ signature); `return_type=None` lowers to a `None`-returning
160
+ callable (Pascal `procedure`)."""
161
+ kind: str = field(default="CallableType", init=False)
162
+ params: tuple["TypeExpr", ...] = ()
163
+ return_type: "TypeExpr | None" = None
164
+ loc: Loc | None = None
165
+
166
+
167
+ # Plugin authors compose types out of the nodes above. Later milestones
168
+ # widen this union with OptionalType / OwnType / ReadonlyType / etc.
169
+ TypeExpr = Union[NamedType, PointerType, UnionType, CallableType]
170
+
171
+
172
+ # --- Expressions ----------------------------------------------------------
173
+
174
+
175
+ @dataclass
176
+ class StrLit:
177
+ """String literal expression."""
178
+ kind: str = field(default="StrLit", init=False)
179
+ value: str = ""
180
+ loc: Loc | None = None
181
+
182
+
183
+ @dataclass
184
+ class BoolLit:
185
+ """Boolean literal expression."""
186
+ kind: str = field(default="BoolLit", init=False)
187
+ value: bool = False
188
+ loc: Loc | None = None
189
+
190
+
191
+ @dataclass
192
+ class IntLit:
193
+ """Integer literal expression."""
194
+ kind: str = field(default="IntLit", init=False)
195
+ value: int = 0
196
+ loc: Loc | None = None
197
+
198
+
199
+ @dataclass
200
+ class FloatLit:
201
+ """Floating-point literal expression."""
202
+ kind: str = field(default="FloatLit", init=False)
203
+ value: float = 0.0
204
+ loc: Loc | None = None
205
+
206
+
207
+ @dataclass
208
+ class Name:
209
+ """Identifier reference."""
210
+ kind: str = field(default="Name", init=False)
211
+ ident: str = ""
212
+ loc: Loc | None = None
213
+
214
+
215
+ @dataclass
216
+ class Call:
217
+ """Function call.
218
+
219
+ `type_args` carries explicit type arguments at the call site --
220
+ Pascal needs them for generic-type constructor calls like
221
+ `Array[Int32, 8]()`. `kwargs` is a tuple of `(name, value)` pairs
222
+ -- needed for calls like Python's `print(x, end="")`. `star_args`
223
+ / `double_star` from the design doc are not used yet; they land
224
+ with later milestones.
225
+ """
226
+ kind: str = field(default="Call", init=False)
227
+ callee: "Expr" = None # type: ignore[assignment]
228
+ type_args: tuple[TypeArg, ...] = ()
229
+ args: tuple["Expr", ...] = ()
230
+ kwargs: tuple[tuple[str, "Expr"], ...] = ()
231
+ loc: Loc | None = None
232
+
233
+
234
+ @dataclass
235
+ class BinOp:
236
+ """Binary operation."""
237
+ kind: str = field(default="BinOp", init=False)
238
+ op: BinOpKind = BinOpKind.ADD
239
+ lhs: "Expr" = None # type: ignore[assignment]
240
+ rhs: "Expr" = None # type: ignore[assignment]
241
+ loc: Loc | None = None
242
+
243
+
244
+ @dataclass
245
+ class UnaryOp:
246
+ """Unary operation."""
247
+ kind: str = field(default="UnaryOp", init=False)
248
+ op: UnaryOpKind = UnaryOpKind.POS
249
+ operand: "Expr" = None # type: ignore[assignment]
250
+ loc: Loc | None = None
251
+
252
+
253
+ @dataclass
254
+ class Attr:
255
+ """Field access: `target.ident`. The target is an arbitrary
256
+ expression; assignment-target shape (`p.x := v`) reuses this node
257
+ by appearing inside `Assign.targets`."""
258
+ kind: str = field(default="Attr", init=False)
259
+ target: "Expr" = None # type: ignore[assignment]
260
+ ident: str = ""
261
+ loc: Loc | None = None
262
+
263
+
264
+ @dataclass
265
+ class Subscript:
266
+ """Indexed access: `target[index]`. Plugins targeting languages
267
+ with non-zero-based indexing (Pascal, Fortran) compute the offset
268
+ in `index` at translate time -- lowering passes the index through
269
+ unchanged."""
270
+ kind: str = field(default="Subscript", init=False)
271
+ target: "Expr" = None # type: ignore[assignment]
272
+ index: "Expr" = None # type: ignore[assignment]
273
+ loc: Loc | None = None
274
+
275
+
276
+ @dataclass
277
+ class Compare:
278
+ """Comparison expression.
279
+
280
+ Supports Python-style chained form (`a < b < c`) via `ops` /
281
+ `comparators` of length > 1. Plugins from source languages without
282
+ comparison chaining (Pascal, most ALGOL-derived languages) always
283
+ emit length-1 op/comparator tuples.
284
+ """
285
+ kind: str = field(default="Compare", init=False)
286
+ lhs: "Expr" = None # type: ignore[assignment]
287
+ ops: tuple[CmpOpKind, ...] = ()
288
+ comparators: tuple["Expr", ...] = ()
289
+ loc: Loc | None = None
290
+
291
+
292
+ @dataclass
293
+ class SetLit:
294
+ """Set literal: `{a, b, c}`. Lowers to TpySetLiteral."""
295
+ kind: str = field(default="SetLit", init=False)
296
+ elements: tuple["Expr", ...] = ()
297
+ loc: Loc | None = None
298
+
299
+
300
+ @dataclass
301
+ class ListLit:
302
+ """List literal: `[a, b, c]`. Lowers to TpyArrayLiteral (which
303
+ is TPy's spelling for a Python list literal at the AST level)."""
304
+ kind: str = field(default="ListLit", init=False)
305
+ elements: tuple["Expr", ...] = ()
306
+ loc: Loc | None = None
307
+
308
+
309
+ @dataclass
310
+ class NoneLit:
311
+ """`None` literal -- the null/empty sentinel. Lowers to
312
+ TpyNoneLiteral. Used by plugins that translate a source-language
313
+ null (Pascal `nil`, etc.) to TPy's nullable form."""
314
+ kind: str = field(default="NoneLit", init=False)
315
+ loc: Loc | None = None
316
+
317
+
318
+ Expr = Union[StrLit, BoolLit, IntLit, FloatLit, Name, Call, BinOp, UnaryOp,
319
+ Compare, Attr, Subscript, SetLit, ListLit, NoneLit]
320
+
321
+
322
+ # --- Statements -----------------------------------------------------------
323
+
324
+
325
+ @dataclass
326
+ class ExprStmt:
327
+ """Expression statement (the expression's value is discarded)."""
328
+ kind: str = field(default="ExprStmt", init=False)
329
+ value: Expr = None # type: ignore[assignment]
330
+ loc: Loc | None = None
331
+
332
+
333
+ @dataclass
334
+ class VarDecl:
335
+ """Local or module-level variable declaration.
336
+
337
+ `mutable=False` marks a constant -- lowering folds those onto TPy's
338
+ `Final[...]` machinery (future milestones; M2 always emits
339
+ `mutable=True`).
340
+ """
341
+ kind: str = field(default="VarDecl", init=False)
342
+ name: str = ""
343
+ type: TypeExpr | None = None
344
+ init: Expr | None = None
345
+ mutable: bool = True
346
+ loc: Loc | None = None
347
+
348
+
349
+ @dataclass
350
+ class Assign:
351
+ """Assignment statement.
352
+
353
+ `targets` mirrors Python's chained-assignment shape (`a = b = ...`).
354
+ M2 only emits single-target assigns; chaining lands later.
355
+ """
356
+ kind: str = field(default="Assign", init=False)
357
+ targets: tuple[Expr, ...] = ()
358
+ value: Expr = None # type: ignore[assignment]
359
+ loc: Loc | None = None
360
+
361
+
362
+ @dataclass
363
+ class If:
364
+ """`if cond then-body else else-body`. `else_body` is `()` when
365
+ there is no else clause."""
366
+ kind: str = field(default="If", init=False)
367
+ cond: Expr = None # type: ignore[assignment]
368
+ then_body: tuple["Stmt", ...] = ()
369
+ else_body: tuple["Stmt", ...] = ()
370
+ loc: Loc | None = None
371
+
372
+
373
+ @dataclass
374
+ class While:
375
+ """`while cond: body`."""
376
+ kind: str = field(default="While", init=False)
377
+ cond: Expr = None # type: ignore[assignment]
378
+ body: tuple["Stmt", ...] = ()
379
+ loc: Loc | None = None
380
+
381
+
382
+ @dataclass
383
+ class RepeatUntil:
384
+ """`repeat body until cond`. Body runs once unconditionally; then
385
+ cond is evaluated and the loop continues while cond is *false*."""
386
+ kind: str = field(default="RepeatUntil", init=False)
387
+ body: tuple["Stmt", ...] = ()
388
+ cond: Expr = None # type: ignore[assignment]
389
+ loc: Loc | None = None
390
+
391
+
392
+ @dataclass
393
+ class ForRange:
394
+ """Numeric for loop with explicit endpoints.
395
+
396
+ Mirrors Pascal `for i := lo to hi do` / `for i := hi downto lo do`.
397
+ `inclusive` is True when both endpoints are visited (the Pascal
398
+ convention); future plugins targeting C-style half-open ranges can
399
+ set it False without breaking lowering.
400
+ """
401
+ kind: str = field(default="ForRange", init=False)
402
+ var: str = ""
403
+ start: Expr = None # type: ignore[assignment]
404
+ end: Expr = None # type: ignore[assignment]
405
+ direction: RangeDir = RangeDir.ASC
406
+ inclusive: bool = True
407
+ body: tuple["Stmt", ...] = ()
408
+ loc: Loc | None = None
409
+
410
+
411
+ @dataclass
412
+ class ForEach:
413
+ """For-each loop over an iterable. Plugins that lower their language's
414
+ sequence iteration to TPy's for-in idiom use this directly; M3 only
415
+ emits `ForRange` (Pascal has no for-in), but `ForEach` lands here
416
+ so the IR is complete for later milestones (arrays/lists in M5+).
417
+ """
418
+ kind: str = field(default="ForEach", init=False)
419
+ var: str = ""
420
+ iter: Expr = None # type: ignore[assignment]
421
+ body: tuple["Stmt", ...] = ()
422
+ loc: Loc | None = None
423
+
424
+
425
+ # --- Match patterns ------------------------------------------------------
426
+
427
+
428
+ @dataclass
429
+ class MatchValue:
430
+ """Literal value pattern: `case 42:` / `case "x":`."""
431
+ kind: str = field(default="MatchValue", init=False)
432
+ value: Expr = None # type: ignore[assignment]
433
+ loc: Loc | None = None
434
+
435
+
436
+ @dataclass
437
+ class MatchWildcard:
438
+ """Wildcard / `else` pattern: matches anything."""
439
+ kind: str = field(default="MatchWildcard", init=False)
440
+ loc: Loc | None = None
441
+
442
+
443
+ @dataclass
444
+ class MatchClass:
445
+ """Class pattern: `case ClassName() [as bind]`. Used by plugins
446
+ (e.g. Pascal variant records) to narrow a union-typed subject to
447
+ one of its alternative classes. The bound name (if set) lets the
448
+ arm body reach the narrowed value's fields without an explicit
449
+ cast."""
450
+ kind: str = field(default="MatchClass", init=False)
451
+ class_name: str = ""
452
+ bind: str | None = None
453
+ loc: Loc | None = None
454
+
455
+
456
+ MatchPattern = Union[MatchValue, MatchWildcard, MatchClass]
457
+
458
+
459
+ @dataclass
460
+ class MatchCase:
461
+ """A single case arm in a `Match`."""
462
+ pattern: MatchPattern = None # type: ignore[assignment]
463
+ guard: Expr | None = None
464
+ body: tuple["Stmt", ...] = ()
465
+ loc: Loc | None = None
466
+
467
+
468
+ @dataclass
469
+ class Return:
470
+ """Return statement. `value=None` for procedure-style returns."""
471
+ kind: str = field(default="Return", init=False)
472
+ value: Expr | None = None
473
+ loc: Loc | None = None
474
+
475
+
476
+ @dataclass
477
+ class Raise:
478
+ """`raise <expr>` -- throw an exception. `value=None` for the
479
+ bare-`raise` re-raise form. Plugins emitting accessor methods
480
+ that need a "this variant isn't live" panic use this with a
481
+ `RuntimeError(...)` constructor as the value."""
482
+ kind: str = field(default="Raise", init=False)
483
+ value: Expr | None = None
484
+ loc: Loc | None = None
485
+
486
+
487
+ @dataclass
488
+ class Match:
489
+ """`match subject: case ...` -- the single switch construct.
490
+
491
+ Pascal `case x of v1: stmt; v2: stmt; else stmt end` lowers here
492
+ with one `MatchCase(MatchValue)` per arm plus an optional
493
+ `MatchCase(MatchWildcard)` for the `else` branch.
494
+ """
495
+ kind: str = field(default="Match", init=False)
496
+ subject: Expr = None # type: ignore[assignment]
497
+ cases: tuple[MatchCase, ...] = ()
498
+ loc: Loc | None = None
499
+
500
+
501
+ @dataclass
502
+ class Break:
503
+ """`break` -- exit the innermost enclosing loop. Loop nesting is
504
+ determined by the lowered TpyModule's structure, the same way
505
+ Python source `break` resolves."""
506
+ kind: str = field(default="Break", init=False)
507
+ loc: Loc | None = None
508
+
509
+
510
+ @dataclass
511
+ class Continue:
512
+ """`continue` -- skip to the next iteration of the innermost
513
+ enclosing loop."""
514
+ kind: str = field(default="Continue", init=False)
515
+ loc: Loc | None = None
516
+
517
+
518
+ Stmt = Union[ExprStmt, VarDecl, Assign, If, While, RepeatUntil,
519
+ ForRange, ForEach, Match, Return, Raise, Break, Continue]
520
+
521
+
522
+ # --- Enum declarations ---------------------------------------------------
523
+
524
+
525
+ @dataclass
526
+ class EnumValue:
527
+ """One member of an `Enum`. `value` is optional -- when absent, the
528
+ lowering pass assigns Pascal-style auto-numbered values starting
529
+ at 0."""
530
+ name: str = ""
531
+ value: "Expr | None" = None
532
+ decorators: tuple = ()
533
+ loc: Loc | None = None
534
+
535
+
536
+ @dataclass
537
+ class Enum:
538
+ """Enumeration type declaration."""
539
+ kind: str = field(default="Enum", init=False)
540
+ name: str = ""
541
+ base_type: "NamedType | None" = None
542
+ values: tuple[EnumValue, ...] = ()
543
+ decorators: tuple = ()
544
+ loc: Loc | None = None
545
+
546
+
547
+ # --- Record declarations -------------------------------------------------
548
+
549
+
550
+ @dataclass
551
+ class Field:
552
+ """One field on a `Record`. M5 only emits unsubscripted,
553
+ default-less fields; record methods / generic fields / decorators
554
+ are reserved for future milestones."""
555
+ name: str = ""
556
+ type: TypeExpr = None # type: ignore[assignment]
557
+ default: "Expr | None" = None
558
+ decorators: tuple = ()
559
+ loc: Loc | None = None
560
+
561
+
562
+ @dataclass
563
+ class Record:
564
+ """Record (class) declaration.
565
+
566
+ M5 carries only `name` and `fields` -- single inheritance, methods,
567
+ nested records / enums / aliases, decorators, and generic type
568
+ params land in later milestones but the slots stay so plugins can
569
+ grow into them.
570
+ """
571
+ kind: str = field(default="Record", init=False)
572
+ name: str = ""
573
+ type_params: tuple = ()
574
+ base: "NamedType | None" = None
575
+ fields: tuple[Field, ...] = ()
576
+ methods: tuple = ()
577
+ nested_records: tuple = ()
578
+ nested_enums: tuple = ()
579
+ nested_constants: tuple = ()
580
+ nested_aliases: tuple = ()
581
+ decorators: tuple = ()
582
+ loc: Loc | None = None
583
+
584
+
585
+ # --- Function declarations -----------------------------------------------
586
+
587
+
588
+ @dataclass
589
+ class Param:
590
+ """A function parameter. M4 only emits unsubscripted, default-less
591
+ params; defaults / *args / **kwargs are reserved for future
592
+ milestones."""
593
+ name: str = ""
594
+ type: TypeExpr = None # type: ignore[assignment]
595
+ default: Expr | None = None
596
+ loc: Loc | None = None
597
+
598
+
599
+ @dataclass
600
+ class Function:
601
+ """Top-level function declaration.
602
+
603
+ `is_method=False` for M4 -- methods on records land with M5. The
604
+ field is kept on the node so lowering can route correctly once
605
+ records exist. `type_params` and `decorators` are reserved for
606
+ future milestones.
607
+
608
+ Property accessors (`is_property_getter` / `is_property_setter`)
609
+ let a plugin emit `@property` getter/setter pairs without going
610
+ through decorator-string round-trip; the IR lowering threads
611
+ these directly onto the resulting `TpyFunction`. `property_name`
612
+ on a setter names the property the setter belongs to (e.g. for
613
+ `@foo.setter`, `property_name == 'foo'`).
614
+ """
615
+ kind: str = field(default="Function", init=False)
616
+ name: str = ""
617
+ type_params: tuple = ()
618
+ params: tuple[Param, ...] = ()
619
+ return_type: TypeExpr | None = None
620
+ body: tuple[Stmt, ...] = ()
621
+ decorators: tuple = ()
622
+ is_method: bool = False
623
+ is_property_getter: bool = False
624
+ is_property_setter: bool = False
625
+ property_name: str | None = None
626
+ loc: Loc | None = None
627
+
628
+
629
+ # --- Imports --------------------------------------------------------------
630
+
631
+
632
+ @dataclass
633
+ class ImportName:
634
+ """A name imported via `from X import Y as Z`. `local` equals
635
+ `original` when there is no `as` clause."""
636
+ original: str
637
+ local: str
638
+
639
+
640
+ @dataclass
641
+ class Import:
642
+ """`import M [as A]`."""
643
+ kind: str = field(default="Import", init=False)
644
+ module: str = ""
645
+ alias: str | None = None
646
+ loc: Loc | None = None
647
+
648
+
649
+ @dataclass
650
+ class FromImport:
651
+ """`from M import a [as b], c, ...`."""
652
+ kind: str = field(default="FromImport", init=False)
653
+ module: str = ""
654
+ names: tuple[ImportName, ...] = ()
655
+ loc: Loc | None = None
656
+
657
+
658
+ @dataclass
659
+ class StarImport:
660
+ """`from M import *` -- bring every public name from `M` into the
661
+ importer's unqualified scope. Powers Pascal `uses A, B, C` and any
662
+ other source language with similar wildcard-import semantics. The
663
+ importer-side names list is resolved at compile time by TPy's
664
+ `_expand_star_imports_for_module`, which reads `M`'s public
665
+ surface from its module attribute table.
666
+ """
667
+ kind: str = field(default="StarImport", init=False)
668
+ module: str = ""
669
+ loc: Loc | None = None
670
+
671
+
672
+ ImportDecl = Union[Import, FromImport, StarImport]
673
+
674
+
675
+ # --- Directives -----------------------------------------------------------
676
+
677
+
678
+ @dataclass
679
+ class FrontendDirectives:
680
+ """Module-level directives.
681
+
682
+ Mirrors `tpyc.parse.nodes.ModuleDirectives`. M1 leaves everything at
683
+ its default; only relevant when a plugin emits native C++ includes,
684
+ link libs, or marks itself as a native binding module.
685
+ """
686
+ cpp_includes: tuple[tuple[str, str | None], ...] = () # (header, platform_filter)
687
+ link_libs: tuple[tuple[str, str | None], ...] = ()
688
+ third_party_deps: tuple[tuple[str, str | None], ...] = ()
689
+ native_module: bool = False
690
+ cpp_namespace: str | None = None
691
+
692
+
693
+ # --- Module ---------------------------------------------------------------
694
+
695
+
696
+ @dataclass
697
+ class FrontendModule:
698
+ """A frontend IR module.
699
+
700
+ The plugin's `parse()` returns one of these. Lowering converts it
701
+ into a `tpyc.parse.nodes.TpyModule`.
702
+
703
+ M1 carries only top-level statements + imports. Records, enums,
704
+ functions, type aliases, constants are typed as empty tuples now
705
+ and populated by later milestones.
706
+ """
707
+ api_version: int = API_VERSION
708
+ qname: str = ""
709
+ source_language: str = ""
710
+ source_lines: tuple[str, ...] = ()
711
+ imports: tuple[ImportDecl, ...] = ()
712
+ type_aliases: tuple = ()
713
+ constants: tuple = ()
714
+ enums: tuple["Enum", ...] = ()
715
+ records: tuple["Record", ...] = ()
716
+ functions: tuple["Function", ...] = ()
717
+ top_level_stmts: tuple[Stmt, ...] = ()
718
+ directives: FrontendDirectives = field(default_factory=FrontendDirectives)