rbs-relaxed 3.9.0.1

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 (484) hide show
  1. checksums.yaml +7 -0
  2. data/.github/dependabot.yml +22 -0
  3. data/.github/workflows/comments.yml +35 -0
  4. data/.github/workflows/dependabot.yml +30 -0
  5. data/.github/workflows/ruby.yml +82 -0
  6. data/.github/workflows/typecheck.yml +38 -0
  7. data/.github/workflows/windows.yml +43 -0
  8. data/.gitignore +23 -0
  9. data/.rubocop.yml +68 -0
  10. data/BSDL +22 -0
  11. data/CHANGELOG.md +1868 -0
  12. data/COPYING +56 -0
  13. data/README.md +203 -0
  14. data/Rakefile +417 -0
  15. data/Steepfile +44 -0
  16. data/config.yml +313 -0
  17. data/core/array.rbs +4062 -0
  18. data/core/basic_object.rbs +375 -0
  19. data/core/binding.rbs +150 -0
  20. data/core/builtin.rbs +277 -0
  21. data/core/class.rbs +220 -0
  22. data/core/comparable.rbs +171 -0
  23. data/core/complex.rbs +786 -0
  24. data/core/constants.rbs +96 -0
  25. data/core/data.rbs +415 -0
  26. data/core/dir.rbs +981 -0
  27. data/core/encoding.rbs +1371 -0
  28. data/core/enumerable.rbs +2405 -0
  29. data/core/enumerator/product.rbs +92 -0
  30. data/core/enumerator.rbs +630 -0
  31. data/core/env.rbs +6 -0
  32. data/core/errno.rbs +673 -0
  33. data/core/errors.rbs +760 -0
  34. data/core/exception.rbs +485 -0
  35. data/core/false_class.rbs +82 -0
  36. data/core/fiber.rbs +550 -0
  37. data/core/fiber_error.rbs +11 -0
  38. data/core/file.rbs +2936 -0
  39. data/core/file_test.rbs +331 -0
  40. data/core/float.rbs +1151 -0
  41. data/core/gc.rbs +644 -0
  42. data/core/global_variables.rbs +184 -0
  43. data/core/hash.rbs +1861 -0
  44. data/core/integer.rbs +1413 -0
  45. data/core/io/buffer.rbs +984 -0
  46. data/core/io/wait.rbs +70 -0
  47. data/core/io.rbs +3406 -0
  48. data/core/kernel.rbs +3096 -0
  49. data/core/marshal.rbs +207 -0
  50. data/core/match_data.rbs +635 -0
  51. data/core/math.rbs +729 -0
  52. data/core/method.rbs +386 -0
  53. data/core/module.rbs +1704 -0
  54. data/core/nil_class.rbs +209 -0
  55. data/core/numeric.rbs +818 -0
  56. data/core/object.rbs +110 -0
  57. data/core/object_space/weak_key_map.rbs +166 -0
  58. data/core/object_space.rbs +190 -0
  59. data/core/proc.rbs +868 -0
  60. data/core/process.rbs +2296 -0
  61. data/core/ractor.rbs +1068 -0
  62. data/core/random.rbs +237 -0
  63. data/core/range.rbs +1107 -0
  64. data/core/rational.rbs +531 -0
  65. data/core/rb_config.rbs +88 -0
  66. data/core/rbs/unnamed/argf.rbs +1229 -0
  67. data/core/rbs/unnamed/env_class.rbs +1209 -0
  68. data/core/rbs/unnamed/random.rbs +293 -0
  69. data/core/refinement.rbs +59 -0
  70. data/core/regexp.rbs +1930 -0
  71. data/core/ruby_vm.rbs +765 -0
  72. data/core/rubygems/basic_specification.rbs +6 -0
  73. data/core/rubygems/config_file.rbs +38 -0
  74. data/core/rubygems/dependency_installer.rbs +6 -0
  75. data/core/rubygems/errors.rbs +176 -0
  76. data/core/rubygems/installer.rbs +15 -0
  77. data/core/rubygems/path_support.rbs +6 -0
  78. data/core/rubygems/platform.rbs +7 -0
  79. data/core/rubygems/request_set.rbs +49 -0
  80. data/core/rubygems/requirement.rbs +148 -0
  81. data/core/rubygems/rubygems.rbs +1171 -0
  82. data/core/rubygems/source_list.rbs +15 -0
  83. data/core/rubygems/specification.rbs +23 -0
  84. data/core/rubygems/stream_ui.rbs +5 -0
  85. data/core/rubygems/uninstaller.rbs +10 -0
  86. data/core/rubygems/version.rbs +294 -0
  87. data/core/set.rbs +621 -0
  88. data/core/signal.rbs +100 -0
  89. data/core/string.rbs +3583 -0
  90. data/core/struct.rbs +667 -0
  91. data/core/symbol.rbs +475 -0
  92. data/core/thread.rbs +1765 -0
  93. data/core/thread_group.rbs +79 -0
  94. data/core/time.rbs +1762 -0
  95. data/core/trace_point.rbs +477 -0
  96. data/core/true_class.rbs +98 -0
  97. data/core/unbound_method.rbs +329 -0
  98. data/core/warning.rbs +87 -0
  99. data/docs/CONTRIBUTING.md +106 -0
  100. data/docs/architecture.md +110 -0
  101. data/docs/collection.md +192 -0
  102. data/docs/data_and_struct.md +86 -0
  103. data/docs/gem.md +57 -0
  104. data/docs/rbs_by_example.md +309 -0
  105. data/docs/repo.md +125 -0
  106. data/docs/sigs.md +167 -0
  107. data/docs/stdlib.md +147 -0
  108. data/docs/syntax.md +910 -0
  109. data/docs/tools.md +17 -0
  110. data/exe/rbs +7 -0
  111. data/ext/rbs_extension/extconf.rb +15 -0
  112. data/ext/rbs_extension/lexer.c +2728 -0
  113. data/ext/rbs_extension/lexer.h +179 -0
  114. data/ext/rbs_extension/lexer.re +147 -0
  115. data/ext/rbs_extension/lexstate.c +175 -0
  116. data/ext/rbs_extension/location.c +325 -0
  117. data/ext/rbs_extension/location.h +85 -0
  118. data/ext/rbs_extension/main.c +33 -0
  119. data/ext/rbs_extension/parser.c +2973 -0
  120. data/ext/rbs_extension/parser.h +18 -0
  121. data/ext/rbs_extension/parserstate.c +397 -0
  122. data/ext/rbs_extension/parserstate.h +163 -0
  123. data/ext/rbs_extension/rbs_extension.h +31 -0
  124. data/ext/rbs_extension/unescape.c +32 -0
  125. data/goodcheck.yml +91 -0
  126. data/include/rbs/constants.h +82 -0
  127. data/include/rbs/ruby_objs.h +72 -0
  128. data/include/rbs/util/rbs_constant_pool.h +219 -0
  129. data/include/rbs.h +7 -0
  130. data/lib/rbs/ancestor_graph.rb +92 -0
  131. data/lib/rbs/annotate/annotations.rb +199 -0
  132. data/lib/rbs/annotate/formatter.rb +92 -0
  133. data/lib/rbs/annotate/rdoc_annotator.rb +400 -0
  134. data/lib/rbs/annotate/rdoc_source.rb +131 -0
  135. data/lib/rbs/annotate.rb +8 -0
  136. data/lib/rbs/ast/annotation.rb +29 -0
  137. data/lib/rbs/ast/comment.rb +29 -0
  138. data/lib/rbs/ast/declarations.rb +467 -0
  139. data/lib/rbs/ast/directives.rb +49 -0
  140. data/lib/rbs/ast/members.rb +451 -0
  141. data/lib/rbs/ast/type_param.rb +225 -0
  142. data/lib/rbs/ast/visitor.rb +137 -0
  143. data/lib/rbs/buffer.rb +67 -0
  144. data/lib/rbs/builtin_names.rb +58 -0
  145. data/lib/rbs/cli/colored_io.rb +48 -0
  146. data/lib/rbs/cli/diff.rb +83 -0
  147. data/lib/rbs/cli/validate.rb +357 -0
  148. data/lib/rbs/cli.rb +1223 -0
  149. data/lib/rbs/collection/cleaner.rb +38 -0
  150. data/lib/rbs/collection/config/lockfile.rb +92 -0
  151. data/lib/rbs/collection/config/lockfile_generator.rb +218 -0
  152. data/lib/rbs/collection/config.rb +81 -0
  153. data/lib/rbs/collection/installer.rb +32 -0
  154. data/lib/rbs/collection/sources/base.rb +14 -0
  155. data/lib/rbs/collection/sources/git.rb +258 -0
  156. data/lib/rbs/collection/sources/local.rb +81 -0
  157. data/lib/rbs/collection/sources/rubygems.rb +48 -0
  158. data/lib/rbs/collection/sources/stdlib.rb +50 -0
  159. data/lib/rbs/collection/sources.rb +38 -0
  160. data/lib/rbs/collection.rb +16 -0
  161. data/lib/rbs/constant.rb +28 -0
  162. data/lib/rbs/definition.rb +401 -0
  163. data/lib/rbs/definition_builder/ancestor_builder.rb +620 -0
  164. data/lib/rbs/definition_builder/method_builder.rb +254 -0
  165. data/lib/rbs/definition_builder.rb +845 -0
  166. data/lib/rbs/diff.rb +125 -0
  167. data/lib/rbs/environment/use_map.rb +77 -0
  168. data/lib/rbs/environment.rb +829 -0
  169. data/lib/rbs/environment_loader.rb +173 -0
  170. data/lib/rbs/environment_walker.rb +155 -0
  171. data/lib/rbs/errors.rb +645 -0
  172. data/lib/rbs/factory.rb +18 -0
  173. data/lib/rbs/file_finder.rb +28 -0
  174. data/lib/rbs/location_aux.rb +138 -0
  175. data/lib/rbs/locator.rb +243 -0
  176. data/lib/rbs/method_type.rb +143 -0
  177. data/lib/rbs/namespace.rb +125 -0
  178. data/lib/rbs/parser/lex_result.rb +15 -0
  179. data/lib/rbs/parser/token.rb +23 -0
  180. data/lib/rbs/parser_aux.rb +114 -0
  181. data/lib/rbs/prototype/helpers.rb +140 -0
  182. data/lib/rbs/prototype/node_usage.rb +99 -0
  183. data/lib/rbs/prototype/rb.rb +840 -0
  184. data/lib/rbs/prototype/rbi.rb +641 -0
  185. data/lib/rbs/prototype/runtime/helpers.rb +59 -0
  186. data/lib/rbs/prototype/runtime/reflection.rb +19 -0
  187. data/lib/rbs/prototype/runtime/value_object_generator.rb +279 -0
  188. data/lib/rbs/prototype/runtime.rb +667 -0
  189. data/lib/rbs/repository.rb +127 -0
  190. data/lib/rbs/resolver/constant_resolver.rb +219 -0
  191. data/lib/rbs/resolver/type_name_resolver.rb +91 -0
  192. data/lib/rbs/sorter.rb +198 -0
  193. data/lib/rbs/substitution.rb +83 -0
  194. data/lib/rbs/subtractor.rb +201 -0
  195. data/lib/rbs/test/errors.rb +80 -0
  196. data/lib/rbs/test/guaranteed.rb +30 -0
  197. data/lib/rbs/test/hook.rb +212 -0
  198. data/lib/rbs/test/observer.rb +19 -0
  199. data/lib/rbs/test/setup.rb +84 -0
  200. data/lib/rbs/test/setup_helper.rb +50 -0
  201. data/lib/rbs/test/tester.rb +167 -0
  202. data/lib/rbs/test/type_check.rb +435 -0
  203. data/lib/rbs/test.rb +112 -0
  204. data/lib/rbs/type_alias_dependency.rb +100 -0
  205. data/lib/rbs/type_alias_regularity.rb +126 -0
  206. data/lib/rbs/type_name.rb +109 -0
  207. data/lib/rbs/types.rb +1596 -0
  208. data/lib/rbs/unit_test/convertibles.rb +176 -0
  209. data/lib/rbs/unit_test/spy.rb +138 -0
  210. data/lib/rbs/unit_test/type_assertions.rb +347 -0
  211. data/lib/rbs/unit_test/with_aliases.rb +143 -0
  212. data/lib/rbs/unit_test.rb +6 -0
  213. data/lib/rbs/validator.rb +186 -0
  214. data/lib/rbs/variance_calculator.rb +189 -0
  215. data/lib/rbs/vendorer.rb +71 -0
  216. data/lib/rbs/version.rb +5 -0
  217. data/lib/rbs/writer.rb +424 -0
  218. data/lib/rbs.rb +94 -0
  219. data/lib/rdoc/discover.rb +20 -0
  220. data/lib/rdoc_plugin/parser.rb +163 -0
  221. data/rbs-relaxed.gemspec +48 -0
  222. data/schema/annotation.json +14 -0
  223. data/schema/comment.json +26 -0
  224. data/schema/decls.json +326 -0
  225. data/schema/function.json +87 -0
  226. data/schema/location.json +56 -0
  227. data/schema/members.json +266 -0
  228. data/schema/methodType.json +50 -0
  229. data/schema/typeParam.json +36 -0
  230. data/schema/types.json +317 -0
  231. data/sig/ancestor_builder.rbs +163 -0
  232. data/sig/ancestor_graph.rbs +60 -0
  233. data/sig/annotate/annotations.rbs +102 -0
  234. data/sig/annotate/formatter.rbs +24 -0
  235. data/sig/annotate/rdoc_annotater.rbs +82 -0
  236. data/sig/annotate/rdoc_source.rbs +30 -0
  237. data/sig/annotation.rbs +27 -0
  238. data/sig/buffer.rbs +32 -0
  239. data/sig/builtin_names.rbs +44 -0
  240. data/sig/cli/colored_io.rbs +15 -0
  241. data/sig/cli/diff.rbs +21 -0
  242. data/sig/cli/validate.rbs +43 -0
  243. data/sig/cli.rbs +87 -0
  244. data/sig/collection/cleaner.rbs +13 -0
  245. data/sig/collection/config/lockfile.rbs +74 -0
  246. data/sig/collection/config/lockfile_generator.rbs +66 -0
  247. data/sig/collection/config.rbs +46 -0
  248. data/sig/collection/installer.rbs +17 -0
  249. data/sig/collection/sources.rbs +214 -0
  250. data/sig/collection.rbs +4 -0
  251. data/sig/comment.rbs +26 -0
  252. data/sig/constant.rbs +21 -0
  253. data/sig/declarations.rbs +267 -0
  254. data/sig/definition.rbs +173 -0
  255. data/sig/definition_builder.rbs +165 -0
  256. data/sig/diff.rbs +28 -0
  257. data/sig/directives.rbs +77 -0
  258. data/sig/environment.rbs +279 -0
  259. data/sig/environment_loader.rbs +111 -0
  260. data/sig/environment_walker.rbs +65 -0
  261. data/sig/errors.rbs +405 -0
  262. data/sig/factory.rbs +5 -0
  263. data/sig/file_finder.rbs +28 -0
  264. data/sig/location.rbs +110 -0
  265. data/sig/locator.rbs +58 -0
  266. data/sig/manifest.yaml +7 -0
  267. data/sig/members.rbs +258 -0
  268. data/sig/method_builder.rbs +84 -0
  269. data/sig/method_types.rbs +58 -0
  270. data/sig/namespace.rbs +146 -0
  271. data/sig/parser.rbs +100 -0
  272. data/sig/prototype/helpers.rbs +27 -0
  273. data/sig/prototype/node_usage.rbs +20 -0
  274. data/sig/prototype/rb.rbs +96 -0
  275. data/sig/prototype/rbi.rbs +75 -0
  276. data/sig/prototype/runtime.rbs +182 -0
  277. data/sig/rbs.rbs +21 -0
  278. data/sig/rdoc/rbs.rbs +67 -0
  279. data/sig/repository.rbs +85 -0
  280. data/sig/resolver/constant_resolver.rbs +92 -0
  281. data/sig/resolver/context.rbs +34 -0
  282. data/sig/resolver/type_name_resolver.rbs +35 -0
  283. data/sig/shims/bundler.rbs +38 -0
  284. data/sig/shims/enumerable.rbs +5 -0
  285. data/sig/shims/rubygems.rbs +19 -0
  286. data/sig/sorter.rbs +41 -0
  287. data/sig/substitution.rbs +48 -0
  288. data/sig/subtractor.rbs +37 -0
  289. data/sig/test/errors.rbs +52 -0
  290. data/sig/test/guranteed.rbs +9 -0
  291. data/sig/test/type_check.rbs +19 -0
  292. data/sig/test.rbs +82 -0
  293. data/sig/type_alias_dependency.rbs +53 -0
  294. data/sig/type_alias_regularity.rbs +98 -0
  295. data/sig/type_param.rbs +110 -0
  296. data/sig/typename.rbs +79 -0
  297. data/sig/types.rbs +579 -0
  298. data/sig/unit_test/convertibles.rbs +154 -0
  299. data/sig/unit_test/spy.rbs +30 -0
  300. data/sig/unit_test/type_assertions.rbs +196 -0
  301. data/sig/unit_test/with_aliases.rbs +136 -0
  302. data/sig/use_map.rbs +35 -0
  303. data/sig/util.rbs +9 -0
  304. data/sig/validator.rbs +63 -0
  305. data/sig/variance_calculator.rbs +87 -0
  306. data/sig/vendorer.rbs +51 -0
  307. data/sig/version.rbs +3 -0
  308. data/sig/visitor.rbs +47 -0
  309. data/sig/writer.rbs +127 -0
  310. data/src/constants.c +153 -0
  311. data/src/ruby_objs.c +795 -0
  312. data/src/util/rbs_constant_pool.c +342 -0
  313. data/stdlib/abbrev/0/abbrev.rbs +66 -0
  314. data/stdlib/abbrev/0/array.rbs +26 -0
  315. data/stdlib/base64/0/base64.rbs +355 -0
  316. data/stdlib/benchmark/0/benchmark.rbs +452 -0
  317. data/stdlib/bigdecimal/0/big_decimal.rbs +1629 -0
  318. data/stdlib/bigdecimal-math/0/big_math.rbs +119 -0
  319. data/stdlib/bigdecimal-math/0/manifest.yaml +2 -0
  320. data/stdlib/cgi/0/core.rbs +1285 -0
  321. data/stdlib/cgi/0/manifest.yaml +3 -0
  322. data/stdlib/coverage/0/coverage.rbs +263 -0
  323. data/stdlib/csv/0/csv.rbs +3776 -0
  324. data/stdlib/csv/0/manifest.yaml +3 -0
  325. data/stdlib/date/0/date.rbs +1585 -0
  326. data/stdlib/date/0/date_time.rbs +616 -0
  327. data/stdlib/date/0/time.rbs +26 -0
  328. data/stdlib/dbm/0/dbm.rbs +421 -0
  329. data/stdlib/delegate/0/delegator.rbs +184 -0
  330. data/stdlib/delegate/0/kernel.rbs +47 -0
  331. data/stdlib/delegate/0/simple_delegator.rbs +96 -0
  332. data/stdlib/did_you_mean/0/did_you_mean.rbs +343 -0
  333. data/stdlib/digest/0/digest.rbs +577 -0
  334. data/stdlib/erb/0/erb.rbs +532 -0
  335. data/stdlib/etc/0/etc.rbs +865 -0
  336. data/stdlib/fileutils/0/fileutils.rbs +1734 -0
  337. data/stdlib/find/0/find.rbs +49 -0
  338. data/stdlib/forwardable/0/forwardable.rbs +268 -0
  339. data/stdlib/io-console/0/io-console.rbs +414 -0
  340. data/stdlib/ipaddr/0/ipaddr.rbs +428 -0
  341. data/stdlib/json/0/json.rbs +1916 -0
  342. data/stdlib/kconv/0/kconv.rbs +166 -0
  343. data/stdlib/logger/0/formatter.rbs +45 -0
  344. data/stdlib/logger/0/log_device.rbs +100 -0
  345. data/stdlib/logger/0/logger.rbs +796 -0
  346. data/stdlib/logger/0/manifest.yaml +2 -0
  347. data/stdlib/logger/0/period.rbs +17 -0
  348. data/stdlib/logger/0/severity.rbs +34 -0
  349. data/stdlib/minitest/0/kernel.rbs +42 -0
  350. data/stdlib/minitest/0/minitest/abstract_reporter.rbs +52 -0
  351. data/stdlib/minitest/0/minitest/assertion.rbs +17 -0
  352. data/stdlib/minitest/0/minitest/assertions.rbs +590 -0
  353. data/stdlib/minitest/0/minitest/backtrace_filter.rbs +23 -0
  354. data/stdlib/minitest/0/minitest/bench_spec.rbs +102 -0
  355. data/stdlib/minitest/0/minitest/benchmark.rbs +259 -0
  356. data/stdlib/minitest/0/minitest/composite_reporter.rbs +25 -0
  357. data/stdlib/minitest/0/minitest/compress.rbs +13 -0
  358. data/stdlib/minitest/0/minitest/error_on_warning.rbs +3 -0
  359. data/stdlib/minitest/0/minitest/expectation.rbs +2 -0
  360. data/stdlib/minitest/0/minitest/expectations.rbs +21 -0
  361. data/stdlib/minitest/0/minitest/guard.rbs +64 -0
  362. data/stdlib/minitest/0/minitest/mock.rbs +64 -0
  363. data/stdlib/minitest/0/minitest/parallel/executor.rbs +46 -0
  364. data/stdlib/minitest/0/minitest/parallel/test/class_methods.rbs +5 -0
  365. data/stdlib/minitest/0/minitest/parallel/test.rbs +3 -0
  366. data/stdlib/minitest/0/minitest/parallel.rbs +2 -0
  367. data/stdlib/minitest/0/minitest/pride_io.rbs +62 -0
  368. data/stdlib/minitest/0/minitest/pride_lol.rbs +19 -0
  369. data/stdlib/minitest/0/minitest/progress_reporter.rbs +11 -0
  370. data/stdlib/minitest/0/minitest/reportable.rbs +53 -0
  371. data/stdlib/minitest/0/minitest/reporter.rbs +5 -0
  372. data/stdlib/minitest/0/minitest/result.rbs +28 -0
  373. data/stdlib/minitest/0/minitest/runnable.rbs +163 -0
  374. data/stdlib/minitest/0/minitest/skip.rbs +6 -0
  375. data/stdlib/minitest/0/minitest/spec/dsl/instance_methods.rbs +48 -0
  376. data/stdlib/minitest/0/minitest/spec/dsl.rbs +129 -0
  377. data/stdlib/minitest/0/minitest/spec.rbs +11 -0
  378. data/stdlib/minitest/0/minitest/statistics_reporter.rbs +81 -0
  379. data/stdlib/minitest/0/minitest/summary_reporter.rbs +18 -0
  380. data/stdlib/minitest/0/minitest/test/lifecycle_hooks.rbs +92 -0
  381. data/stdlib/minitest/0/minitest/test.rbs +69 -0
  382. data/stdlib/minitest/0/minitest/unexpected_error.rbs +12 -0
  383. data/stdlib/minitest/0/minitest/unexpected_warning.rbs +6 -0
  384. data/stdlib/minitest/0/minitest/unit/test_case.rbs +3 -0
  385. data/stdlib/minitest/0/minitest/unit.rbs +4 -0
  386. data/stdlib/minitest/0/minitest.rbs +115 -0
  387. data/stdlib/monitor/0/monitor.rbs +363 -0
  388. data/stdlib/mutex_m/0/mutex_m.rbs +104 -0
  389. data/stdlib/net-http/0/manifest.yaml +3 -0
  390. data/stdlib/net-http/0/net-http.rbs +5552 -0
  391. data/stdlib/net-protocol/0/manifest.yaml +2 -0
  392. data/stdlib/net-protocol/0/net-protocol.rbs +56 -0
  393. data/stdlib/net-smtp/0/manifest.yaml +2 -0
  394. data/stdlib/net-smtp/0/net-smtp.rbs +55 -0
  395. data/stdlib/nkf/0/nkf.rbs +402 -0
  396. data/stdlib/objspace/0/objspace.rbs +487 -0
  397. data/stdlib/observable/0/observable.rbs +217 -0
  398. data/stdlib/open-uri/0/manifest.yaml +4 -0
  399. data/stdlib/open-uri/0/open-uri.rbs +393 -0
  400. data/stdlib/open3/0/open3.rbs +147 -0
  401. data/stdlib/openssl/0/manifest.yaml +3 -0
  402. data/stdlib/openssl/0/openssl.rbs +12113 -0
  403. data/stdlib/optparse/0/optparse.rbs +1725 -0
  404. data/stdlib/pathname/0/pathname.rbs +1406 -0
  405. data/stdlib/pp/0/manifest.yaml +2 -0
  406. data/stdlib/pp/0/pp.rbs +300 -0
  407. data/stdlib/prettyprint/0/prettyprint.rbs +383 -0
  408. data/stdlib/pstore/0/pstore.rbs +603 -0
  409. data/stdlib/psych/0/core_ext.rbs +12 -0
  410. data/stdlib/psych/0/dbm.rbs +237 -0
  411. data/stdlib/psych/0/manifest.yaml +3 -0
  412. data/stdlib/psych/0/psych.rbs +402 -0
  413. data/stdlib/psych/0/store.rbs +59 -0
  414. data/stdlib/pty/0/pty.rbs +237 -0
  415. data/stdlib/rdoc/0/code_object.rbs +51 -0
  416. data/stdlib/rdoc/0/comment.rbs +59 -0
  417. data/stdlib/rdoc/0/context.rbs +153 -0
  418. data/stdlib/rdoc/0/markup.rbs +117 -0
  419. data/stdlib/rdoc/0/parser.rbs +56 -0
  420. data/stdlib/rdoc/0/rdoc.rbs +391 -0
  421. data/stdlib/rdoc/0/ri.rbs +17 -0
  422. data/stdlib/rdoc/0/store.rbs +48 -0
  423. data/stdlib/rdoc/0/top_level.rbs +97 -0
  424. data/stdlib/resolv/0/manifest.yaml +3 -0
  425. data/stdlib/resolv/0/resolv.rbs +1830 -0
  426. data/stdlib/ripper/0/ripper.rbs +1648 -0
  427. data/stdlib/securerandom/0/securerandom.rbs +62 -0
  428. data/stdlib/shellwords/0/shellwords.rbs +229 -0
  429. data/stdlib/singleton/0/singleton.rbs +131 -0
  430. data/stdlib/socket/0/addrinfo.rbs +666 -0
  431. data/stdlib/socket/0/basic_socket.rbs +590 -0
  432. data/stdlib/socket/0/constants.rbs +2295 -0
  433. data/stdlib/socket/0/ip_socket.rbs +92 -0
  434. data/stdlib/socket/0/socket.rbs +4157 -0
  435. data/stdlib/socket/0/socket_error.rbs +5 -0
  436. data/stdlib/socket/0/tcp_server.rbs +192 -0
  437. data/stdlib/socket/0/tcp_socket.rbs +79 -0
  438. data/stdlib/socket/0/udp_socket.rbs +133 -0
  439. data/stdlib/socket/0/unix_server.rbs +169 -0
  440. data/stdlib/socket/0/unix_socket.rbs +172 -0
  441. data/stdlib/stringio/0/stringio.rbs +567 -0
  442. data/stdlib/strscan/0/string_scanner.rbs +1627 -0
  443. data/stdlib/tempfile/0/tempfile.rbs +479 -0
  444. data/stdlib/time/0/time.rbs +432 -0
  445. data/stdlib/timeout/0/timeout.rbs +81 -0
  446. data/stdlib/tmpdir/0/tmpdir.rbs +69 -0
  447. data/stdlib/tsort/0/cyclic.rbs +5 -0
  448. data/stdlib/tsort/0/interfaces.rbs +20 -0
  449. data/stdlib/tsort/0/tsort.rbs +409 -0
  450. data/stdlib/uri/0/common.rbs +582 -0
  451. data/stdlib/uri/0/file.rbs +118 -0
  452. data/stdlib/uri/0/ftp.rbs +13 -0
  453. data/stdlib/uri/0/generic.rbs +1108 -0
  454. data/stdlib/uri/0/http.rbs +104 -0
  455. data/stdlib/uri/0/https.rbs +14 -0
  456. data/stdlib/uri/0/ldap.rbs +230 -0
  457. data/stdlib/uri/0/ldaps.rbs +14 -0
  458. data/stdlib/uri/0/mailto.rbs +92 -0
  459. data/stdlib/uri/0/rfc2396_parser.rbs +189 -0
  460. data/stdlib/uri/0/rfc3986_parser.rbs +2 -0
  461. data/stdlib/uri/0/ws.rbs +13 -0
  462. data/stdlib/uri/0/wss.rbs +9 -0
  463. data/stdlib/yaml/0/manifest.yaml +2 -0
  464. data/stdlib/yaml/0/yaml.rbs +1 -0
  465. data/stdlib/zlib/0/buf_error.rbs +10 -0
  466. data/stdlib/zlib/0/data_error.rbs +10 -0
  467. data/stdlib/zlib/0/deflate.rbs +210 -0
  468. data/stdlib/zlib/0/error.rbs +20 -0
  469. data/stdlib/zlib/0/gzip_file/crc_error.rbs +12 -0
  470. data/stdlib/zlib/0/gzip_file/error.rbs +23 -0
  471. data/stdlib/zlib/0/gzip_file/length_error.rbs +12 -0
  472. data/stdlib/zlib/0/gzip_file/no_footer.rbs +11 -0
  473. data/stdlib/zlib/0/gzip_file.rbs +156 -0
  474. data/stdlib/zlib/0/gzip_reader.rbs +293 -0
  475. data/stdlib/zlib/0/gzip_writer.rbs +166 -0
  476. data/stdlib/zlib/0/inflate.rbs +180 -0
  477. data/stdlib/zlib/0/mem_error.rbs +10 -0
  478. data/stdlib/zlib/0/need_dict.rbs +13 -0
  479. data/stdlib/zlib/0/stream_end.rbs +11 -0
  480. data/stdlib/zlib/0/stream_error.rbs +11 -0
  481. data/stdlib/zlib/0/version_error.rbs +11 -0
  482. data/stdlib/zlib/0/zlib.rbs +449 -0
  483. data/stdlib/zlib/0/zstream.rbs +200 -0
  484. metadata +532 -0
