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,840 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RBS
4
+ module Prototype
5
+ class RB
6
+ include Helpers
7
+
8
+ class Context < Struct.new(:module_function, :singleton, :namespace, :in_def, keyword_init: true)
9
+ # @implements Context
10
+
11
+ def self.initial(namespace: Namespace.root)
12
+ self.new(module_function: false, singleton: false, namespace: namespace, in_def: false)
13
+ end
14
+
15
+ def method_kind
16
+ if singleton
17
+ :singleton
18
+ elsif module_function
19
+ :singleton_instance
20
+ else
21
+ :instance
22
+ end
23
+ end
24
+
25
+ def attribute_kind
26
+ if singleton
27
+ :singleton
28
+ else
29
+ :instance
30
+ end
31
+ end
32
+
33
+ def enter_namespace(namespace)
34
+ Context.initial(namespace: self.namespace + namespace)
35
+ end
36
+
37
+ def update(module_function: self.module_function, singleton: self.singleton, in_def: self.in_def)
38
+ Context.new(module_function: module_function, singleton: singleton, namespace: namespace, in_def: in_def)
39
+ end
40
+ end
41
+
42
+ attr_reader :source_decls
43
+ attr_reader :toplevel_members
44
+
45
+ def initialize
46
+ @source_decls = []
47
+ end
48
+
49
+ def decls
50
+ # @type var decls: Array[AST::Declarations::t]
51
+ decls = []
52
+
53
+ # @type var top_decls: Array[AST::Declarations::t]
54
+ # @type var top_members: Array[AST::Members::t]
55
+ top_decls, top_members = _ = source_decls.partition {|decl| decl.is_a?(AST::Declarations::Base) }
56
+
57
+ decls.push(*top_decls)
58
+
59
+ unless top_members.empty?
60
+ top = AST::Declarations::Class.new(
61
+ name: TypeName.new(name: :Object, namespace: Namespace.empty),
62
+ super_class: nil,
63
+ members: top_members,
64
+ annotations: [],
65
+ comment: nil,
66
+ location: nil,
67
+ type_params: []
68
+ )
69
+ decls << top
70
+ end
71
+
72
+ decls
73
+ end
74
+
75
+ def parse(string)
76
+ # @type var comments: Hash[Integer, AST::Comment]
77
+ comments = Ripper.lex(string).yield_self do |tokens|
78
+ code_lines = {} #: Hash[Integer, bool]
79
+ tokens.each.with_object({}) do |token, hash| #$ Hash[Integer, AST::Comment]
80
+ case token[1]
81
+ when :on_sp, :on_ignored_nl
82
+ # skip
83
+ when :on_comment
84
+ line = token[0][0]
85
+ # skip like `module Foo # :nodoc:`
86
+ next if code_lines[line]
87
+ body = token[2][2..-1] or raise
88
+
89
+ body = "\n" if body.empty?
90
+
91
+ comment = AST::Comment.new(string: body, location: nil)
92
+ if prev_comment = hash.delete(line - 1)
93
+ hash[line] = AST::Comment.new(string: prev_comment.string + comment.string,
94
+ location: nil)
95
+ else
96
+ hash[line] = comment
97
+ end
98
+ else
99
+ code_lines[token[0][0]] = true
100
+ end
101
+ end
102
+ end
103
+
104
+ process RubyVM::AbstractSyntaxTree.parse(string), decls: source_decls, comments: comments, context: Context.initial
105
+ end
106
+
107
+ def process(node, decls:, comments:, context:)
108
+ case node.type
109
+ when :CLASS
110
+ class_name, super_class_node, *class_body = node.children
111
+ super_class_name = const_to_name(super_class_node, context: context)
112
+ super_class =
113
+ if super_class_name
114
+ AST::Declarations::Class::Super.new(name: super_class_name, args: [], location: nil)
115
+ else
116
+ # Give up detect super class e.g. `class Foo < Struct.new(:bar)`
117
+ nil
118
+ end
119
+ kls = AST::Declarations::Class.new(
120
+ name: const_to_name!(class_name),
121
+ super_class: super_class,
122
+ type_params: [],
123
+ members: [],
124
+ annotations: [],
125
+ location: nil,
126
+ comment: comments[node.first_lineno - 1]
127
+ )
128
+
129
+ decls.push kls
130
+
131
+ new_ctx = context.enter_namespace(kls.name.to_namespace)
132
+ each_node class_body do |child|
133
+ process child, decls: kls.members, comments: comments, context: new_ctx
134
+ end
135
+ remove_unnecessary_accessibility_methods! kls.members
136
+ sort_members! kls.members
137
+
138
+ when :MODULE
139
+ module_name, *module_body = node.children
140
+
141
+ mod = AST::Declarations::Module.new(
142
+ name: const_to_name!(module_name),
143
+ type_params: [],
144
+ self_types: [],
145
+ members: [],
146
+ annotations: [],
147
+ location: nil,
148
+ comment: comments[node.first_lineno - 1]
149
+ )
150
+
151
+ decls.push mod
152
+
153
+ new_ctx = context.enter_namespace(mod.name.to_namespace)
154
+ each_node module_body do |child|
155
+ process child, decls: mod.members, comments: comments, context: new_ctx
156
+ end
157
+ remove_unnecessary_accessibility_methods! mod.members
158
+ sort_members! mod.members
159
+
160
+ when :SCLASS
161
+ this, body = node.children
162
+
163
+ if this.type != :SELF
164
+ RBS.logger.warn "`class <<` syntax with not-self may be compiled to incorrect code: #{this}"
165
+ end
166
+
167
+ accessibility = current_accessibility(decls)
168
+
169
+ ctx = Context.initial.tap { |ctx| ctx.singleton = true }
170
+ process_children(body, decls: decls, comments: comments, context: ctx)
171
+
172
+ decls << accessibility
173
+
174
+ when :DEFN, :DEFS
175
+ # @type var kind: Context::method_kind
176
+
177
+ if node.type == :DEFN
178
+ def_name, def_body = node.children
179
+ kind = context.method_kind
180
+ else
181
+ _, def_name, def_body = node.children
182
+ kind = :singleton
183
+ end
184
+
185
+ types = [
186
+ MethodType.new(
187
+ type_params: [],
188
+ type: function_type_from_body(def_body, def_name),
189
+ block: block_from_body(def_body),
190
+ location: nil
191
+ )
192
+ ]
193
+
194
+ member = AST::Members::MethodDefinition.new(
195
+ name: def_name,
196
+ location: nil,
197
+ annotations: [],
198
+ overloads: types.map {|type| AST::Members::MethodDefinition::Overload.new(annotations: [], method_type: type )},
199
+ kind: kind,
200
+ comment: comments[node.first_lineno - 1],
201
+ overloading: false,
202
+ visibility: nil
203
+ )
204
+
205
+ decls.push member unless decls.include?(member)
206
+
207
+ new_ctx = context.update(singleton: kind == :singleton, in_def: true)
208
+ each_node def_body.children do |child|
209
+ process child, decls: decls, comments: comments, context: new_ctx
210
+ end
211
+
212
+ when :ALIAS
213
+ new_name, old_name = node.children.map { |c| literal_to_symbol(c) }
214
+ member = AST::Members::Alias.new(
215
+ new_name: new_name,
216
+ old_name: old_name,
217
+ kind: context.singleton ? :singleton : :instance,
218
+ annotations: [],
219
+ location: nil,
220
+ comment: comments[node.first_lineno - 1],
221
+ )
222
+ decls.push member unless decls.include?(member)
223
+
224
+ when :FCALL, :VCALL
225
+ # Inside method definition cannot reach here.
226
+ args = node.children[1]&.children || []
227
+
228
+ case node.children[0]
229
+ when :include
230
+ args.each do |arg|
231
+ if (name = const_to_name(arg, context: context))
232
+ klass = context.singleton ? AST::Members::Extend : AST::Members::Include
233
+ decls << klass.new(
234
+ name: name,
235
+ args: [],
236
+ annotations: [],
237
+ location: nil,
238
+ comment: comments[node.first_lineno - 1]
239
+ )
240
+ end
241
+ end
242
+ when :prepend
243
+ args.each do |arg|
244
+ if (name = const_to_name(arg, context: context))
245
+ decls << AST::Members::Prepend.new(
246
+ name: name,
247
+ args: [],
248
+ annotations: [],
249
+ location: nil,
250
+ comment: comments[node.first_lineno - 1]
251
+ )
252
+ end
253
+ end
254
+ when :extend
255
+ args.each do |arg|
256
+ if (name = const_to_name(arg, context: context))
257
+ decls << AST::Members::Extend.new(
258
+ name: name,
259
+ args: [],
260
+ annotations: [],
261
+ location: nil,
262
+ comment: comments[node.first_lineno - 1]
263
+ )
264
+ end
265
+ end
266
+ when :attr_reader
267
+ args.each do |arg|
268
+ if arg && (name = literal_to_symbol(arg))
269
+ decls << AST::Members::AttrReader.new(
270
+ name: name,
271
+ ivar_name: nil,
272
+ type: Types::Bases::Any.new(location: nil),
273
+ kind: context.attribute_kind,
274
+ location: nil,
275
+ comment: comments[node.first_lineno - 1],
276
+ annotations: []
277
+ )
278
+ end
279
+ end
280
+ when :attr_accessor
281
+ args.each do |arg|
282
+ if arg && (name = literal_to_symbol(arg))
283
+ decls << AST::Members::AttrAccessor.new(
284
+ name: name,
285
+ ivar_name: nil,
286
+ type: Types::Bases::Any.new(location: nil),
287
+ kind: context.attribute_kind,
288
+ location: nil,
289
+ comment: comments[node.first_lineno - 1],
290
+ annotations: []
291
+ )
292
+ end
293
+ end
294
+ when :attr_writer
295
+ args.each do |arg|
296
+ if arg && (name = literal_to_symbol(arg))
297
+ decls << AST::Members::AttrWriter.new(
298
+ name: name,
299
+ ivar_name: nil,
300
+ type: Types::Bases::Any.new(location: nil),
301
+ kind: context.attribute_kind,
302
+ location: nil,
303
+ comment: comments[node.first_lineno - 1],
304
+ annotations: []
305
+ )
306
+ end
307
+ end
308
+ when :alias_method
309
+ if args[0] && args[1] && (new_name = literal_to_symbol(args[0])) && (old_name = literal_to_symbol(args[1]))
310
+ decls << AST::Members::Alias.new(
311
+ new_name: new_name,
312
+ old_name: old_name,
313
+ kind: context.singleton ? :singleton : :instance,
314
+ annotations: [],
315
+ location: nil,
316
+ comment: comments[node.first_lineno - 1],
317
+ )
318
+ end
319
+ when :module_function
320
+ if args.empty?
321
+ context.module_function = true
322
+ else
323
+ module_func_context = context.update(module_function: true)
324
+ args.each do |arg|
325
+ if arg && (name = literal_to_symbol(arg))
326
+ if (i, defn = find_def_index_by_name(decls, name))
327
+ if defn.is_a?(AST::Members::MethodDefinition)
328
+ decls[i] = defn.update(kind: :singleton_instance)
329
+ end
330
+ end
331
+ elsif arg
332
+ process arg, decls: decls, comments: comments, context: module_func_context
333
+ end
334
+ end
335
+ end
336
+ when :public, :private
337
+ accessibility = __send__(node.children[0])
338
+ if args.empty?
339
+ decls << accessibility
340
+ else
341
+ args.each do |arg|
342
+ if arg && (name = literal_to_symbol(arg))
343
+ if (i, _ = find_def_index_by_name(decls, name))
344
+ current = current_accessibility(decls, i)
345
+ if current != accessibility
346
+ decls.insert(i + 1, current)
347
+ decls.insert(i, accessibility)
348
+ end
349
+ end
350
+ end
351
+ end
352
+
353
+ # For `private def foo` syntax
354
+ current = current_accessibility(decls)
355
+ decls << accessibility
356
+ process_children(node, decls: decls, comments: comments, context: context)
357
+ decls << current
358
+ end
359
+ else
360
+ process_children(node, decls: decls, comments: comments, context: context)
361
+ end
362
+
363
+ when :ITER
364
+ # ignore
365
+
366
+ when :CDECL
367
+ const_name = case
368
+ when node.children[0].is_a?(Symbol)
369
+ TypeName.new(name: node.children[0], namespace: Namespace.empty)
370
+ else
371
+ const_to_name!(node.children[0], context: context)
372
+ end
373
+
374
+ value_node = node.children.last
375
+ type = if value_node.nil?
376
+ # Give up type prediction when node is MASGN.
377
+ Types::Bases::Any.new(location: nil)
378
+ else
379
+ literal_to_type(value_node)
380
+ end
381
+ decls << AST::Declarations::Constant.new(
382
+ name: const_name,
383
+ type: type,
384
+ location: nil,
385
+ comment: comments[node.first_lineno - 1]
386
+ )
387
+
388
+ when :IASGN
389
+ case [context.singleton, context.in_def]
390
+ when [true, true], [false, false]
391
+ member = AST::Members::ClassInstanceVariable.new(
392
+ name: node.children.first,
393
+ type: Types::Bases::Any.new(location: nil),
394
+ location: nil,
395
+ comment: comments[node.first_lineno - 1]
396
+ )
397
+ when [false, true]
398
+ member = AST::Members::InstanceVariable.new(
399
+ name: node.children.first,
400
+ type: Types::Bases::Any.new(location: nil),
401
+ location: nil,
402
+ comment: comments[node.first_lineno - 1]
403
+ )
404
+ when [true, false]
405
+ # The variable is for the singleton class of the class object.
406
+ # RBS does not have a way to represent it. So we ignore it.
407
+ else
408
+ raise 'unreachable'
409
+ end
410
+
411
+ decls.push member if member && !decls.include?(member)
412
+
413
+ when :CVASGN
414
+ member = AST::Members::ClassVariable.new(
415
+ name: node.children.first,
416
+ type: Types::Bases::Any.new(location: nil),
417
+ location: nil,
418
+ comment: comments[node.first_lineno - 1]
419
+ )
420
+ decls.push member unless decls.include?(member)
421
+ else
422
+ process_children(node, decls: decls, comments: comments, context: context)
423
+ end
424
+ end
425
+
426
+ def process_children(node, decls:, comments:, context:)
427
+ each_child node do |child|
428
+ process child, decls: decls, comments: comments, context: context
429
+ end
430
+ end
431
+
432
+ def const_to_name!(node, context: nil)
433
+ case node.type
434
+ when :CONST
435
+ TypeName.new(name: node.children[0], namespace: Namespace.empty)
436
+ when :COLON2
437
+ if node.children[0]
438
+ namespace = const_to_name!(node.children[0], context: context).to_namespace
439
+ else
440
+ namespace = Namespace.empty
441
+ end
442
+
443
+ TypeName.new(name: node.children[1], namespace: namespace)
444
+ when :COLON3
445
+ TypeName.new(name: node.children[0], namespace: Namespace.root)
446
+ when :SELF
447
+ raise if context.nil?
448
+
449
+ context.namespace.to_type_name
450
+ else
451
+ raise
452
+ end
453
+ end
454
+
455
+ def const_to_name(node, context:)
456
+ if node
457
+ case node.type
458
+ when :SELF
459
+ context.namespace.to_type_name
460
+ when :CONST, :COLON2, :COLON3
461
+ const_to_name!(node) rescue nil
462
+ end
463
+ end
464
+ end
465
+
466
+ def literal_to_symbol(node)
467
+ case node.type
468
+ when :SYM
469
+ node.children[0]
470
+ when :LIT
471
+ node.children[0] if node.children[0].is_a?(Symbol)
472
+ when :STR
473
+ node.children[0].to_sym
474
+ end
475
+ end
476
+
477
+ def function_type_from_body(node, def_name)
478
+ table_node, args_node, *_ = node.children
479
+
480
+ pre_num, _pre_init, opt, _first_post, post_num, _post_init, rest, kw, kwrest, _block = args_from_node(args_node)
481
+
482
+ return_type = if def_name == :initialize
483
+ Types::Bases::Void.new(location: nil)
484
+ else
485
+ function_return_type_from_body(node)
486
+ end
487
+
488
+ fun = Types::Function.empty(return_type)
489
+
490
+ table_node.take(pre_num).each do |name|
491
+ fun.required_positionals << Types::Function::Param.new(name: name, type: untyped)
492
+ end
493
+
494
+ while opt&.type == :OPT_ARG
495
+ lvasgn, opt = opt.children
496
+ name = lvasgn.children[0]
497
+ fun.optional_positionals << Types::Function::Param.new(
498
+ name: name,
499
+ type: param_type(lvasgn.children[1])
500
+ )
501
+ end
502
+
503
+ if rest
504
+ rest_name = rest == :* ? nil : rest # `def f(...)` syntax has `*` name
505
+ fun = fun.update(rest_positionals: Types::Function::Param.new(name: rest_name, type: untyped))
506
+ end
507
+
508
+ table_node.drop(fun.required_positionals.size + fun.optional_positionals.size + (fun.rest_positionals ? 1 : 0)).take(post_num).each do |name|
509
+ fun.trailing_positionals << Types::Function::Param.new(name: name, type: untyped)
510
+ end
511
+
512
+ while kw
513
+ lvasgn, kw = kw.children
514
+ name, value = lvasgn.children
515
+
516
+ case value
517
+ when nil, :NODE_SPECIAL_REQUIRED_KEYWORD
518
+ fun.required_keywords[name] = Types::Function::Param.new(name: nil, type: untyped)
519
+ when RubyVM::AbstractSyntaxTree::Node
520
+ fun.optional_keywords[name] = Types::Function::Param.new(name: nil, type: param_type(value))
521
+ else
522
+ raise "Unexpected keyword arg value: #{value}"
523
+ end
524
+ end
525
+
526
+ if kwrest && kwrest.children.any?
527
+ kwrest_name = kwrest.children[0] #: Symbol?
528
+ kwrest_name = nil if kwrest_name == :** # `def f(...)` syntax has `**` name
529
+ fun = fun.update(rest_keywords: Types::Function::Param.new(name: kwrest_name, type: untyped))
530
+ end
531
+
532
+ fun
533
+ end
534
+
535
+ def function_return_type_from_body(node)
536
+ body = node.children[2]
537
+ body_type(body)
538
+ end
539
+
540
+ def body_type(node)
541
+ return Types::Bases::Nil.new(location: nil) unless node
542
+
543
+ case node.type
544
+ when :IF, :UNLESS
545
+ if_unless_type(node)
546
+ when :BLOCK
547
+ block_type(node)
548
+ else
549
+ literal_to_type(node)
550
+ end
551
+ end
552
+
553
+ def if_unless_type(node)
554
+ raise unless node.type == :IF || node.type == :UNLESS
555
+
556
+ _exp_node, true_node, false_node = node.children
557
+ types_to_union_type([body_type(true_node), body_type(false_node)])
558
+ end
559
+
560
+ def block_type(node)
561
+ raise unless node.type == :BLOCK
562
+
563
+ return_stmts = any_node?(node) do |n|
564
+ n.type == :RETURN
565
+ end&.map do |return_node|
566
+ returned_value = return_node.children[0]
567
+ returned_value ? literal_to_type(returned_value) : Types::Bases::Nil.new(location: nil)
568
+ end || []
569
+ last_node = node.children.last
570
+ last_evaluated = last_node ? literal_to_type(last_node) : Types::Bases::Nil.new(location: nil)
571
+ types_to_union_type([*return_stmts, last_evaluated])
572
+ end
573
+
574
+ def literal_to_type(node)
575
+ case node.type
576
+ when :STR
577
+ lit = node.children[0]
578
+ if lit.ascii_only?
579
+ Types::Literal.new(literal: lit, location: nil)
580
+ else
581
+ BuiltinNames::String.instance_type
582
+ end
583
+ when :DSTR, :XSTR
584
+ BuiltinNames::String.instance_type
585
+ when :SYM
586
+ lit = node.children[0]
587
+ if lit.to_s.ascii_only?
588
+ Types::Literal.new(literal: lit, location: nil)
589
+ else
590
+ BuiltinNames::Symbol.instance_type
591
+ end
592
+ when :DSYM
593
+ BuiltinNames::Symbol.instance_type
594
+ when :DREGX, :REGX
595
+ BuiltinNames::Regexp.instance_type
596
+ when :TRUE
597
+ Types::Literal.new(literal: true, location: nil)
598
+ when :FALSE
599
+ Types::Literal.new(literal: false, location: nil)
600
+ when :NIL
601
+ Types::Bases::Nil.new(location: nil)
602
+ when :INTEGER
603
+ Types::Literal.new(literal: node.children[0], location: nil)
604
+ when :FLOAT
605
+ BuiltinNames::Float.instance_type
606
+ when :RATIONAL, :IMAGINARY
607
+ lit = node.children[0]
608
+ type_name = TypeName.new(name: lit.class.name.to_sym, namespace: Namespace.root)
609
+ Types::ClassInstance.new(name: type_name, args: [], location: nil)
610
+ when :LIT
611
+ lit = node.children[0]
612
+ case lit
613
+ when Symbol
614
+ if lit.to_s.ascii_only?
615
+ Types::Literal.new(literal: lit, location: nil)
616
+ else
617
+ BuiltinNames::Symbol.instance_type
618
+ end
619
+ when Integer
620
+ Types::Literal.new(literal: lit, location: nil)
621
+ when String
622
+ # For Ruby <=3.3 which generates `LIT` node for string literals inside Hash literal.
623
+ # "a" => STR node
624
+ # { "a" => nil } => LIT node
625
+ Types::Literal.new(literal: lit, location: nil)
626
+ else
627
+ type_name = TypeName.new(name: lit.class.name.to_sym, namespace: Namespace.root)
628
+ Types::ClassInstance.new(name: type_name, args: [], location: nil)
629
+ end
630
+ when :ZLIST, :ZARRAY
631
+ BuiltinNames::Array.instance_type(untyped)
632
+ when :LIST, :ARRAY
633
+ elem_types = node.children.compact.map { |e| literal_to_type(e) }
634
+ t = types_to_union_type(elem_types)
635
+ BuiltinNames::Array.instance_type(t)
636
+ when :DOT2, :DOT3
637
+ types = node.children.map { |c| literal_to_type(c) }
638
+ type = range_element_type(types)
639
+ BuiltinNames::Range.instance_type(type)
640
+ when :HASH
641
+ list = node.children[0]
642
+ if list
643
+ children = list.children
644
+ children.pop
645
+ else
646
+ children = [] #: Array[untyped]
647
+ end
648
+
649
+ key_types = [] #: Array[Types::t]
650
+ value_types = [] #: Array[Types::t]
651
+ children.each_slice(2) do |k, v|
652
+ if k
653
+ key_types << literal_to_type(k)
654
+ value_types << literal_to_type(v)
655
+ else
656
+ key_types << untyped
657
+ value_types << untyped
658
+ end
659
+ end
660
+
661
+ if !key_types.empty? && key_types.all? { |t| t.is_a?(Types::Literal) }
662
+ fields = key_types.map {|t|
663
+ t.is_a?(Types::Literal) or raise
664
+ t.literal
665
+ }.zip(value_types).to_h #: Hash[Types::Literal::literal, Types::t]
666
+ Types::Record.new(fields: fields, location: nil)
667
+ else
668
+ key_type = types_to_union_type(key_types)
669
+ value_type = types_to_union_type(value_types)
670
+ BuiltinNames::Hash.instance_type(key_type, value_type)
671
+ end
672
+ when :SELF
673
+ Types::Bases::Self.new(location: nil)
674
+ when :CALL
675
+ receiver, method_name, * = node.children
676
+ case method_name
677
+ when :freeze, :tap, :itself, :dup, :clone, :taint, :untaint, :extend
678
+ literal_to_type(receiver)
679
+ else
680
+ untyped
681
+ end
682
+ else
683
+ untyped
684
+ end
685
+ end
686
+
687
+ def types_to_union_type(types)
688
+ return untyped if types.empty?
689
+
690
+ uniq = types.uniq
691
+ if uniq.size == 1
692
+ return uniq.first || raise
693
+ end
694
+
695
+ Types::Union.new(types: uniq, location: nil)
696
+ end
697
+
698
+ def range_element_type(types)
699
+ types = types.reject { |t| t == untyped }
700
+ return untyped if types.empty?
701
+
702
+ types = types.map do |t|
703
+ if t.is_a?(Types::Literal)
704
+ type_name = TypeName.new(name: t.literal.class.name&.to_sym || raise, namespace: Namespace.root)
705
+ Types::ClassInstance.new(name: type_name, args: [], location: nil)
706
+ else
707
+ t
708
+ end
709
+ end.uniq
710
+
711
+ if types.size == 1
712
+ types.first or raise
713
+ else
714
+ untyped
715
+ end
716
+ end
717
+
718
+ def param_type(node, default: Types::Bases::Any.new(location: nil))
719
+ case node.type
720
+ when :INTEGER
721
+ BuiltinNames::Integer.instance_type
722
+ when :FLOAT
723
+ BuiltinNames::Float.instance_type
724
+ when :RATIONAL
725
+ Types::ClassInstance.new(name: TypeName.parse("::Rational"), args: [], location: nil)
726
+ when :IMAGINARY
727
+ Types::ClassInstance.new(name: TypeName.parse("::Complex"), args: [], location: nil)
728
+ when :LIT
729
+ case node.children[0]
730
+ when Symbol
731
+ BuiltinNames::Symbol.instance_type
732
+ when Integer
733
+ BuiltinNames::Integer.instance_type
734
+ when Float
735
+ BuiltinNames::Float.instance_type
736
+ else
737
+ default
738
+ end
739
+ when :SYM
740
+ BuiltinNames::Symbol.instance_type
741
+ when :STR, :DSTR
742
+ BuiltinNames::String.instance_type
743
+ when :NIL
744
+ # This type is technical non-sense, but may help practically.
745
+ Types::Optional.new(
746
+ type: Types::Bases::Any.new(location: nil),
747
+ location: nil
748
+ )
749
+ when :TRUE, :FALSE
750
+ Types::Bases::Bool.new(location: nil)
751
+ when :ARRAY, :LIST
752
+ BuiltinNames::Array.instance_type(default)
753
+ when :HASH
754
+ BuiltinNames::Hash.instance_type(default, default)
755
+ else
756
+ default
757
+ end
758
+ end
759
+
760
+ # backward compatible
761
+ alias node_type param_type
762
+
763
+ def private
764
+ @private ||= AST::Members::Private.new(location: nil)
765
+ end
766
+
767
+ def public
768
+ @public ||= AST::Members::Public.new(location: nil)
769
+ end
770
+
771
+ def current_accessibility(decls, index = decls.size)
772
+ slice = decls.slice(0, index) or raise
773
+ idx = slice.rindex { |decl| decl == private || decl == public }
774
+ if idx
775
+ _ = decls[idx]
776
+ else
777
+ public
778
+ end
779
+ end
780
+
781
+ def remove_unnecessary_accessibility_methods!(decls)
782
+ # @type var current: decl
783
+ current = public
784
+ idx = 0
785
+
786
+ loop do
787
+ decl = decls[idx] or break
788
+ if current == decl
789
+ decls.delete_at(idx)
790
+ next
791
+ end
792
+
793
+ if 0 < idx && is_accessibility?(decls[idx - 1]) && is_accessibility?(decl)
794
+ decls.delete_at(idx - 1)
795
+ idx -= 1
796
+ current = current_accessibility(decls, idx)
797
+ next
798
+ end
799
+
800
+ current = decl if is_accessibility?(decl)
801
+ idx += 1
802
+ end
803
+
804
+ decls.pop while decls.last && is_accessibility?(decls.last || raise)
805
+ end
806
+
807
+ def is_accessibility?(decl)
808
+ decl == public || decl == private
809
+ end
810
+
811
+ def find_def_index_by_name(decls, name)
812
+ index = decls.find_index do |decl|
813
+ case decl
814
+ when AST::Members::MethodDefinition, AST::Members::AttrReader
815
+ decl.name == name
816
+ when AST::Members::AttrWriter
817
+ :"#{decl.name}=" == name
818
+ end
819
+ end
820
+
821
+ if index
822
+ [
823
+ index,
824
+ _ = decls[index]
825
+ ]
826
+ end
827
+ end
828
+
829
+ def sort_members!(decls)
830
+ i = 0
831
+ orders = {
832
+ AST::Members::ClassVariable => -3,
833
+ AST::Members::ClassInstanceVariable => -2,
834
+ AST::Members::InstanceVariable => -1,
835
+ } #: Hash[Class, Integer]
836
+ decls.sort_by! { |decl| [orders.fetch(decl.class, 0), i += 1] }
837
+ end
838
+ end
839
+ end
840
+ end