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,466 @@
1
+ """Parser-output ref resolution walker.
2
+
3
+ Resolves every `TypeRefNode` the parser emitted at annotation sites to a
4
+ concrete `TpyType`, in place on the `TpyModule`. Runs once per module
5
+ (between import canonicalization and sema) and leaves the AST with
6
+ TpyType invariants (`map_inner_types`, `isinstance` against structural
7
+ classes, etc.) everywhere.
8
+
9
+ Covers every module-level annotation site: type aliases, top-level
10
+ `TpyVarDecl`, function / overload-group signatures, type-parameter
11
+ bounds, record fields / bases / methods / self, protocol fields and
12
+ method signatures, and expression-level type uses inside bodies.
13
+ Nested defs and macro-fragment functions are resolved eagerly at parse
14
+ time (`parser._finalize_function_refs` / `_parse_method`) and are not
15
+ re-walked here.
16
+
17
+ The walker uses `module.resolver` (a `TypeResolver` constructed by the
18
+ parser) as the only authority for name binding. Field-default
19
+ inference for class-body `name = expr` assignments reuses the resolver
20
+ for record lookups, so no sema context is needed.
21
+ """
22
+ from __future__ import annotations
23
+
24
+ from typing import TYPE_CHECKING
25
+
26
+ from ..typesys import (
27
+ TpyType, NominalType, UnionType, VOID, TypeParamKind,
28
+ TypeAliasInfo,
29
+ BIGINT, FLOAT, STR,
30
+ )
31
+ from ..typesys import _contains_self_reference
32
+ from .nodes import (
33
+ TpyModule, TpyVarDecl, TpyCall, TpyMethodCall, TpyNestedDef,
34
+ TpyTypeRef, TpyUnionRef, TpyCallableRef, TpyLiteralRef,
35
+ TpyInferFromDefaultRef, ParseError, ResolutionFailure,
36
+ TpyIntLiteral, TpyFloatLiteral, TpyStrLiteral, TpyName,
37
+ SourceLocation,
38
+ )
39
+ from .type_resolver import _FIXED_INT_MAP
40
+ from ..diagnostics import SemanticError
41
+
42
+ if TYPE_CHECKING:
43
+ from .nodes import TpyExpr
44
+ from .type_resolver import TypeResolver
45
+
46
+ _REF_TYPES = (TpyTypeRef, TpyUnionRef, TpyCallableRef, TpyLiteralRef)
47
+
48
+
49
+ def promote_bare_nominals(typ: TpyType, registry) -> TpyType:
50
+ """Return `typ` with every bare `NominalType` whose short name
51
+ resolves in `registry` replaced by its qname-bearing counterpart.
52
+ Recurses into structural wrappers. Closes the bridge from macro-
53
+ emitted `types.named("Foo")` placeholders to the strict-equality
54
+ NominalType identity sema/codegen downstream relies on.
55
+ """
56
+ if isinstance(typ, NominalType) and typ._module_qname is None:
57
+ info = registry.get_record(typ.name)
58
+ if info is not None:
59
+ qname = info.qualified_name()
60
+ if qname:
61
+ typ = NominalType(
62
+ typ.name, typ.type_args, typ.is_protocol,
63
+ qname, typ.is_dynamic_protocol,
64
+ )
65
+ return typ.map_inner_types(lambda t: promote_bare_nominals(t, registry))
66
+
67
+
68
+ def _infer_field_type_from_default(
69
+ expr: 'TpyExpr | None', resolver: 'TypeResolver',
70
+ ) -> TpyType | None:
71
+ """Infer a field type from its default-value expression.
72
+
73
+ Handles:
74
+ - int / float / str literals -> BIGINT / FLOAT / STR.
75
+ - Fixed-int constructor calls (`Int32(...)`, ...) -> the matching
76
+ singleton.
77
+ - `int()` / `float()` -> BIGINT / FLOAT.
78
+ - Calls to a resolvable record / protocol / enum name (same-module
79
+ or imported via the canonicalized import table) -> qname-
80
+ bearing NominalType.
81
+
82
+ Returns None if the expression does not match any recognised form;
83
+ the caller raises "Cannot infer type for field 'X'".
84
+ """
85
+ if expr is None:
86
+ return None
87
+ if isinstance(expr, TpyIntLiteral):
88
+ return BIGINT
89
+ if isinstance(expr, TpyFloatLiteral):
90
+ return FLOAT
91
+ if isinstance(expr, TpyStrLiteral):
92
+ return STR
93
+ if not (isinstance(expr, TpyCall) and isinstance(expr.func, TpyName)):
94
+ return None
95
+ type_name = expr.func_name
96
+ if (fixed_int := _FIXED_INT_MAP.get(type_name)) is not None:
97
+ return fixed_int
98
+ if type_name == "int":
99
+ return BIGINT
100
+ if type_name == "float":
101
+ return FLOAT
102
+ # Route through the resolver: it consults both the parser's
103
+ # registry (same-module records) and the canonicalized import
104
+ # table (cross-module records), minting `_module_qname` uniformly.
105
+ try:
106
+ resolved = resolver.resolve(TpyTypeRef(type_name))
107
+ except (ParseError, ResolutionFailure):
108
+ return None
109
+ if isinstance(resolved, NominalType):
110
+ return resolved
111
+ return None
112
+
113
+
114
+ def _func_scope(func):
115
+ """Build a `{name: TypeParamKind}` scope dict for a TpyFunction or
116
+ `None` if it has no type params."""
117
+ if not func.type_params:
118
+ return None
119
+ kinds = func.type_param_kinds
120
+ return {
121
+ name: (kinds[i] if i < len(kinds) else TypeParamKind.TYPE)
122
+ for i, name in enumerate(func.type_params)
123
+ }
124
+
125
+
126
+ def _record_scope(record):
127
+ if not record.type_params:
128
+ return None
129
+ kinds = record.type_param_kinds
130
+ return {
131
+ name: (kinds[i] if i < len(kinds) else TypeParamKind.TYPE)
132
+ for i, name in enumerate(record.type_params)
133
+ }
134
+
135
+
136
+ def _merged_method_scope(record_scope, method):
137
+ """Record type params + method type params, method-level wins on collision."""
138
+ if not method.type_params:
139
+ return record_scope
140
+ merged = dict(record_scope) if record_scope else {}
141
+ method_kinds = method.type_param_kinds
142
+ for i, name in enumerate(method.type_params):
143
+ kind = method_kinds[i] if i < len(method_kinds) else TypeParamKind.TYPE
144
+ merged[name] = kind
145
+ return merged
146
+
147
+
148
+ def _protocol_scope(protocol):
149
+ """Protocols only carry TYPE-kind type params (parser constraint)."""
150
+ if not protocol.type_params:
151
+ return None
152
+ return {name: TypeParamKind.TYPE for name in protocol.type_params}
153
+
154
+
155
+ def _resolve_value_position(resolver, t, scope=None, *, pending_alias=None):
156
+ """Resolve a value-bearing annotation slot.
157
+
158
+ Every annotation slot except the function-return slot is a value
159
+ position, so bare `None` lowers to NoneType -> std::monostate.
160
+ Used at function params / varargs / kwargs / self / fields / bases /
161
+ bounds / local variables / type-alias bodies / call-site type args.
162
+ Non-ref inputs pass through unchanged.
163
+ """
164
+ if isinstance(t, _REF_TYPES):
165
+ return resolver.resolve(t, scope, pending_alias=pending_alias, is_type_arg=True)
166
+ return t
167
+
168
+
169
+ def _resolve_return_slot(resolver, t, scope=None):
170
+ """Resolve a function-return slot.
171
+
172
+ Bare `None` stays VoidType -> `void` (the function-returns-nothing
173
+ semantic) -- distinct from `None` at value-bearing slots (handled
174
+ by `_resolve_value_position`). The parser emits `None` for an
175
+ absent return annotation; substitute VOID so downstream readers
176
+ see a concrete TpyType.
177
+ """
178
+ if t is None:
179
+ return VOID
180
+ if isinstance(t, _REF_TYPES):
181
+ return resolver.resolve(t, scope)
182
+ return t
183
+
184
+
185
+ def resolve_method_body_refs(method, record, resolver, *, promote_registry=None) -> None:
186
+ """Resolve all TypeRefNodes in a record method's body (TpyVarDecl
187
+ annotations, `TpyCall.call_type`, `TpyCall.type_args`,
188
+ `TpyMethodCall.type_args`).
189
+
190
+ Called by sema's `register_record` after `_apply_class_macros` so
191
+ macro-added methods get the same treatment source-defined methods
192
+ received during the module-level `resolve_refs` walk. Idempotent:
193
+ already-resolved sites fall through the walker's isinstance checks
194
+ unchanged.
195
+
196
+ `promote_registry` (optional) is consulted to promote bare
197
+ `NominalType` placeholders left behind by `types.named(...)` macro
198
+ calls. Callers from sema pass `ctx.registry` so imported records
199
+ are visible.
200
+ """
201
+ scope = _merged_method_scope(_record_scope(record), method)
202
+ _walk_body(method.body, scope, resolver, promote_registry=promote_registry)
203
+
204
+
205
+ def _walk_body(stmts, call_scope, resolver, *, promote_registry=None):
206
+ """Body walker extracted so both `resolve_refs` and
207
+ `resolve_method_body_refs` share the same traversal.
208
+
209
+ `promote_registry`, when provided, is used to upgrade bare
210
+ `NominalType("Foo")` placeholders (left behind by macro-emitted
211
+ `types.named("Foo")`) to their qname-bearing counterparts so
212
+ strict `NominalType` equality holds downstream.
213
+ """
214
+ for stmt in stmts:
215
+ if isinstance(stmt, TpyVarDecl) and stmt.type is not None:
216
+ if isinstance(stmt.type, _REF_TYPES):
217
+ stmt.type = _resolve_value_position(resolver, stmt.type, call_scope)
218
+ elif promote_registry is not None:
219
+ # Only promote bare NominalTypes when sema explicitly
220
+ # asks (post-macro-deps pass). Parse-time walks use
221
+ # `promote_registry=None` so we don't traverse every
222
+ # already-resolved type on every module-level walk.
223
+ stmt.type = promote_bare_nominals(stmt.type, promote_registry)
224
+ for expr in stmt.exprs():
225
+ _walk_expr_calls(expr, call_scope, resolver)
226
+ for body in stmt.sub_bodies():
227
+ _walk_body(body, call_scope, resolver, promote_registry=promote_registry)
228
+ # TpyNestedDef inherits `sub_bodies() -> []` from TpyStmt, so the
229
+ # loop above is a no-op for nested defs -- the body must be
230
+ # walked here explicitly, under the nested function's own scope.
231
+ if isinstance(stmt, TpyNestedDef):
232
+ # Nested def signatures are resolved at parse time (before
233
+ # the compiler canonicalizes cross-module imports), so any
234
+ # imported-record param types land as bare NominalTypes.
235
+ # Promote them now that `promote_registry` has the full
236
+ # cross-module picture.
237
+ if promote_registry is not None:
238
+ stmt.func.params = [
239
+ (n, promote_bare_nominals(t, promote_registry))
240
+ for n, t in stmt.func.params
241
+ ]
242
+ if stmt.func.return_type is not None:
243
+ stmt.func.return_type = promote_bare_nominals(
244
+ stmt.func.return_type, promote_registry)
245
+ if stmt.func.vararg_type is not None:
246
+ stmt.func.vararg_type = promote_bare_nominals(
247
+ stmt.func.vararg_type, promote_registry)
248
+ if stmt.func.kwarg_type is not None:
249
+ stmt.func.kwarg_type = promote_bare_nominals(
250
+ stmt.func.kwarg_type, promote_registry)
251
+ nested_scope = _func_scope(stmt.func) or call_scope
252
+ _walk_body(stmt.func.body, nested_scope, resolver, promote_registry=promote_registry)
253
+
254
+
255
+ def _walk_expr_calls(expr, call_scope, resolver):
256
+ if isinstance(expr, TpyCall):
257
+ if isinstance(expr.call_type, _REF_TYPES):
258
+ # Parser catches structural errors at parse time; here we
259
+ # catch name-resolution errors silently to match pre-flip
260
+ # behaviour (sema falls back to type_args / subscript_callee
261
+ # when the name isn't a type).
262
+ try:
263
+ expr.call_type = resolver.resolve(expr.call_type, call_scope)
264
+ except ParseError:
265
+ expr.call_type = None
266
+ _walk_type_args(expr, call_scope, resolver)
267
+ elif isinstance(expr, TpyMethodCall):
268
+ _walk_type_args(expr, call_scope, resolver)
269
+ for child in expr.children():
270
+ _walk_expr_calls(child, call_scope, resolver)
271
+
272
+
273
+ def _walk_type_args(expr, call_scope, resolver):
274
+ """Resolve TypeRefNode elements in expr.type_args. On any element
275
+ failure, drop the whole tuple and propagate the error message
276
+ through `type_args_parse_error` so sema's generic-call validator
277
+ reports it."""
278
+ if not expr.type_args:
279
+ return
280
+ new_args = []
281
+ for ta in expr.type_args:
282
+ if isinstance(ta, _REF_TYPES):
283
+ try:
284
+ new_args.append(_resolve_value_position(resolver, ta, call_scope))
285
+ except ParseError as e:
286
+ expr.type_args = ()
287
+ if expr.type_args_parse_error is None:
288
+ expr.type_args_parse_error = e.message
289
+ return
290
+ else:
291
+ new_args.append(ta)
292
+ expr.type_args = tuple(new_args)
293
+
294
+ def resolve_refs(module: TpyModule) -> None:
295
+ """Resolve every TypeRefNode in `module` to TpyType in place.
296
+
297
+ `TpyInferFromDefaultRef` field markers (class-body `name = expr`
298
+ without a type annotation) are handled inline via
299
+ `_infer_field_type_from_default`; it returns a TpyType or None,
300
+ the latter triggering a "Cannot infer type" SemanticError at the
301
+ field's loc.
302
+ """
303
+ resolver = module.resolver
304
+ if resolver is None:
305
+ raise SemanticError(
306
+ "TypeRefNode encountered but no parser resolver is attached "
307
+ "(module was not produced by the current-phase Parser)"
308
+ )
309
+
310
+ # Resolver-bound thin wrappers so the internal callsites below stay
311
+ # terse; the policy lives on the module-level helpers
312
+ # `_resolve_value_position` / `_resolve_return_slot`.
313
+ def _resolve(t, scope=None):
314
+ return _resolve_value_position(resolver, t, scope)
315
+
316
+ def _resolve_return_type(t, scope=None):
317
+ return _resolve_return_slot(resolver, t, scope)
318
+
319
+ # A bound may name a protocol (`T: Comparable`) or an enclosing/sibling
320
+ # type param (`U: T` -- a subtype bound for representational coercion).
321
+ # Resolve under the owner's type-param scope so the latter becomes a
322
+ # TypeParamRef rather than failing as an unknown type.
323
+ def _resolve_bounds(bounds, scope=None):
324
+ if not bounds:
325
+ return bounds
326
+ return {name: _resolve(t, scope) for name, t in bounds.items()}
327
+
328
+ # Type alias RHS: resolve in declaration order, passing
329
+ # `pending_alias=alias_name` to the resolver so same-body self-
330
+ # references produce a `NominalType(name)` placeholder. Register
331
+ # each resolved alias in the registry immediately so later alias
332
+ # bodies can find it by name. Recursive unions are detected post-
333
+ # resolution.
334
+ if module.type_aliases:
335
+ resolved_aliases: 'dict[str, tuple[TpyType, SourceLocation | None, list[str], list[TypeParamKind]]]' = {}
336
+ for alias_name, entry in module.type_aliases.items():
337
+ alias_ref, alias_loc, alias_type_params, alias_type_param_kinds = entry
338
+ # Generic-alias scope: bind `T` (etc.) so the body resolves
339
+ # `T` to a TypeParamRef instead of failing with "Unknown
340
+ # type: T". Empty scope for non-generic aliases.
341
+ alias_scope = (
342
+ dict(zip(alias_type_params, alias_type_param_kinds))
343
+ if alias_type_params else None
344
+ )
345
+ alias_type = _resolve_value_position(
346
+ resolver, alias_ref, alias_scope, pending_alias=alias_name)
347
+ # Tag self-referential aliases as recursive; the indirection
348
+ # check itself runs later in sema (`_validate_recursive_union_paths`)
349
+ # so it can see same-module RecordInfo / TypeDef entries that
350
+ # `register_records_and_protocols` hasn't attached yet.
351
+ #
352
+ # A self-referential alias (generic or not) must use a union form
353
+ # so the compiler can emit a variant-backed wrapper struct. Bare
354
+ # non-union self-recursion (`type Foo = list[Foo]`,
355
+ # `type Bag[T] = list[Bag[T]]`, or `type Outer = Pair[Outer]` where
356
+ # Pair's substitution reintroduces the self-reference) has no
357
+ # wrapper-struct path and would emit ill-formed C++
358
+ # (`using Foo = std::vector<Foo>;` with Foo incomplete). Reject it
359
+ # cleanly at parse-resolution.
360
+ if _contains_self_reference(alias_type, alias_name):
361
+ if isinstance(alias_type, UnionType):
362
+ module.recursive_union_names.add(alias_name)
363
+ else:
364
+ raise ParseError(
365
+ f"Recursive type alias '{alias_name}' must use a "
366
+ f"union form (e.g. `type {alias_name} = SomeBaseType "
367
+ f"| list[{alias_name}]`) so the compiler can emit a "
368
+ f"wrapper struct. Bare non-union self-recursion "
369
+ f"(`type {alias_name} = list[{alias_name}]`) is not "
370
+ f"supported.",
371
+ loc=alias_loc,
372
+ )
373
+ # Pass the full TypeAliasInfo so generic-alias use sites
374
+ # (which run after this loop) can detect type_params via
375
+ # `get_type_alias_info` and emit the v1 placeholder error.
376
+ alias_info = TypeAliasInfo(
377
+ body=alias_type,
378
+ type_params=list(alias_type_params),
379
+ type_param_kinds=list(alias_type_param_kinds),
380
+ loc=alias_loc,
381
+ is_recursive=alias_name in module.recursive_union_names,
382
+ )
383
+ resolver.registry.register_type_alias(
384
+ alias_name, alias_type, info=alias_info,
385
+ )
386
+ resolved_aliases[alias_name] = (alias_type, alias_loc, alias_type_params, alias_type_param_kinds)
387
+ module.type_aliases = resolved_aliases
388
+
389
+ # Top-level functions (methods are resolved in the record loop
390
+ # below; nested defs are eagerly resolved at parse time).
391
+ for func in module.functions:
392
+ scope = _func_scope(func)
393
+ func.params = [(n, _resolve(t, scope)) for (n, t) in func.params]
394
+ func.return_type = _resolve_return_type(func.return_type, scope)
395
+ if func.vararg_type is not None:
396
+ func.vararg_type = _resolve(func.vararg_type, scope)
397
+ if func.kwarg_type is not None:
398
+ func.kwarg_type = _resolve(func.kwarg_type, scope)
399
+ func.type_param_bounds = _resolve_bounds(func.type_param_bounds, scope)
400
+
401
+ # All records (including nested) -- fields, methods, bases. Record
402
+ # methods use a merged scope (record type params + method type
403
+ # params) when resolving param / return / vararg refs; self is also
404
+ # resolved here so `method_expansion` sees TpyType. Bases resolve
405
+ # here too, so sema's own class-body validation runs after any
406
+ # base-resolution error would surface.
407
+ for record in module.all_records():
408
+ scope = _record_scope(record)
409
+ record.type_param_bounds = _resolve_bounds(record.type_param_bounds, scope)
410
+ record.bases = [_resolve(b, scope) for b in record.bases]
411
+ for fld in record.fields:
412
+ if isinstance(fld.type, TpyInferFromDefaultRef):
413
+ # Parser emits this marker for bare `name = expr`
414
+ # class-body assignments; infer from the parsed default
415
+ # expression, raising only on genuine failure.
416
+ inferred = _infer_field_type_from_default(fld.default_expr, resolver)
417
+ if inferred is None:
418
+ raise SemanticError(
419
+ f"Cannot infer type for field '{fld.name}'",
420
+ loc=fld.type.loc,
421
+ )
422
+ fld.type = inferred
423
+ else:
424
+ fld.type = _resolve(fld.type, scope)
425
+ for method in record.methods:
426
+ method_scope = _merged_method_scope(scope, method)
427
+ method.params = [(n, _resolve(t, method_scope)) for (n, t) in method.params]
428
+ method.return_type = _resolve_return_type(method.return_type, method_scope)
429
+ if method.vararg_type is not None:
430
+ method.vararg_type = _resolve(method.vararg_type, method_scope)
431
+ if method.self_annotation is not None:
432
+ method.self_annotation = _resolve(method.self_annotation, method_scope)
433
+ if method.kwarg_type is not None:
434
+ method.kwarg_type = _resolve(method.kwarg_type, method_scope)
435
+ method.type_param_bounds = _resolve_bounds(method.type_param_bounds, method_scope)
436
+
437
+ # Protocol MethodSignatures + field types: resolve under the
438
+ # protocol's own type-param scope.
439
+ for protocol in module.protocols:
440
+ scope = _protocol_scope(protocol)
441
+ protocol.parent_protocols = [
442
+ _resolve(p, scope) for p in protocol.parent_protocols
443
+ ]
444
+ protocol.fields = [
445
+ (fname, _resolve(ftype, scope)) for fname, ftype in protocol.fields
446
+ ]
447
+ for msig in protocol.methods:
448
+ msig.params = [(n, _resolve(t, scope)) for (n, t) in msig.params]
449
+ msig.return_type = _resolve_return_type(msig.return_type, scope)
450
+
451
+ # Top-level TpyVarDecls
452
+ for stmt in module.top_level_stmts:
453
+ if isinstance(stmt, TpyVarDecl) and stmt.type is not None:
454
+ stmt.type = _resolve(stmt.type)
455
+
456
+ # Resolve body-level type refs: in-body `TpyVarDecl.type`
457
+ # annotations, `TpyCall.call_type`, `TpyCall.type_args`,
458
+ # `TpyMethodCall.type_args`. Shared walker with
459
+ # `resolve_method_body_refs` (used for macro-added methods).
460
+ for func in module.functions:
461
+ _walk_body(func.body, _func_scope(func), resolver)
462
+ for record in module.all_records():
463
+ rscope = _record_scope(record)
464
+ for method in record.methods:
465
+ _walk_body(method.body, _merged_method_scope(rscope, method), resolver)
466
+ _walk_body(module.top_level_stmts, None, resolver)