@@ -0,0 +1,667 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'runtime/helpers'
4
+ require_relative 'runtime/value_object_generator'
5
+ require_relative 'runtime/reflection'
6
+
7
+ module RBS
8
+ module Prototype
9
+ class Runtime
10
+ class Todo
11
+ def initialize(builder:)
12
+ @builder = builder
13
+ end
14
+
15
+ def skip_mixin?(type_name:, module_name:, mixin_class:)
16
+ return false unless @builder.env.module_class_entry(type_name.absolute!)
17
+ return false unless @builder.env.module_class_entry(module_name.absolute!)
18
+
19
+ mixin_decls(type_name).any? do |decl|
20
+ decl.instance_of?(mixin_class) && decl.name == module_name.absolute!
21
+ end
22
+ end
23
+
24
+ def skip_singleton_method?(module_name:, method:, accessibility:)
25
+ return false unless @builder.env.module_class_entry(module_name.absolute!)
26
+
27
+ method_definition = @builder.build_singleton(module_name.absolute!).methods[method.name]
28
+ return false unless method_definition
29
+
30
+ method_definition.accessibility == accessibility
31
+ end
32
+
33
+ def skip_instance_method?(module_name:, method:, accessibility:)
34
+ return false unless @builder.env.module_class_entry(module_name.absolute!)
35
+
36
+ method_definition = @builder.build_instance(module_name.absolute!).methods[method.name]
37
+ return false unless method_definition
38
+
39
+ method_definition.accessibility == accessibility
40
+ end
41
+
42
+ def skip_constant?(module_name:, name:)
43
+ namespace = Namespace.new(path: module_name.split('::').map(&:to_sym), absolute: true)
44
+ @builder.env.constant_decl?(TypeName.new(namespace: namespace, name: name))
45
+ end
46
+
47
+ private
48
+
49
+ def mixin_decls(type_name)
50
+ type_name_absolute = type_name.absolute!
51
+ @mixin_decls_cache ||= {} #: Hash[TypeName, Array[AST::Members::Mixin]]
52
+ @mixin_decls_cache.fetch(type_name_absolute) do
53
+ @mixin_decls_cache[type_name_absolute] = @builder.env.class_decls[type_name_absolute].decls.flat_map do |d|
54
+ d.decl.members.select { |m| m.kind_of?(AST::Members::Mixin) }
55
+ end
56
+ end
57
+ end
58
+ end
59
+ private_constant :Todo
60
+
61
+ include Prototype::Helpers
62
+ include Runtime::Helpers
63
+
64
+ attr_reader :patterns
65
+ attr_reader :env
66
+ attr_reader :merge
67
+ attr_reader :todo
68
+ attr_reader :owners_included
69
+ attr_accessor :outline
70
+
71
+ def initialize(patterns:, env:, merge:, todo: false, owners_included: [])
72
+ @patterns = patterns
73
+ @decls = nil
74
+ @modules = {}
75
+ @env = env
76
+ @merge = merge
77
+ @owners_included = owners_included.map do |name|
78
+ Object.const_get(name)
79
+ end
80
+ @outline = false
81
+ @todo = todo
82
+ end
83
+
84
+ def target?(const)
85
+ name = const_name(const)
86
+ return false unless name
87
+
88
+ patterns.any? do |pattern|
89
+ if pattern.end_with?("*")
90
+ (name || "").start_with?(pattern.chop)
91
+ else
92
+ name == pattern
93
+ end
94
+ end
95
+ end
96
+
97
+ def todo_object
98
+ @todo_object ||= Todo.new(builder: builder) if todo
99
+ end
100
+
101
+ def builder
102
+ @builder ||= DefinitionBuilder.new(env: env)
103
+ end
104
+
105
+ def parse(file)
106
+ require file
107
+ end
108
+
109
+ def decls
110
+ unless @decls
111
+ @decls = []
112
+ @modules = ObjectSpace.each_object(Module)
113
+ .map { |mod| [const_name(mod), mod] }
114
+ .select { |name, _| name }
115
+ .to_h
116
+ @modules.select { |name, mod| target?(mod) }.sort_by { |name, _| name }.each do |_, mod|
117
+ case mod
118
+ when Class
119
+ generate_class mod
120
+ when Module
121
+ generate_module mod
122
+ end
123
+ end
124
+ end
125
+
126
+ @decls or raise
127
+ end
128
+
129
+ private def each_mixined_module(type_name, mod)
130
+ each_mixined_module_one(type_name, mod) do |module_name, module_full_name, is_prepend|
131
+ yield module_name, module_full_name, is_prepend ? AST::Members::Prepend : AST::Members::Include
132
+ end
133
+ each_mixined_module_one(type_name, mod.singleton_class) do |module_name, module_full_name, _|
134
+ yield module_name, module_full_name, AST::Members::Extend
135
+ end
136
+ end
137
+
138
+ private def each_mixined_module_one(type_name, mod)
139
+ supers = Set[] #: Set[Module]
140
+ prepends = mod.ancestors.take_while { |m| !mod.equal?(m) }.to_set
141
+
142
+ mod.included_modules.each do |mix|
143
+ supers.merge(mix.included_modules)
144
+ end
145
+
146
+ if mod.is_a?(Class)
147
+ if superclass = mod.superclass
148
+ superclass.included_modules.each do |mix|
149
+ supers << mix
150
+ supers.merge(mix.included_modules)
151
+ end
152
+ end
153
+ end
154
+
155
+ mod.included_modules.uniq.each do |mix|
156
+ if !supers.include?(mix) || prepends.include?(mix)
157
+ unless const_name(mix)
158
+ RBS.logger.warn("Skipping anonymous module #{mix} included in #{mod}")
159
+ else
160
+ module_name = module_full_name = to_type_name(const_name!(mix), full_name: true)
161
+ if module_full_name.namespace == type_name.namespace
162
+ module_name = TypeName.new(name: module_full_name.name, namespace: Namespace.empty)
163
+ end
164
+
165
+ yield module_name, module_full_name, prepends.include?(mix)
166
+ end
167
+ end
168
+ end
169
+ end
170
+
171
+ def method_type(method)
172
+ untyped = Types::Bases::Any.new(location: nil)
173
+
174
+ required_positionals = [] #: Array[Types::Function::Param]
175
+ optional_positionals = [] #: Array[Types::Function::Param]
176
+ rest = nil #: Types::Function::Param?
177
+ trailing_positionals = [] #: Array[Types::Function::Param]
178
+ required_keywords = {} #: Hash[Symbol, Types::Function::Param]
179
+ optional_keywords = {} #: Hash[Symbol, Types::Function::Param]
180
+ rest_keywords = nil #: Types::Function::Param?
181
+
182
+ requireds = required_positionals
183
+
184
+ block = nil #: Types::Block?
185
+
186
+ method.parameters.each do |(kind, name)|
187
+ case kind
188
+ when :req
189
+ requireds << Types::Function::Param.new(name: name, type: untyped)
190
+ when :opt
191
+ requireds = trailing_positionals
192
+ optional_positionals << Types::Function::Param.new(name: name, type: untyped)
193
+ when :rest
194
+ requireds = trailing_positionals
195
+ name = nil if name == :* # For `def f(...) end` syntax
196
+ rest = Types::Function::Param.new(name: name, type: untyped)
197
+ when :keyreq
198
+ name or raise
199
+ required_keywords[name] = Types::Function::Param.new(name: nil, type: untyped)
200
+ when :key
201
+ name or raise
202
+ optional_keywords[name] = Types::Function::Param.new(name: nil, type: untyped)
203
+ when :keyrest
204
+ rest_keywords = Types::Function::Param.new(name: nil, type: untyped)
205
+ when :block
206
+ block = Types::Block.new(
207
+ type: Types::Function.empty(untyped).update(rest_positionals: Types::Function::Param.new(name: nil, type: untyped)),
208
+ required: true,
209
+ self_type: nil
210
+ )
211
+ end
212
+ end
213
+
214
+ block ||= block_from_ast_of(method)
215
+
216
+ return_type = if method.name == :initialize
217
+ Types::Bases::Void.new(location: nil)
218
+ else
219
+ untyped
220
+ end
221
+ method_type = Types::Function.new(
222
+ required_positionals: required_positionals,
223
+ optional_positionals: optional_positionals,
224
+ rest_positionals: rest,
225
+ trailing_positionals: trailing_positionals,
226
+ required_keywords: required_keywords,
227
+ optional_keywords: optional_keywords,
228
+ rest_keywords: rest_keywords,
229
+ return_type: return_type,
230
+ )
231
+
232
+ MethodType.new(
233
+ location: nil,
234
+ type_params: [],
235
+ type: method_type,
236
+ block: block
237
+ )
238
+ end
239
+
240
+ def merge_rbs(module_name, members, instance: nil, singleton: nil)
241
+ if merge
242
+ if env.class_decls[module_name.absolute!]
243
+ # @type var kind: AST::Members::MethodDefinition::kind
244
+ case
245
+ when instance
246
+ method = builder.build_instance(module_name.absolute!).methods[instance]
247
+ method_name = instance
248
+ kind = :instance
249
+ when singleton
250
+ method = builder.build_singleton(module_name.absolute!).methods[singleton]
251
+ method_name = singleton
252
+ kind = :singleton
253
+ end
254
+
255
+ if method
256
+ members << AST::Members::MethodDefinition.new(
257
+ name: method_name,
258
+ overloads: method.method_types.map {|type|
259
+ AST::Members::MethodDefinition::Overload.new(
260
+ annotations: [],
261
+ method_type: type.update.tap do |ty|
262
+ def ty.to_s
263
+ location or raise
264
+ location.source
265
+ end
266
+ end
267
+ )
268
+ },
269
+ kind: kind,
270
+ location: nil,
271
+ comment: method.comments[0],
272
+ annotations: method.annotations,
273
+ overloading: false,
274
+ visibility: nil
275
+ )
276
+ return
277
+ end
278
+ end
279
+
280
+ yield
281
+ else
282
+ yield
283
+ end
284
+ end
285
+
286
+ def target_method?(mod, instance: nil, singleton: nil)
287
+ case
288
+ when instance
289
+ method = mod.instance_method(instance)
290
+ method.owner == mod || owners_included.any? {|m| method.owner == m }
291
+ when singleton
292
+ method = mod.singleton_class.instance_method(singleton)
293
+ method.owner == mod.singleton_class || owners_included.any? {|m| method.owner == m.singleton_class }
294
+ else
295
+ raise
296
+ end
297
+ end
298
+
299
+ def generate_methods(mod, module_name, members)
300
+ module_name_absolute = to_type_name(const_name!(mod), full_name: true).absolute!
301
+ mod.singleton_methods.select {|name| target_method?(mod, singleton: name) }.sort.each do |name|
302
+ method = mod.singleton_class.instance_method(name)
303
+ next if todo_object&.skip_singleton_method?(module_name: module_name_absolute, method: method, accessibility: :public)
304
+
305
+ if can_alias?(mod.singleton_class, method)
306
+ members << AST::Members::Alias.new(
307
+ new_name: method.name,
308
+ old_name: method.original_name,
309
+ kind: :singleton,
310
+ location: nil,
311
+ comment: nil,
312
+ annotations: [],
313
+ )
314
+ else
315
+ merge_rbs(module_name, members, singleton: name) do
316
+ RBS.logger.info "missing #{module_name}.#{name} #{method.source_location}"
317
+
318
+ members << AST::Members::MethodDefinition.new(
319
+ name: method.name,
320
+ overloads: [
321
+ AST::Members::MethodDefinition::Overload.new(annotations: [], method_type: method_type(method))
322
+ ],
323
+ kind: :singleton,
324
+ location: nil,
325
+ comment: nil,
326
+ annotations: [],
327
+ overloading: false,
328
+ visibility: nil
329
+ )
330
+ end
331
+ end
332
+ end
333
+
334
+ public_instance_methods = mod.public_instance_methods.select {|name| target_method?(mod, instance: name) }
335
+ unless public_instance_methods.empty?
336
+ public_instance_methods.sort.each do |name|
337
+ method = mod.instance_method(name)
338
+ next if todo_object&.skip_instance_method?(module_name: module_name_absolute, method: method, accessibility: :public)
339
+
340
+ if can_alias?(mod, method)
341
+ members << AST::Members::Alias.new(
342
+ new_name: method.name,
343
+ old_name: method.original_name,
344
+ kind: :instance,
345
+ location: nil,
346
+ comment: nil,
347
+ annotations: [],
348
+ )
349
+ else
350
+ merge_rbs(module_name, members, instance: name) do
351
+ RBS.logger.info "missing #{module_name}##{name} #{method.source_location}"
352
+
353
+ members << AST::Members::MethodDefinition.new(
354
+ name: method.name,
355
+ overloads: [
356
+ AST::Members::MethodDefinition::Overload.new(annotations: [], method_type: method_type(method))
357
+ ],
358
+ kind: :instance,
359
+ location: nil,
360
+ comment: nil,
361
+ annotations: [],
362
+ overloading: false,
363
+ visibility: nil
364
+ )
365
+ end
366
+ end
367
+ end
368
+ end
369
+
370
+ private_instance_methods = mod.private_instance_methods.select {|name| target_method?(mod, instance: name) }
371
+ unless private_instance_methods.empty?
372
+ added = false
373
+ members << AST::Members::Private.new(location: nil)
374
+
375
+ private_instance_methods.sort.each do |name|
376
+ method = mod.instance_method(name)
377
+ next if todo_object&.skip_instance_method?(module_name: module_name_absolute, method: method, accessibility: :private)
378
+
379
+ added = true
380
+ if can_alias?(mod, method)
381
+ members << AST::Members::Alias.new(
382
+ new_name: method.name,
383
+ old_name: method.original_name,
384
+ kind: :instance,
385
+ location: nil,
386
+ comment: nil,
387
+ annotations: [],
388
+ )
389
+ else
390
+ merge_rbs(module_name, members, instance: name) do
391
+ RBS.logger.info "missing #{module_name}##{name} #{method.source_location}"
392
+
393
+ members << AST::Members::MethodDefinition.new(
394
+ name: method.name,
395
+ overloads: [
396
+ AST::Members::MethodDefinition::Overload.new(annotations: [], method_type: method_type(method))
397
+ ],
398
+ kind: :instance,
399
+ location: nil,
400
+ comment: nil,
401
+ annotations: [],
402
+ overloading: false,
403
+ visibility: nil
404
+ )
405
+ end
406
+ end
407
+ end
408
+
409
+ members.pop unless added
410
+ end
411
+ end
412
+
413
+ private def can_alias?(mod, method)
414
+ return false if method.name == method.original_name
415
+
416
+ begin
417
+ mod.instance_method(method.original_name) && true
418
+ rescue NameError
419
+ false
420
+ end
421
+ end
422
+
423
+ def generate_constants(mod, decls)
424
+ module_name = const_name!(mod)
425
+ Reflection.constants_of(mod, false).sort.each do |name|
426
+ next if todo_object&.skip_constant?(module_name: module_name, name: name)
427
+
428
+ begin
429
+ value = mod.const_get(name)
430
+ rescue StandardError, LoadError => e
431
+ RBS.logger.warn("Skipping constant #{name} of #{mod} since #{e}")
432
+ next
433
+ end
434
+
435
+ next if Reflection.object_class(value).equal?(Class)
436
+ next if Reflection.object_class(value).equal?(Module)
437
+
438
+ unless Reflection.object_class(value).name
439
+ RBS.logger.warn("Skipping constant #{name} #{value} of #{mod} as an instance of anonymous class")
440
+ next
441
+ end
442
+
443
+ type = case value
444
+ when true, false
445
+ Types::Bases::Bool.new(location: nil)
446
+ when nil
447
+ Types::Optional.new(
448
+ type: Types::Bases::Any.new(location: nil),
449
+ location: nil
450
+ )
451
+ when ARGF
452
+ Types::ClassInstance.new(name: TypeName.parse("::RBS::Unnamed::ARGFClass"), args: [], location: nil)
453
+ when ENV
454
+ Types::ClassInstance.new(name: TypeName.parse("::RBS::Unnamed::ENVClass"), args: [], location: nil)
455
+ else
456
+ value_type_name = to_type_name(const_name!(Reflection.object_class(value)), full_name: true).absolute!
457
+ args = type_args(value_type_name)
458
+ Types::ClassInstance.new(name: value_type_name, args: args, location: nil)
459
+ end
460
+
461
+ decls << AST::Declarations::Constant.new(
462
+ name: to_type_name(name.to_s),
463
+ type: type,
464
+ location: nil,
465
+ comment: nil
466
+ )
467
+ end
468
+ end
469
+
470
+ def generate_super_class(mod)
471
+ superclass = mod.superclass
472
+
473
+ if superclass.nil? || superclass == ::Object
474
+ nil
475
+ elsif const_name(superclass).nil?
476
+ RBS.logger.warn("Skipping anonymous superclass #{superclass} of #{mod}")
477
+ nil
478
+ else
479
+ super_name = to_type_name(const_name!(superclass), full_name: true).absolute!
480
+ super_args = type_args(super_name)
481
+ AST::Declarations::Class::Super.new(name: super_name, args: super_args, location: nil)
482
+ end
483
+ end
484
+
485
+ def generate_class(mod)
486
+ type_name_absolute = to_type_name(const_name!(mod), full_name: true).absolute!
487
+ type_name = to_type_name(const_name!(mod))
488
+ outer_decls = ensure_outer_module_declarations(mod)
489
+
490
+ # Check if a declaration exists for the actual module
491
+ decl = outer_decls.detect do |decl|
492
+ decl.is_a?(AST::Declarations::Class) && decl.name.name == only_name(mod).to_sym
493
+ end #: AST::Declarations::Class?
494
+
495
+ unless decl
496
+ if StructGenerator.generatable?(mod)
497
+ decl = StructGenerator.new(mod).build_decl
498
+ elsif DataGenerator.generatable?(mod)
499
+ decl = DataGenerator.new(mod).build_decl
500
+ else
501
+ decl = AST::Declarations::Class.new(
502
+ name: to_type_name(only_name(mod)),
503
+ type_params: type_params(mod),
504
+ super_class: generate_super_class(mod),
505
+ members: [],
506
+ annotations: [],
507
+ location: nil,
508
+ comment: nil
509
+ )
510
+ end
511
+
512
+ outer_decls << decl
513
+ end
514
+
515
+ generate_mixin(mod, decl, type_name, type_name_absolute)
516
+
517
+ unless mod < Struct || (RUBY_VERSION >= '3.2' && mod < Data)
518
+ generate_methods(mod, type_name, decl.members) unless outline
519
+ end
520
+
521
+ generate_constants mod, decl.members
522
+ end
523
+
524
+ def generate_module(mod)
525
+ name = const_name(mod)
526
+
527
+ unless name
528
+ RBS.logger.warn("Skipping anonymous module #{mod}")
529
+ return
530
+ end
531
+
532
+ type_name_absolute = to_type_name(name, full_name: true).absolute!
533
+ type_name = to_type_name(name)
534
+ outer_decls = ensure_outer_module_declarations(mod)
535
+
536
+ # Check if a declaration exists for the actual class
537
+ decl = outer_decls.detect do |decl|
538
+ decl.is_a?(AST::Declarations::Module) && decl.name.name == only_name(mod).to_sym
539
+ end #: AST::Declarations::Module?
540
+
541
+ unless decl
542
+ decl = AST::Declarations::Module.new(
543
+ name: to_type_name(only_name(mod)),
544
+ type_params: type_params(mod),
545
+ self_types: [],
546
+ members: [],
547
+ annotations: [],
548
+ location: nil,
549
+ comment: nil
550
+ )
551
+
552
+ outer_decls << decl
553
+ end
554
+
555
+ generate_mixin(mod, decl, type_name, type_name_absolute)
556
+
557
+ generate_methods(mod, type_name, decl.members) unless outline
558
+
559
+ generate_constants mod, decl.members
560
+ end
561
+
562
+ def generate_mixin(mod, decl, type_name, type_name_absolute)
563
+ each_mixined_module(type_name, mod) do |module_name, module_full_name, mixin_class|
564
+ next if todo_object&.skip_mixin?(type_name: type_name_absolute, module_name: module_full_name, mixin_class: mixin_class)
565
+
566
+ args = type_args(module_full_name)
567
+ decl.members << mixin_class.new(
568
+ name: module_name,
569
+ args: args,
570
+ location: nil,
571
+ comment: nil,
572
+ annotations: []
573
+ )
574
+ end
575
+ end
576
+
577
+ # Generate/find outer module declarations
578
+ # This is broken down into another method to comply with `DRY`
579
+ # This generates/finds declarations in nested form & returns the last array of declarations
580
+ def ensure_outer_module_declarations(mod)
581
+ # @type var outer_module_names: Array[String]
582
+ *outer_module_names, _ = const_name!(mod).split(/::/) #=> parent = [A, B], mod = C
583
+ # Copy the entries in ivar @decls, not .dup
584
+ destination = @decls || [] #: Array[AST::Declarations::Class::member]
585
+
586
+ outer_module_names&.each_with_index do |outer_module_name, i|
587
+ current_name = outer_module_names.take(i+1).join('::')
588
+ outer_module = @modules[current_name]
589
+ outer_decl = destination.detect do |decl|
590
+ case outer_module
591
+ when Class
592
+ decl.is_a?(AST::Declarations::Class) && decl.name.name == outer_module_name.to_sym
593
+ when Module
594
+ decl.is_a?(AST::Declarations::Module) && decl.name.name == outer_module_name.to_sym
595
+ end
596
+ end #: AST::Declarations::Class | AST::Declarations::Module | nil
597
+
598
+ # Insert AST::Declarations if declarations are not added previously
599
+ unless outer_decl
600
+ outer_module or raise
601
+
602
+ if outer_module.is_a?(Class)
603
+ outer_decl = AST::Declarations::Class.new(
604
+ name: to_type_name(outer_module_name),
605
+ type_params: type_params(outer_module),
606
+ super_class: generate_super_class(outer_module),
607
+ members: [],
608
+ annotations: [],
609
+ location: nil,
610
+ comment: nil
611
+ )
612
+ else
613
+ outer_decl = AST::Declarations::Module.new(
614
+ name: to_type_name(outer_module_name),
615
+ type_params: type_params(outer_module),
616
+ self_types: [],
617
+ members: [],
618
+ annotations: [],
619
+ location: nil,
620
+ comment: nil
621
+ )
622
+ end
623
+
624
+ destination << outer_decl
625
+ end
626
+
627
+ destination = outer_decl.members
628
+ end
629
+
630
+ # Return the array of declarations checked out at the end
631
+ destination
632
+ end
633
+
634
+ def type_args(type_name)
635
+ if class_decl = env.class_decls.fetch(type_name.absolute!, nil)
636
+ class_decl.type_params.size.times.map { Types::Bases::Any.new(location: nil) }
637
+ else
638
+ []
639
+ end
640
+ end
641
+
642
+ def type_params(mod)
643
+ type_name = to_type_name(const_name!(mod), full_name: true)
644
+ if class_decl = env.class_decls[type_name.absolute!]
645
+ class_decl.type_params
646
+ else
647
+ []
648
+ end
649
+ end
650
+
651
+ def block_from_ast_of(method)
652
+ begin
653
+ ast = RubyVM::AbstractSyntaxTree.of(method)
654
+ rescue ArgumentError
655
+ return # When the method is defined in eval
656
+ rescue RuntimeError => error
657
+ raise unless error.message.include?("prism")
658
+ return # When the method was compiled by prism
659
+ end
660
+
661
+ if ast && ast.type == :SCOPE
662
+ block_from_body(ast)
663
+ end
664
+ end
665
+ end
666
+ end
667
+ end