rbs 4.1.0.pre.2-java

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 (574) hide show
  1. checksums.yaml +7 -0
  2. data/.clang-format +75 -0
  3. data/.clangd +2 -0
  4. data/.github/dependabot.yml +24 -0
  5. data/.github/workflows/bundle-update.yml +63 -0
  6. data/.github/workflows/c-check.yml +61 -0
  7. data/.github/workflows/comments.yml +37 -0
  8. data/.github/workflows/dependabot.yml +30 -0
  9. data/.github/workflows/jruby.yml +67 -0
  10. data/.github/workflows/milestone.yml +83 -0
  11. data/.github/workflows/ruby.yml +158 -0
  12. data/.github/workflows/rust.yml +184 -0
  13. data/.github/workflows/truffleruby.yml +54 -0
  14. data/.github/workflows/typecheck.yml +39 -0
  15. data/.github/workflows/wasm.yml +53 -0
  16. data/.github/workflows/windows.yml +49 -0
  17. data/.gitignore +38 -0
  18. data/.rubocop.yml +72 -0
  19. data/BSDL +22 -0
  20. data/CHANGELOG.md +2292 -0
  21. data/COPYING +56 -0
  22. data/README.md +240 -0
  23. data/Rakefile +869 -0
  24. data/Steepfile +53 -0
  25. data/config.yml +913 -0
  26. data/core/array.rbs +4142 -0
  27. data/core/basic_object.rbs +376 -0
  28. data/core/binding.rbs +148 -0
  29. data/core/builtin.rbs +278 -0
  30. data/core/class.rbs +223 -0
  31. data/core/comparable.rbs +192 -0
  32. data/core/complex.rbs +812 -0
  33. data/core/constants.rbs +96 -0
  34. data/core/data.rbs +415 -0
  35. data/core/dir.rbs +993 -0
  36. data/core/encoding.rbs +1368 -0
  37. data/core/enumerable.rbs +2506 -0
  38. data/core/enumerator/arithmetic_sequence.rbs +70 -0
  39. data/core/enumerator/product.rbs +92 -0
  40. data/core/enumerator.rbs +705 -0
  41. data/core/env.rbs +6 -0
  42. data/core/errno.rbs +682 -0
  43. data/core/errors.rbs +789 -0
  44. data/core/exception.rbs +485 -0
  45. data/core/false_class.rbs +82 -0
  46. data/core/fiber.rbs +570 -0
  47. data/core/fiber_error.rbs +11 -0
  48. data/core/file.rbs +2045 -0
  49. data/core/file_constants.rbs +463 -0
  50. data/core/file_stat.rbs +534 -0
  51. data/core/file_test.rbs +331 -0
  52. data/core/float.rbs +1316 -0
  53. data/core/gc.rbs +788 -0
  54. data/core/global_variables.rbs +184 -0
  55. data/core/hash.rbs +2183 -0
  56. data/core/integer.rbs +1374 -0
  57. data/core/io/buffer.rbs +995 -0
  58. data/core/io/wait.rbs +48 -0
  59. data/core/io.rbs +3472 -0
  60. data/core/kernel.rbs +3172 -0
  61. data/core/marshal.rbs +207 -0
  62. data/core/match_data.rbs +637 -0
  63. data/core/math.rbs +770 -0
  64. data/core/method.rbs +422 -0
  65. data/core/module.rbs +1856 -0
  66. data/core/nil_class.rbs +210 -0
  67. data/core/numeric.rbs +832 -0
  68. data/core/object.rbs +108 -0
  69. data/core/object_space/weak_key_map.rbs +166 -0
  70. data/core/object_space.rbs +197 -0
  71. data/core/pathname.rbs +1322 -0
  72. data/core/proc.rbs +905 -0
  73. data/core/process.rbs +2316 -0
  74. data/core/ractor.rbs +924 -0
  75. data/core/random.rbs +255 -0
  76. data/core/range.rbs +1209 -0
  77. data/core/rational.rbs +502 -0
  78. data/core/rb_config.rbs +88 -0
  79. data/core/rbs/ops.rbs +154 -0
  80. data/core/rbs/unnamed/argf.rbs +1236 -0
  81. data/core/rbs/unnamed/env_class.rbs +1214 -0
  82. data/core/rbs/unnamed/main_class.rbs +123 -0
  83. data/core/rbs/unnamed/random.rbs +186 -0
  84. data/core/refinement.rbs +59 -0
  85. data/core/regexp.rbs +1974 -0
  86. data/core/ruby.rbs +53 -0
  87. data/core/ruby_vm.rbs +809 -0
  88. data/core/rubygems/basic_specification.rbs +6 -0
  89. data/core/rubygems/config_file.rbs +38 -0
  90. data/core/rubygems/dependency_installer.rbs +6 -0
  91. data/core/rubygems/errors.rbs +109 -0
  92. data/core/rubygems/installer.rbs +15 -0
  93. data/core/rubygems/path_support.rbs +6 -0
  94. data/core/rubygems/platform.rbs +7 -0
  95. data/core/rubygems/request_set.rbs +49 -0
  96. data/core/rubygems/requirement.rbs +148 -0
  97. data/core/rubygems/rubygems.rbs +1105 -0
  98. data/core/rubygems/source_list.rbs +15 -0
  99. data/core/rubygems/specification.rbs +23 -0
  100. data/core/rubygems/stream_ui.rbs +5 -0
  101. data/core/rubygems/uninstaller.rbs +10 -0
  102. data/core/rubygems/version.rbs +293 -0
  103. data/core/set.rbs +751 -0
  104. data/core/signal.rbs +110 -0
  105. data/core/string.rbs +5532 -0
  106. data/core/struct.rbs +668 -0
  107. data/core/symbol.rbs +482 -0
  108. data/core/thread.rbs +1826 -0
  109. data/core/thread_group.rbs +79 -0
  110. data/core/time.rbs +1793 -0
  111. data/core/trace_point.rbs +483 -0
  112. data/core/true_class.rbs +98 -0
  113. data/core/unbound_method.rbs +337 -0
  114. data/core/warning.rbs +87 -0
  115. data/docs/CONTRIBUTING.md +107 -0
  116. data/docs/aliases.md +79 -0
  117. data/docs/architecture.md +110 -0
  118. data/docs/collection.md +192 -0
  119. data/docs/config.md +171 -0
  120. data/docs/data_and_struct.md +86 -0
  121. data/docs/encoding.md +56 -0
  122. data/docs/gem.md +56 -0
  123. data/docs/inline.md +634 -0
  124. data/docs/rbs_by_example.md +309 -0
  125. data/docs/repo.md +125 -0
  126. data/docs/rust.md +96 -0
  127. data/docs/sigs.md +167 -0
  128. data/docs/stdlib.md +147 -0
  129. data/docs/syntax.md +940 -0
  130. data/docs/tools.md +17 -0
  131. data/docs/type_fingerprint.md +21 -0
  132. data/docs/wasm_serialization.md +80 -0
  133. data/exe/rbs +7 -0
  134. data/ext/rbs_extension/ast_translation.c +1855 -0
  135. data/ext/rbs_extension/ast_translation.h +41 -0
  136. data/ext/rbs_extension/class_constants.c +187 -0
  137. data/ext/rbs_extension/class_constants.h +104 -0
  138. data/ext/rbs_extension/compat.h +10 -0
  139. data/ext/rbs_extension/extconf.rb +40 -0
  140. data/ext/rbs_extension/legacy_location.c +294 -0
  141. data/ext/rbs_extension/legacy_location.h +82 -0
  142. data/ext/rbs_extension/main.c +613 -0
  143. data/ext/rbs_extension/rbs_extension.h +16 -0
  144. data/ext/rbs_extension/rbs_string_bridging.c +9 -0
  145. data/ext/rbs_extension/rbs_string_bridging.h +24 -0
  146. data/goodcheck.yml +91 -0
  147. data/include/rbs/ast.h +1047 -0
  148. data/include/rbs/defines.h +99 -0
  149. data/include/rbs/lexer.h +207 -0
  150. data/include/rbs/location.h +40 -0
  151. data/include/rbs/parser.h +153 -0
  152. data/include/rbs/serialize.h +39 -0
  153. data/include/rbs/string.h +47 -0
  154. data/include/rbs/util/rbs_allocator.h +59 -0
  155. data/include/rbs/util/rbs_assert.h +20 -0
  156. data/include/rbs/util/rbs_buffer.h +83 -0
  157. data/include/rbs/util/rbs_constant_pool.h +155 -0
  158. data/include/rbs/util/rbs_encoding.h +282 -0
  159. data/include/rbs/util/rbs_unescape.h +24 -0
  160. data/include/rbs.h +14 -0
  161. data/lib/rbs/ancestor_graph.rb +92 -0
  162. data/lib/rbs/annotate/annotations.rb +199 -0
  163. data/lib/rbs/annotate/formatter.rb +82 -0
  164. data/lib/rbs/annotate/rdoc_annotator.rb +398 -0
  165. data/lib/rbs/annotate/rdoc_source.rb +131 -0
  166. data/lib/rbs/annotate.rb +8 -0
  167. data/lib/rbs/ast/annotation.rb +29 -0
  168. data/lib/rbs/ast/comment.rb +29 -0
  169. data/lib/rbs/ast/declarations.rb +472 -0
  170. data/lib/rbs/ast/directives.rb +49 -0
  171. data/lib/rbs/ast/members.rb +451 -0
  172. data/lib/rbs/ast/ruby/annotations.rb +451 -0
  173. data/lib/rbs/ast/ruby/comment_block.rb +247 -0
  174. data/lib/rbs/ast/ruby/declarations.rb +291 -0
  175. data/lib/rbs/ast/ruby/helpers/constant_helper.rb +28 -0
  176. data/lib/rbs/ast/ruby/helpers/location_helper.rb +15 -0
  177. data/lib/rbs/ast/ruby/members.rb +762 -0
  178. data/lib/rbs/ast/type_param.rb +235 -0
  179. data/lib/rbs/ast/visitor.rb +137 -0
  180. data/lib/rbs/buffer.rb +189 -0
  181. data/lib/rbs/builtin_names.rb +58 -0
  182. data/lib/rbs/cli/colored_io.rb +48 -0
  183. data/lib/rbs/cli/diff.rb +84 -0
  184. data/lib/rbs/cli/validate.rb +294 -0
  185. data/lib/rbs/cli.rb +1253 -0
  186. data/lib/rbs/collection/cleaner.rb +38 -0
  187. data/lib/rbs/collection/config/lockfile.rb +92 -0
  188. data/lib/rbs/collection/config/lockfile_generator.rb +269 -0
  189. data/lib/rbs/collection/config.rb +81 -0
  190. data/lib/rbs/collection/installer.rb +32 -0
  191. data/lib/rbs/collection/sources/base.rb +14 -0
  192. data/lib/rbs/collection/sources/git.rb +265 -0
  193. data/lib/rbs/collection/sources/local.rb +81 -0
  194. data/lib/rbs/collection/sources/rubygems.rb +48 -0
  195. data/lib/rbs/collection/sources/stdlib.rb +50 -0
  196. data/lib/rbs/collection/sources.rb +38 -0
  197. data/lib/rbs/collection.rb +16 -0
  198. data/lib/rbs/constant.rb +28 -0
  199. data/lib/rbs/definition.rb +415 -0
  200. data/lib/rbs/definition_builder/ancestor_builder.rb +678 -0
  201. data/lib/rbs/definition_builder/method_builder.rb +295 -0
  202. data/lib/rbs/definition_builder.rb +1054 -0
  203. data/lib/rbs/diff.rb +131 -0
  204. data/lib/rbs/environment/class_entry.rb +69 -0
  205. data/lib/rbs/environment/module_entry.rb +66 -0
  206. data/lib/rbs/environment/use_map.rb +77 -0
  207. data/lib/rbs/environment.rb +1028 -0
  208. data/lib/rbs/environment_loader.rb +167 -0
  209. data/lib/rbs/environment_walker.rb +155 -0
  210. data/lib/rbs/errors.rb +634 -0
  211. data/lib/rbs/factory.rb +18 -0
  212. data/lib/rbs/file_finder.rb +28 -0
  213. data/lib/rbs/inline_parser/comment_association.rb +117 -0
  214. data/lib/rbs/inline_parser.rb +568 -0
  215. data/lib/rbs/location_aux.rb +170 -0
  216. data/lib/rbs/locator.rb +247 -0
  217. data/lib/rbs/method_type.rb +145 -0
  218. data/lib/rbs/namespace.rb +154 -0
  219. data/lib/rbs/parser/lex_result.rb +15 -0
  220. data/lib/rbs/parser/token.rb +23 -0
  221. data/lib/rbs/parser_aux.rb +142 -0
  222. data/lib/rbs/prototype/helpers.rb +197 -0
  223. data/lib/rbs/prototype/node_usage.rb +99 -0
  224. data/lib/rbs/prototype/rb.rb +816 -0
  225. data/lib/rbs/prototype/rbi.rb +625 -0
  226. data/lib/rbs/prototype/runtime/helpers.rb +59 -0
  227. data/lib/rbs/prototype/runtime/reflection.rb +19 -0
  228. data/lib/rbs/prototype/runtime/value_object_generator.rb +279 -0
  229. data/lib/rbs/prototype/runtime.rb +680 -0
  230. data/lib/rbs/repository.rb +127 -0
  231. data/lib/rbs/resolver/constant_resolver.rb +219 -0
  232. data/lib/rbs/resolver/type_name_resolver.rb +167 -0
  233. data/lib/rbs/rewriter.rb +70 -0
  234. data/lib/rbs/sorter.rb +198 -0
  235. data/lib/rbs/source.rb +99 -0
  236. data/lib/rbs/substitution.rb +83 -0
  237. data/lib/rbs/subtractor.rb +204 -0
  238. data/lib/rbs/test/errors.rb +80 -0
  239. data/lib/rbs/test/guaranteed.rb +30 -0
  240. data/lib/rbs/test/hook.rb +212 -0
  241. data/lib/rbs/test/observer.rb +19 -0
  242. data/lib/rbs/test/setup.rb +84 -0
  243. data/lib/rbs/test/setup_helper.rb +50 -0
  244. data/lib/rbs/test/tester.rb +167 -0
  245. data/lib/rbs/test/type_check.rb +457 -0
  246. data/lib/rbs/test.rb +112 -0
  247. data/lib/rbs/type_alias_dependency.rb +100 -0
  248. data/lib/rbs/type_alias_regularity.rb +126 -0
  249. data/lib/rbs/type_name.rb +122 -0
  250. data/lib/rbs/types.rb +1604 -0
  251. data/lib/rbs/unit_test/convertibles.rb +177 -0
  252. data/lib/rbs/unit_test/spy.rb +138 -0
  253. data/lib/rbs/unit_test/type_assertions.rb +383 -0
  254. data/lib/rbs/unit_test/with_aliases.rb +145 -0
  255. data/lib/rbs/unit_test.rb +6 -0
  256. data/lib/rbs/validator.rb +186 -0
  257. data/lib/rbs/variance_calculator.rb +189 -0
  258. data/lib/rbs/vendorer.rb +71 -0
  259. data/lib/rbs/version.rb +5 -0
  260. data/lib/rbs/wasm/deserializer.rb +213 -0
  261. data/lib/rbs/wasm/jars/asm-analysis.jar +0 -0
  262. data/lib/rbs/wasm/jars/asm-commons.jar +0 -0
  263. data/lib/rbs/wasm/jars/asm-tree.jar +0 -0
  264. data/lib/rbs/wasm/jars/asm-util.jar +0 -0
  265. data/lib/rbs/wasm/jars/asm.jar +0 -0
  266. data/lib/rbs/wasm/jars/compiler.jar +0 -0
  267. data/lib/rbs/wasm/jars/log.jar +0 -0
  268. data/lib/rbs/wasm/jars/runtime.jar +0 -0
  269. data/lib/rbs/wasm/jars/wasi.jar +0 -0
  270. data/lib/rbs/wasm/jars/wasm.jar +0 -0
  271. data/lib/rbs/wasm/location.rb +61 -0
  272. data/lib/rbs/wasm/parser.rb +137 -0
  273. data/lib/rbs/wasm/rbs_parser.wasm +0 -0
  274. data/lib/rbs/wasm/runtime.rb +217 -0
  275. data/lib/rbs/wasm/serialization_schema.rb +110 -0
  276. data/lib/rbs/writer.rb +424 -0
  277. data/lib/rbs.rb +117 -0
  278. data/lib/rdoc/discover.rb +20 -0
  279. data/lib/rdoc_plugin/parser.rb +163 -0
  280. data/rbs.gemspec +68 -0
  281. data/schema/annotation.json +14 -0
  282. data/schema/comment.json +26 -0
  283. data/schema/decls.json +326 -0
  284. data/schema/function.json +87 -0
  285. data/schema/location.json +56 -0
  286. data/schema/members.json +266 -0
  287. data/schema/methodType.json +50 -0
  288. data/schema/typeParam.json +52 -0
  289. data/schema/types.json +317 -0
  290. data/sig/ancestor_builder.rbs +163 -0
  291. data/sig/ancestor_graph.rbs +60 -0
  292. data/sig/annotate/annotations.rbs +102 -0
  293. data/sig/annotate/formatter.rbs +24 -0
  294. data/sig/annotate/rdoc_annotater.rbs +85 -0
  295. data/sig/annotate/rdoc_source.rbs +32 -0
  296. data/sig/annotation.rbs +27 -0
  297. data/sig/ast/ruby/annotations.rbs +470 -0
  298. data/sig/ast/ruby/comment_block.rbs +127 -0
  299. data/sig/ast/ruby/declarations.rbs +158 -0
  300. data/sig/ast/ruby/helpers/constant_helper.rbs +11 -0
  301. data/sig/ast/ruby/helpers/location_helper.rbs +15 -0
  302. data/sig/ast/ruby/members.rbs +198 -0
  303. data/sig/buffer.rbs +108 -0
  304. data/sig/builtin_names.rbs +44 -0
  305. data/sig/cli/colored_io.rbs +15 -0
  306. data/sig/cli/diff.rbs +15 -0
  307. data/sig/cli/validate.rbs +47 -0
  308. data/sig/cli.rbs +89 -0
  309. data/sig/collection/cleaner.rbs +13 -0
  310. data/sig/collection/config/lockfile.rbs +74 -0
  311. data/sig/collection/config/lockfile_generator.rbs +68 -0
  312. data/sig/collection/config.rbs +46 -0
  313. data/sig/collection/installer.rbs +17 -0
  314. data/sig/collection/sources.rbs +214 -0
  315. data/sig/collection.rbs +4 -0
  316. data/sig/comment.rbs +26 -0
  317. data/sig/constant.rbs +21 -0
  318. data/sig/declarations.rbs +274 -0
  319. data/sig/definition.rbs +232 -0
  320. data/sig/definition_builder.rbs +181 -0
  321. data/sig/diff.rbs +28 -0
  322. data/sig/directives.rbs +77 -0
  323. data/sig/environment/class_entry.rbs +50 -0
  324. data/sig/environment/module_entry.rbs +50 -0
  325. data/sig/environment.rbs +286 -0
  326. data/sig/environment_loader.rbs +111 -0
  327. data/sig/environment_walker.rbs +65 -0
  328. data/sig/errors.rbs +408 -0
  329. data/sig/factory.rbs +5 -0
  330. data/sig/file_finder.rbs +28 -0
  331. data/sig/inline_parser/comment_association.rbs +71 -0
  332. data/sig/inline_parser.rbs +126 -0
  333. data/sig/location.rbs +135 -0
  334. data/sig/locator.rbs +56 -0
  335. data/sig/manifest.yaml +5 -0
  336. data/sig/members.rbs +258 -0
  337. data/sig/method_builder.rbs +89 -0
  338. data/sig/method_types.rbs +58 -0
  339. data/sig/namespace.rbs +161 -0
  340. data/sig/parser.rbs +164 -0
  341. data/sig/prototype/helpers.rbs +29 -0
  342. data/sig/prototype/node_usage.rbs +20 -0
  343. data/sig/prototype/rb.rbs +96 -0
  344. data/sig/prototype/rbi.rbs +75 -0
  345. data/sig/prototype/runtime.rbs +182 -0
  346. data/sig/rbs.rbs +21 -0
  347. data/sig/rdoc/rbs.rbs +67 -0
  348. data/sig/repository.rbs +85 -0
  349. data/sig/resolver/constant_resolver.rbs +92 -0
  350. data/sig/resolver/context.rbs +34 -0
  351. data/sig/resolver/type_name_resolver.rbs +61 -0
  352. data/sig/rewriter.rbs +45 -0
  353. data/sig/shims/bundler.rbs +38 -0
  354. data/sig/shims/enumerable.rbs +5 -0
  355. data/sig/shims/rubygems.rbs +19 -0
  356. data/sig/sorter.rbs +41 -0
  357. data/sig/source.rbs +48 -0
  358. data/sig/substitution.rbs +48 -0
  359. data/sig/subtractor.rbs +37 -0
  360. data/sig/test/errors.rbs +52 -0
  361. data/sig/test/guranteed.rbs +9 -0
  362. data/sig/test/type_check.rbs +19 -0
  363. data/sig/test.rbs +82 -0
  364. data/sig/type_alias_dependency.rbs +53 -0
  365. data/sig/type_alias_regularity.rbs +98 -0
  366. data/sig/type_param.rbs +115 -0
  367. data/sig/typename.rbs +89 -0
  368. data/sig/types.rbs +578 -0
  369. data/sig/unit_test/convertibles.rbs +154 -0
  370. data/sig/unit_test/spy.rbs +22 -0
  371. data/sig/unit_test/type_assertions.rbs +211 -0
  372. data/sig/unit_test/with_aliases.rbs +136 -0
  373. data/sig/use_map.rbs +35 -0
  374. data/sig/util.rbs +9 -0
  375. data/sig/validator.rbs +63 -0
  376. data/sig/variance_calculator.rbs +87 -0
  377. data/sig/vendorer.rbs +51 -0
  378. data/sig/version.rbs +3 -0
  379. data/sig/visitor.rbs +47 -0
  380. data/sig/wasm/deserializer.rbs +66 -0
  381. data/sig/wasm/serialization_schema.rbs +13 -0
  382. data/sig/writer.rbs +127 -0
  383. data/src/ast.c +1628 -0
  384. data/src/lexer.c +3217 -0
  385. data/src/lexer.re +155 -0
  386. data/src/lexstate.c +217 -0
  387. data/src/location.c +31 -0
  388. data/src/parser.c +4255 -0
  389. data/src/serialize.c +958 -0
  390. data/src/string.c +41 -0
  391. data/src/util/rbs_allocator.c +162 -0
  392. data/src/util/rbs_assert.c +19 -0
  393. data/src/util/rbs_buffer.c +54 -0
  394. data/src/util/rbs_constant_pool.c +268 -0
  395. data/src/util/rbs_encoding.c +21308 -0
  396. data/src/util/rbs_unescape.c +167 -0
  397. data/stdlib/abbrev/0/abbrev.rbs +66 -0
  398. data/stdlib/abbrev/0/array.rbs +26 -0
  399. data/stdlib/base64/0/base64.rbs +355 -0
  400. data/stdlib/benchmark/0/benchmark.rbs +452 -0
  401. data/stdlib/bigdecimal/0/big_decimal.rbs +1647 -0
  402. data/stdlib/bigdecimal-math/0/big_math.rbs +280 -0
  403. data/stdlib/bigdecimal-math/0/manifest.yaml +2 -0
  404. data/stdlib/cgi/0/core.rbs +911 -0
  405. data/stdlib/cgi/0/manifest.yaml +4 -0
  406. data/stdlib/cgi-escape/0/escape.rbs +171 -0
  407. data/stdlib/coverage/0/coverage.rbs +266 -0
  408. data/stdlib/csv/0/csv.rbs +3776 -0
  409. data/stdlib/csv/0/manifest.yaml +3 -0
  410. data/stdlib/date/0/date.rbs +1598 -0
  411. data/stdlib/date/0/date_time.rbs +617 -0
  412. data/stdlib/date/0/time.rbs +26 -0
  413. data/stdlib/dbm/0/dbm.rbs +421 -0
  414. data/stdlib/delegate/0/delegator.rbs +187 -0
  415. data/stdlib/delegate/0/kernel.rbs +47 -0
  416. data/stdlib/delegate/0/simple_delegator.rbs +96 -0
  417. data/stdlib/did_you_mean/0/did_you_mean.rbs +344 -0
  418. data/stdlib/digest/0/digest.rbs +687 -0
  419. data/stdlib/erb/0/erb.rbs +933 -0
  420. data/stdlib/etc/0/etc.rbs +884 -0
  421. data/stdlib/fileutils/0/fileutils.rbs +1753 -0
  422. data/stdlib/find/0/find.rbs +49 -0
  423. data/stdlib/forwardable/0/forwardable.rbs +271 -0
  424. data/stdlib/io-console/0/io-console.rbs +414 -0
  425. data/stdlib/ipaddr/0/ipaddr.rbs +436 -0
  426. data/stdlib/json/0/json.rbs +1963 -0
  427. data/stdlib/kconv/0/kconv.rbs +166 -0
  428. data/stdlib/logger/0/formatter.rbs +45 -0
  429. data/stdlib/logger/0/log_device.rbs +100 -0
  430. data/stdlib/logger/0/logger.rbs +796 -0
  431. data/stdlib/logger/0/manifest.yaml +2 -0
  432. data/stdlib/logger/0/period.rbs +17 -0
  433. data/stdlib/logger/0/severity.rbs +34 -0
  434. data/stdlib/minitest/0/kernel.rbs +42 -0
  435. data/stdlib/minitest/0/minitest/abstract_reporter.rbs +52 -0
  436. data/stdlib/minitest/0/minitest/assertion.rbs +17 -0
  437. data/stdlib/minitest/0/minitest/assertions.rbs +590 -0
  438. data/stdlib/minitest/0/minitest/backtrace_filter.rbs +23 -0
  439. data/stdlib/minitest/0/minitest/bench_spec.rbs +102 -0
  440. data/stdlib/minitest/0/minitest/benchmark.rbs +259 -0
  441. data/stdlib/minitest/0/minitest/composite_reporter.rbs +25 -0
  442. data/stdlib/minitest/0/minitest/compress.rbs +13 -0
  443. data/stdlib/minitest/0/minitest/error_on_warning.rbs +3 -0
  444. data/stdlib/minitest/0/minitest/expectation.rbs +2 -0
  445. data/stdlib/minitest/0/minitest/expectations.rbs +21 -0
  446. data/stdlib/minitest/0/minitest/guard.rbs +64 -0
  447. data/stdlib/minitest/0/minitest/mock.rbs +64 -0
  448. data/stdlib/minitest/0/minitest/parallel/executor.rbs +46 -0
  449. data/stdlib/minitest/0/minitest/parallel/test/class_methods.rbs +5 -0
  450. data/stdlib/minitest/0/minitest/parallel/test.rbs +3 -0
  451. data/stdlib/minitest/0/minitest/parallel.rbs +2 -0
  452. data/stdlib/minitest/0/minitest/pride_io.rbs +62 -0
  453. data/stdlib/minitest/0/minitest/pride_lol.rbs +19 -0
  454. data/stdlib/minitest/0/minitest/progress_reporter.rbs +11 -0
  455. data/stdlib/minitest/0/minitest/reportable.rbs +53 -0
  456. data/stdlib/minitest/0/minitest/reporter.rbs +5 -0
  457. data/stdlib/minitest/0/minitest/result.rbs +28 -0
  458. data/stdlib/minitest/0/minitest/runnable.rbs +163 -0
  459. data/stdlib/minitest/0/minitest/skip.rbs +6 -0
  460. data/stdlib/minitest/0/minitest/spec/dsl/instance_methods.rbs +48 -0
  461. data/stdlib/minitest/0/minitest/spec/dsl.rbs +129 -0
  462. data/stdlib/minitest/0/minitest/spec.rbs +11 -0
  463. data/stdlib/minitest/0/minitest/statistics_reporter.rbs +81 -0
  464. data/stdlib/minitest/0/minitest/summary_reporter.rbs +18 -0
  465. data/stdlib/minitest/0/minitest/test/lifecycle_hooks.rbs +92 -0
  466. data/stdlib/minitest/0/minitest/test.rbs +69 -0
  467. data/stdlib/minitest/0/minitest/unexpected_error.rbs +12 -0
  468. data/stdlib/minitest/0/minitest/unexpected_warning.rbs +6 -0
  469. data/stdlib/minitest/0/minitest/unit/test_case.rbs +3 -0
  470. data/stdlib/minitest/0/minitest/unit.rbs +4 -0
  471. data/stdlib/minitest/0/minitest.rbs +115 -0
  472. data/stdlib/monitor/0/monitor.rbs +363 -0
  473. data/stdlib/mutex_m/0/mutex_m.rbs +104 -0
  474. data/stdlib/net-http/0/manifest.yaml +3 -0
  475. data/stdlib/net-http/0/net-http.rbs +5580 -0
  476. data/stdlib/net-protocol/0/manifest.yaml +2 -0
  477. data/stdlib/net-protocol/0/net-protocol.rbs +56 -0
  478. data/stdlib/net-smtp/0/manifest.yaml +2 -0
  479. data/stdlib/net-smtp/0/net-smtp.rbs +55 -0
  480. data/stdlib/nkf/0/nkf.rbs +402 -0
  481. data/stdlib/objspace/0/objspace.rbs +470 -0
  482. data/stdlib/observable/0/observable.rbs +217 -0
  483. data/stdlib/open-uri/0/manifest.yaml +4 -0
  484. data/stdlib/open-uri/0/open-uri.rbs +433 -0
  485. data/stdlib/open3/0/open3.rbs +606 -0
  486. data/stdlib/openssl/0/manifest.yaml +3 -0
  487. data/stdlib/openssl/0/openssl.rbs +12231 -0
  488. data/stdlib/optparse/0/optparse.rbs +1734 -0
  489. data/stdlib/pathname/0/pathname.rbs +36 -0
  490. data/stdlib/pp/0/manifest.yaml +2 -0
  491. data/stdlib/pp/0/pp.rbs +301 -0
  492. data/stdlib/prettyprint/0/prettyprint.rbs +383 -0
  493. data/stdlib/pstore/0/pstore.rbs +608 -0
  494. data/stdlib/psych/0/core_ext.rbs +12 -0
  495. data/stdlib/psych/0/dbm.rbs +237 -0
  496. data/stdlib/psych/0/manifest.yaml +3 -0
  497. data/stdlib/psych/0/psych.rbs +455 -0
  498. data/stdlib/psych/0/store.rbs +57 -0
  499. data/stdlib/pty/0/pty.rbs +240 -0
  500. data/stdlib/random-formatter/0/random-formatter.rbs +277 -0
  501. data/stdlib/rdoc/0/code_object.rbs +52 -0
  502. data/stdlib/rdoc/0/comment.rbs +61 -0
  503. data/stdlib/rdoc/0/context.rbs +153 -0
  504. data/stdlib/rdoc/0/markup.rbs +117 -0
  505. data/stdlib/rdoc/0/options.rbs +76 -0
  506. data/stdlib/rdoc/0/parser.rbs +56 -0
  507. data/stdlib/rdoc/0/rdoc.rbs +393 -0
  508. data/stdlib/rdoc/0/ri.rbs +17 -0
  509. data/stdlib/rdoc/0/store.rbs +48 -0
  510. data/stdlib/rdoc/0/top_level.rbs +97 -0
  511. data/stdlib/resolv/0/manifest.yaml +3 -0
  512. data/stdlib/resolv/0/resolv.rbs +1787 -0
  513. data/stdlib/ripper/0/ripper.rbs +1654 -0
  514. data/stdlib/securerandom/0/manifest.yaml +2 -0
  515. data/stdlib/securerandom/0/securerandom.rbs +49 -0
  516. data/stdlib/shellwords/0/shellwords.rbs +229 -0
  517. data/stdlib/singleton/0/singleton.rbs +134 -0
  518. data/stdlib/socket/0/addrinfo.rbs +666 -0
  519. data/stdlib/socket/0/basic_socket.rbs +590 -0
  520. data/stdlib/socket/0/constants.rbs +2295 -0
  521. data/stdlib/socket/0/ip_socket.rbs +94 -0
  522. data/stdlib/socket/0/socket.rbs +4170 -0
  523. data/stdlib/socket/0/socket_error.rbs +5 -0
  524. data/stdlib/socket/0/tcp_server.rbs +192 -0
  525. data/stdlib/socket/0/tcp_socket.rbs +87 -0
  526. data/stdlib/socket/0/udp_socket.rbs +133 -0
  527. data/stdlib/socket/0/unix_server.rbs +169 -0
  528. data/stdlib/socket/0/unix_socket.rbs +172 -0
  529. data/stdlib/stringio/0/stringio.rbs +1681 -0
  530. data/stdlib/strscan/0/string_scanner.rbs +1648 -0
  531. data/stdlib/tempfile/0/tempfile.rbs +483 -0
  532. data/stdlib/time/0/time.rbs +434 -0
  533. data/stdlib/timeout/0/timeout.rbs +137 -0
  534. data/stdlib/tmpdir/0/tmpdir.rbs +69 -0
  535. data/stdlib/tsort/0/cyclic.rbs +8 -0
  536. data/stdlib/tsort/0/interfaces.rbs +20 -0
  537. data/stdlib/tsort/0/tsort.rbs +410 -0
  538. data/stdlib/uri/0/common.rbs +621 -0
  539. data/stdlib/uri/0/file.rbs +118 -0
  540. data/stdlib/uri/0/ftp.rbs +13 -0
  541. data/stdlib/uri/0/generic.rbs +1116 -0
  542. data/stdlib/uri/0/http.rbs +104 -0
  543. data/stdlib/uri/0/https.rbs +14 -0
  544. data/stdlib/uri/0/ldap.rbs +230 -0
  545. data/stdlib/uri/0/ldaps.rbs +14 -0
  546. data/stdlib/uri/0/mailto.rbs +92 -0
  547. data/stdlib/uri/0/rfc2396_parser.rbs +189 -0
  548. data/stdlib/uri/0/rfc3986_parser.rbs +2 -0
  549. data/stdlib/uri/0/ws.rbs +13 -0
  550. data/stdlib/uri/0/wss.rbs +9 -0
  551. data/stdlib/yaml/0/manifest.yaml +2 -0
  552. data/stdlib/yaml/0/yaml.rbs +1 -0
  553. data/stdlib/zlib/0/buf_error.rbs +10 -0
  554. data/stdlib/zlib/0/data_error.rbs +10 -0
  555. data/stdlib/zlib/0/deflate.rbs +211 -0
  556. data/stdlib/zlib/0/error.rbs +20 -0
  557. data/stdlib/zlib/0/gzip_file/crc_error.rbs +12 -0
  558. data/stdlib/zlib/0/gzip_file/error.rbs +23 -0
  559. data/stdlib/zlib/0/gzip_file/length_error.rbs +12 -0
  560. data/stdlib/zlib/0/gzip_file/no_footer.rbs +11 -0
  561. data/stdlib/zlib/0/gzip_file.rbs +156 -0
  562. data/stdlib/zlib/0/gzip_reader.rbs +293 -0
  563. data/stdlib/zlib/0/gzip_writer.rbs +168 -0
  564. data/stdlib/zlib/0/inflate.rbs +180 -0
  565. data/stdlib/zlib/0/mem_error.rbs +10 -0
  566. data/stdlib/zlib/0/need_dict.rbs +13 -0
  567. data/stdlib/zlib/0/stream_end.rbs +11 -0
  568. data/stdlib/zlib/0/stream_error.rbs +11 -0
  569. data/stdlib/zlib/0/version_error.rbs +11 -0
  570. data/stdlib/zlib/0/zlib.rbs +449 -0
  571. data/stdlib/zlib/0/zstream.rbs +201 -0
  572. data/wasm/README.md +59 -0
  573. data/wasm/rbs_wasm.c +411 -0
  574. metadata +660 -0
@@ -0,0 +1,1054 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RBS
4
+ class DefinitionBuilder
5
+ attr_reader :env
6
+ attr_reader :ancestor_builder
7
+ attr_reader :method_builder
8
+
9
+ attr_reader :instance_cache
10
+ attr_reader :singleton_cache
11
+ attr_reader :singleton0_cache
12
+ attr_reader :interface_cache
13
+
14
+ def initialize(env:, ancestor_builder: nil, method_builder: nil)
15
+ @env = env
16
+ @ancestor_builder = ancestor_builder || AncestorBuilder.new(env: env)
17
+ @method_builder = method_builder || MethodBuilder.new(env: env)
18
+
19
+ @instance_cache = {}
20
+ @singleton_cache = {}
21
+ @singleton0_cache = {}
22
+ @interface_cache = {}
23
+ end
24
+
25
+ def ensure_namespace!(namespace, location:)
26
+ namespace.ascend do |ns|
27
+ unless ns.empty?
28
+ NoTypeFoundError.check!(ns.to_type_name, env: env, location: location)
29
+ end
30
+ end
31
+ end
32
+
33
+ def define_interface(definition, type_name, subst)
34
+ included_interfaces = ancestor_builder.interface_ancestors(type_name).ancestors #: Array[Definition::Ancestor::Instance]
35
+ included_interfaces = included_interfaces.reject {|ancestor| ancestor.source == nil }
36
+
37
+ interface_methods = interface_methods(included_interfaces)
38
+ methods = method_builder.build_interface(type_name)
39
+
40
+ import_methods(definition, type_name, methods, interface_methods, subst, nil)
41
+ end
42
+
43
+ def build_interface(type_name)
44
+ try_cache(type_name, cache: interface_cache) do
45
+ entry = env.interface_decls[type_name] or raise "Unknown name for build_interface: #{type_name}"
46
+ declaration = entry.decl
47
+ ensure_namespace!(type_name.namespace, location: declaration.location)
48
+
49
+ type_params = declaration.type_params.each.map(&:name)
50
+ type_args = Types::Variable.build(type_params)
51
+ self_type = Types::Interface.new(name: type_name, args: type_args, location: nil)
52
+
53
+ subst = Substitution.build(type_params, type_args)
54
+
55
+ ancestors = ancestor_builder.interface_ancestors(type_name)
56
+ Definition.new(type_name: type_name, entry: entry, self_type: self_type, ancestors: ancestors).tap do |definition|
57
+ methods = method_builder.build_interface(type_name)
58
+ one_ancestors = ancestor_builder.one_interface_ancestors(type_name)
59
+ validate_type_params(definition, methods: methods, ancestors: one_ancestors)
60
+
61
+ define_interface(definition, type_name, subst)
62
+ end
63
+ end
64
+ end
65
+
66
+ def tapp_subst(name, args)
67
+ params =
68
+ case
69
+ when name.interface?
70
+ entry = env.interface_decls[name] or raise "Unknown interface name: #{name}"
71
+ entry.decl.type_params
72
+ when name.alias?
73
+ entry = env.type_alias_decls[name] or raise "Unknown alias name: #{name}"
74
+ entry.decl.type_params
75
+ when name.class?
76
+ entry = env.class_decls[name] or raise "Unknown module name: #{name}"
77
+ entry.type_params
78
+ else
79
+ raise
80
+ end
81
+
82
+ AST::TypeParam.application(params, args) || Substitution.new()
83
+ end
84
+
85
+ def define_instance(definition, type_name, subst, define_class_vars:)
86
+ one_ancestors = ancestor_builder.one_instance_ancestors(type_name)
87
+ methods = method_builder.build_instance(type_name)
88
+
89
+ self_type_methods = one_ancestors.each_self_type.with_object({}) do |self_type, hash| #$ Hash[Symbol, Definition::Method]
90
+ self_type.args.each do |arg|
91
+ validate_type_presence(arg)
92
+ end
93
+
94
+ self_type_defn = self_type.name.interface? ? build_interface(self_type.name) : build_instance(self_type.name)
95
+
96
+ s = subst + tapp_subst(self_type.name, self_type.args)
97
+ self_type_defn.methods.each do |method_name, method_def|
98
+ hash[method_name] = method_def.sub(s)
99
+ end
100
+ end
101
+
102
+ one_ancestors.each_included_module do |mod|
103
+ mod.args.each do |arg|
104
+ validate_type_presence(arg)
105
+ end
106
+
107
+ define_instance(definition, mod.name, subst + tapp_subst(mod.name, mod.args), define_class_vars: define_class_vars)
108
+ end
109
+
110
+ all_interfaces = one_ancestors.each_included_interface.flat_map do |interface|
111
+ other_interfaces = ancestor_builder.interface_ancestors(interface.name).ancestors #: Array[Definition::Ancestor::Instance]
112
+ other_interfaces = other_interfaces.select {|ancestor| ancestor.source }
113
+ [interface, *other_interfaces]
114
+ end
115
+ interface_methods = interface_methods(all_interfaces)
116
+ import_methods(definition, type_name, methods, interface_methods, subst, self_type_methods)
117
+
118
+ one_ancestors.each_prepended_module do |mod|
119
+ mod.args.each do |arg|
120
+ validate_type_presence(arg)
121
+ end
122
+
123
+ define_instance(definition, mod.name, subst + tapp_subst(mod.name, mod.args), define_class_vars: define_class_vars)
124
+ end
125
+
126
+ entry = env.class_decls[type_name] or raise "Unknown name for build_instance: #{type_name}"
127
+ args = entry.type_params.map {|param| Types::Variable.new(name: param.name, location: param.location) }
128
+
129
+ entry.each_decl do |decl|
130
+ subst_ = subst + Substitution.build(decl.type_params.each.map(&:name), args)
131
+
132
+ decl.members.each do |member|
133
+ case member
134
+ when AST::Members::AttrReader, AST::Members::AttrAccessor, AST::Members::AttrWriter
135
+ if member.kind == :instance
136
+ ivar_name = case member.ivar_name
137
+ when false
138
+ nil
139
+ else
140
+ member.ivar_name || :"@#{member.name}"
141
+ end
142
+
143
+ if ivar_name
144
+ insert_variable(
145
+ type_name,
146
+ definition.instance_variables,
147
+ name: ivar_name,
148
+ type: member.type.sub(subst_),
149
+ source: member
150
+ )
151
+ end
152
+ end
153
+
154
+ when AST::Ruby::Members::AttrReaderMember, AST::Ruby::Members::AttrWriterMember, AST::Ruby::Members::AttrAccessorMember
155
+ member.names.each do |name|
156
+ ivar_name = :"@#{name}"
157
+ attr_type = member.type || Types::Bases::Any.new(location: nil)
158
+
159
+ insert_variable(
160
+ type_name,
161
+ definition.instance_variables,
162
+ name: ivar_name,
163
+ type: attr_type,
164
+ source: member
165
+ )
166
+ end
167
+
168
+ when AST::Ruby::Members::InstanceVariableMember
169
+ insert_variable(
170
+ type_name,
171
+ definition.instance_variables,
172
+ name: member.name,
173
+ type: member.type,
174
+ source: member
175
+ )
176
+
177
+ when AST::Members::InstanceVariable
178
+ insert_variable(
179
+ type_name,
180
+ definition.instance_variables,
181
+ name: member.name,
182
+ type: member.type.sub(subst_),
183
+ source: member
184
+ )
185
+
186
+ when AST::Members::ClassVariable
187
+ if define_class_vars
188
+ insert_variable(type_name, definition.class_variables, name: member.name, type: member.type, source: member)
189
+ end
190
+ end
191
+ end
192
+ end
193
+ end
194
+
195
+ def build_instance(type_name)
196
+ type_name = env.normalize_module_name(type_name)
197
+
198
+ try_cache(type_name, cache: instance_cache) do
199
+ entry = env.class_decls[type_name] or raise "Unknown name for build_instance: #{type_name}"
200
+ ensure_namespace!(type_name.namespace, location: entry.primary_decl.location)
201
+
202
+ ancestors = ancestor_builder.instance_ancestors(type_name)
203
+ args = entry.type_params.map {|param| Types::Variable.new(name: param.name, location: param.location) }
204
+ self_type = Types::ClassInstance.new(name: type_name, args: args, location: nil)
205
+
206
+ Definition.new(type_name: type_name, entry: entry, self_type: self_type, ancestors: ancestors).tap do |definition|
207
+ one_ancestors = ancestor_builder.one_instance_ancestors(type_name)
208
+ methods = method_builder.build_instance(type_name)
209
+
210
+ validate_type_params definition, methods: methods, ancestors: one_ancestors
211
+
212
+ if entry.is_a?(Environment::ClassEntry)
213
+ if super_class = one_ancestors.super_class
214
+ super_class.is_a?(Definition::Ancestor::Instance) or raise
215
+
216
+ build_instance(super_class.name).tap do |defn|
217
+ unless super_class.args.empty?
218
+ super_class.args.each do |arg|
219
+ validate_type_presence(arg)
220
+ end
221
+
222
+ subst = tapp_subst(super_class.name, super_class.args)
223
+ defn = defn.sub(subst)
224
+ end
225
+
226
+ definition.methods.merge!(defn.methods)
227
+ definition.instance_variables.merge!(defn.instance_variables)
228
+ definition.class_variables.merge!(defn.class_variables)
229
+ end
230
+ end
231
+ end
232
+
233
+ if entry.is_a?(Environment::ModuleEntry)
234
+ if self_types = one_ancestors.self_types
235
+ self_types.each do |ans|
236
+ ans.args.each do |arg|
237
+ validate_type_presence(arg)
238
+ end
239
+
240
+ subst = tapp_subst(ans.name, ans.args)
241
+ if ans.name.interface?
242
+ define_interface(definition, ans.name, subst)
243
+ else
244
+ define_instance(definition, ans.name, subst, define_class_vars: true)
245
+ end
246
+ end
247
+ end
248
+ end
249
+
250
+ define_instance(definition, type_name, Substitution.new, define_class_vars: true)
251
+ end
252
+ end
253
+ end
254
+
255
+ # Builds a definition for singleton without .new method.
256
+ #
257
+ def build_singleton0(type_name)
258
+ try_cache type_name, cache: singleton0_cache do
259
+ entry = env.class_decls[type_name] or raise "Unknown name for build_singleton0: #{type_name}"
260
+ ensure_namespace!(type_name.namespace, location: entry.primary_decl.location)
261
+
262
+ ancestors = ancestor_builder.singleton_ancestors(type_name)
263
+ self_type = Types::ClassSingleton.new(name: type_name, location: nil)
264
+
265
+ Definition.new(type_name: type_name, entry: entry, self_type: self_type, ancestors: ancestors).tap do |definition|
266
+ one_ancestors = ancestor_builder.one_singleton_ancestors(type_name)
267
+ methods = method_builder.build_singleton(type_name)
268
+
269
+ if super_class = one_ancestors.super_class
270
+ case super_class
271
+ when Definition::Ancestor::Instance
272
+ defn = build_instance(super_class.name)
273
+ when Definition::Ancestor::Singleton
274
+ defn = build_singleton0(super_class.name)
275
+ end
276
+
277
+ definition.methods.merge!(defn.methods)
278
+ definition.instance_variables.merge!(defn.instance_variables)
279
+ end
280
+
281
+ one_ancestors.each_extended_module do |mod|
282
+ mod.args.each do |arg|
283
+ validate_type_presence(arg)
284
+ end
285
+
286
+ subst = tapp_subst(mod.name, mod.args)
287
+ define_instance(definition, mod.name, subst, define_class_vars: false)
288
+ end
289
+
290
+ all_interfaces = one_ancestors.each_extended_interface.flat_map do |interface|
291
+ other_interfaces = ancestor_builder.interface_ancestors(interface.name).ancestors #: Array[Definition::Ancestor::Instance]
292
+ other_interfaces = other_interfaces.select {|ancestor| ancestor.source }
293
+ [interface, *other_interfaces]
294
+ end
295
+ interface_methods = interface_methods(all_interfaces)
296
+ import_methods(definition, type_name, methods, interface_methods, Substitution.new, nil)
297
+
298
+ entry.each_decl do |decl|
299
+ decl.members.each do |member|
300
+ case member
301
+ when AST::Members::AttrReader, AST::Members::AttrAccessor, AST::Members::AttrWriter
302
+ if member.kind == :singleton
303
+ ivar_name = case member.ivar_name
304
+ when false
305
+ nil
306
+ else
307
+ member.ivar_name || :"@#{member.name}"
308
+ end
309
+
310
+ if ivar_name
311
+ insert_variable(type_name, definition.instance_variables, name: ivar_name, type: member.type, source: member)
312
+ end
313
+ end
314
+
315
+ when AST::Members::ClassInstanceVariable
316
+ insert_variable(type_name, definition.instance_variables, name: member.name, type: member.type, source: member)
317
+ end
318
+ end
319
+ end
320
+
321
+ instance_definition = build_instance(type_name)
322
+ definition.class_variables.replace(instance_definition.class_variables)
323
+ end
324
+ end
325
+ end
326
+
327
+ def build_singleton(type_name)
328
+ type_name = env.normalize_module_name(type_name)
329
+
330
+ try_cache type_name, cache: singleton_cache do
331
+ entry = env.class_decls[type_name] or raise "Unknown name for build_singleton: #{type_name}"
332
+ ensure_namespace!(type_name.namespace, location: entry.primary_decl.location)
333
+
334
+ ancestors = ancestor_builder.singleton_ancestors(type_name)
335
+ self_type = Types::ClassSingleton.new(name: type_name, location: nil)
336
+
337
+ Definition.new(type_name: type_name, entry: entry, self_type: self_type, ancestors: ancestors).tap do |definition|
338
+ definition0 = build_singleton0(type_name)
339
+ definition.methods.merge!(definition0.methods)
340
+ definition.instance_variables.merge!(definition0.instance_variables)
341
+ definition.class_variables.merge!(definition0.class_variables)
342
+
343
+ if entry.is_a?(Environment::ClassEntry)
344
+ new_method = definition.methods[:new]
345
+
346
+ if new_method.defs.all? {|d| d.defined_in == BuiltinNames::Class.name }
347
+ # The method is _untyped new_.
348
+
349
+ alias_methods = definition.methods.each.with_object([]) do |entry, array|
350
+ # @type var method: Definition::Method?
351
+ name, method = entry
352
+ while method
353
+ if method.alias_of == new_method
354
+ array << name
355
+ break
356
+ end
357
+ method = method.alias_of
358
+ end
359
+ end
360
+
361
+ instance = build_instance(type_name)
362
+ initialize = instance.methods[:initialize]
363
+
364
+ if initialize
365
+ class_params = entry.type_params
366
+
367
+ # Inject a virtual _typed new_.
368
+ initialize_defs = initialize.defs
369
+ typed_new = Definition::Method.new(
370
+ super_method: new_method,
371
+ defs: initialize_defs.map do |initialize_def|
372
+ method_type = initialize_def.type
373
+
374
+ class_type_param_vars = Set.new(class_params.map(&:name))
375
+ method_type_param_vars = Set.new(method_type.type_params.map(&:name))
376
+
377
+ if class_type_param_vars.intersect?(method_type_param_vars)
378
+ new_method_param_names = method_type.type_params.map do |method_param|
379
+ if class_type_param_vars.include?(method_param.name)
380
+ Types::Variable.fresh(method_param.name).name
381
+ else
382
+ method_param.name
383
+ end
384
+ end
385
+
386
+ sub = Substitution.build(
387
+ method_type.type_params.map(&:name),
388
+ Types::Variable.build(new_method_param_names)
389
+ )
390
+
391
+ method_params = class_params + AST::TypeParam.rename(method_type.type_params, new_names: new_method_param_names)
392
+ method_type = method_type
393
+ .update(type_params: [])
394
+ .sub(sub)
395
+ .update(type_params: method_params)
396
+ else
397
+ method_type = method_type
398
+ .update(type_params: class_params + method_type.type_params)
399
+ end
400
+
401
+ method_type = method_type.map_type do |type|
402
+ case type
403
+ when Types::Bases::Self
404
+ Types::ClassInstance.new(
405
+ name: type_name,
406
+ args: entry.type_params.map {|param| Types::Variable.new(name: param.name, location: param.location) },
407
+ location: nil
408
+ )
409
+ else
410
+ type
411
+ end
412
+ end
413
+
414
+ method_type = method_type.update(
415
+ type: method_type.type.with_return_type(
416
+ Types::ClassInstance.new(
417
+ name: type_name,
418
+ args: entry.type_params.map {|param| Types::Variable.new(name: param.name, location: param.location) },
419
+ location: nil
420
+ )
421
+ )
422
+ )
423
+
424
+ Definition::Method::TypeDef.new(
425
+ type: method_type,
426
+ member: initialize_def.member,
427
+ defined_in: initialize_def.defined_in,
428
+ implemented_in: initialize_def.implemented_in
429
+ ).tap do |type_def|
430
+ type_def.overload_annotations.replace(initialize_def.overload_annotations)
431
+ end
432
+ end,
433
+ accessibility: :public,
434
+ alias_of: nil,
435
+ alias_member: nil
436
+ )
437
+
438
+ definition.methods[:new] = typed_new
439
+
440
+ alias_methods.each do |alias_name|
441
+ definition.methods[alias_name] = definition.methods[alias_name].update(
442
+ alias_of: typed_new,
443
+ defs: typed_new.defs
444
+ )
445
+ end
446
+ end
447
+ end
448
+ end
449
+ end
450
+ end
451
+ end
452
+
453
+ def interface_methods(interface_ancestors)
454
+ interface_methods = {} #: interface_methods
455
+
456
+ interface_ancestors.each do |mod|
457
+ source =
458
+ case mod.source
459
+ when AST::Members::Include, AST::Members::Extend
460
+ mod.source
461
+ else
462
+ raise "Interface mixin must be include/extend: #{mod.source.inspect}"
463
+ end
464
+
465
+ methods = method_builder.build_interface(mod.name)
466
+
467
+ interface_methods[mod] = [methods, source]
468
+ end
469
+
470
+ interface_methods
471
+ end
472
+
473
+ def validate_params_with(type_params, result:)
474
+ type_params.each do |param|
475
+ unless param.unchecked?
476
+ unless result.compatible?(param.name, with_annotation: param.variance)
477
+ yield param
478
+ end
479
+ end
480
+ end
481
+ end
482
+
483
+ def source_location(source, decl)
484
+ case source
485
+ when nil
486
+ decl.location
487
+ when :super
488
+ case decl
489
+ when AST::Declarations::Class
490
+ decl.super_class&.location
491
+ when AST::Ruby::Declarations::ClassDecl
492
+ nil
493
+ else
494
+ raise "Unexpected `:super` source location with #{decl.class}"
495
+ end
496
+ else
497
+ source.location
498
+ end
499
+ end
500
+
501
+ def validate_type_params(definition, ancestors:, methods:)
502
+ type_params = definition.type_params_decl
503
+
504
+ calculator = VarianceCalculator.new(builder: self)
505
+ param_names = type_params.each.map(&:name)
506
+
507
+ ancestors.each_ancestor do |ancestor|
508
+ case ancestor
509
+ when Definition::Ancestor::Instance
510
+ result = calculator.in_inherit(name: ancestor.name, args: ancestor.args, variables: param_names)
511
+ validate_params_with(type_params, result: result) do |param|
512
+ decl = case entry = definition.entry
513
+ when Environment::ModuleEntry, Environment::ClassEntry
514
+ entry.primary_decl
515
+ when Environment::SingleEntry
516
+ entry.decl
517
+ end
518
+
519
+ raise InvalidVarianceAnnotationError.new(
520
+ type_name: definition.type_name,
521
+ param: param,
522
+ location: source_location(ancestor.source, decl)
523
+ )
524
+ end
525
+ end
526
+ end
527
+
528
+ methods.each do |defn|
529
+ next if defn.name == :initialize
530
+
531
+ method_types = case original = defn.original
532
+ when AST::Members::MethodDefinition
533
+ original.overloads.map(&:method_type)
534
+ when AST::Members::AttrWriter, AST::Members::AttrReader, AST::Members::AttrAccessor
535
+ if defn.name.to_s.end_with?("=")
536
+ [
537
+ MethodType.new(
538
+ type_params: [],
539
+ type: Types::Function.empty(original.type).update(
540
+ required_positionals: [
541
+ Types::Function::Param.new(type: original.type, name: original.name)
542
+ ]
543
+ ),
544
+ block: nil,
545
+ location: original.location
546
+ )
547
+ ]
548
+ else
549
+ [
550
+ MethodType.new(
551
+ type_params: [],
552
+ type: Types::Function.empty(original.type),
553
+ block: nil,
554
+ location: original.location
555
+ )
556
+ ]
557
+ end
558
+ when AST::Members::Alias
559
+ nil
560
+ when nil
561
+ nil
562
+ end
563
+
564
+ if method_types
565
+ method_types.each do |method_type|
566
+ merged_params = type_params
567
+ .reject {|param| method_type.type_param_names.include?(param.name) }
568
+ .concat(method_type.type_params)
569
+
570
+ result = calculator.in_method_type(method_type: method_type, variables: param_names)
571
+ validate_params_with(merged_params, result: result) do |param|
572
+ raise InvalidVarianceAnnotationError.new(
573
+ type_name: definition.type_name,
574
+ param: param,
575
+ location: method_type.location
576
+ )
577
+ end
578
+ end
579
+ end
580
+ end
581
+ end
582
+
583
+ def insert_variable(type_name, variables, name:, type:, source:)
584
+ variables[name] = Definition::Variable.new(
585
+ parent_variable: variables[name],
586
+ type: type,
587
+ declared_in: type_name,
588
+ source: source
589
+ )
590
+
591
+ validate_variable(variables[name])
592
+ end
593
+
594
+ def validate_variable(var)
595
+ return unless var.parent_variable
596
+
597
+ # Ignore attrs
598
+ variables = [] #: Array[Definition::Variable]
599
+ tmp_var = var
600
+ while tmp_var
601
+ case tmp_var.source
602
+ when AST::Members::AttrReader, AST::Members::AttrWriter, AST::Members::AttrAccessor
603
+ # nop
604
+ when AST::Ruby::Members::AttrReaderMember, AST::Ruby::Members::AttrWriterMember, AST::Ruby::Members::AttrAccessorMember
605
+ # nop
606
+ else
607
+ variables << tmp_var
608
+ end
609
+
610
+ tmp_var = tmp_var.parent_variable
611
+ end
612
+
613
+ # Duplicates should be eliminated, so there can't be more than 3.
614
+ return unless variables.length == 2
615
+
616
+ l, r = variables #: [Definition::Variable, Definition::Variable]
617
+
618
+ case l.source
619
+ when AST::Members::InstanceVariable
620
+ if r.source.instance_of?(AST::Members::InstanceVariable) && l.declared_in == r.declared_in
621
+ raise InstanceVariableDuplicationError.new(type_name: l.declared_in, variable_name: l.source.name, location: l.source.location)
622
+ end
623
+ when AST::Members::ClassInstanceVariable
624
+ if r.source.instance_of?(AST::Members::ClassInstanceVariable) && l.declared_in == r.declared_in
625
+ raise ClassInstanceVariableDuplicationError.new(type_name: l.declared_in, variable_name: l.source.name, location: l.source.location)
626
+ end
627
+ when AST::Ruby::Members::InstanceVariableMember
628
+ if l.declared_in == r.declared_in
629
+ raise InstanceVariableDuplicationError.new(type_name: l.declared_in, variable_name: l.source.name, location: l.source.location)
630
+ end
631
+ end
632
+ end
633
+
634
+ def import_methods(definition, module_name, module_methods, interfaces_methods, subst, self_type_methods)
635
+ new_methods = {} #: Hash[Symbol, Definition::Method]
636
+ interface_method_duplicates = Set[] #: Set[Symbol]
637
+
638
+ interfaces_methods.each do |interface, (methods, member)|
639
+ unless interface.args.empty?
640
+ methods.type.is_a?(Types::Interface) or raise
641
+
642
+ interface.args.each do |arg|
643
+ validate_type_presence(arg)
644
+ end
645
+
646
+ type_params = env.interface_decls.fetch(interface.name).decl.type_params
647
+ if s = AST::TypeParam.application(type_params, interface.args)
648
+ subst_ = subst + s
649
+ else
650
+ subst_ = subst
651
+ end
652
+ else
653
+ subst_ = subst
654
+ end
655
+
656
+ methods.each do |method|
657
+ if interface_method_duplicates.include?(method.name)
658
+ (member.is_a?(AST::Members::Include) || member.is_a?(AST::Members::Extend)) or raise
659
+
660
+ raise DuplicatedInterfaceMethodDefinitionError.new(
661
+ type: definition.self_type,
662
+ method_name: method.name,
663
+ member: member
664
+ )
665
+ end
666
+
667
+ interface_method_duplicates << method.name
668
+ define_method(
669
+ new_methods,
670
+ definition,
671
+ method,
672
+ subst_,
673
+ nil,
674
+ defined_in: interface.name,
675
+ implemented_in: module_name
676
+ )
677
+ end
678
+ end
679
+
680
+ module_methods.each do |method|
681
+ define_method(
682
+ new_methods,
683
+ definition,
684
+ method,
685
+ subst,
686
+ self_type_methods,
687
+ defined_in: module_name,
688
+ implemented_in: module_name.interface? ? nil : module_name
689
+ )
690
+ end
691
+
692
+ definition.methods.merge!(new_methods)
693
+ end
694
+
695
+ def define_method(methods, definition, method, subst, self_type_methods, defined_in:, implemented_in: defined_in)
696
+ existing_method = methods[method.name] || definition.methods[method.name]
697
+
698
+ case original = method.original
699
+ when AST::Members::Alias
700
+ original_method = methods[original.old_name] || definition.methods[original.old_name] || self_type_methods&.fetch(original.old_name, nil)
701
+
702
+ unless original_method
703
+ raise UnknownMethodAliasError.new(
704
+ type_name: definition.type_name,
705
+ original_name: original.old_name,
706
+ aliased_name: original.new_name,
707
+ location: original.location
708
+ )
709
+ end
710
+
711
+ accessibility = special_accessibility(original.instance?, original.new_name) || original_method.accessibility
712
+
713
+ method_definition = Definition::Method.new(
714
+ super_method: existing_method,
715
+ defs: original_method.defs.map do |defn|
716
+ defn.update(defined_in: defined_in, implemented_in: implemented_in)
717
+ end,
718
+ accessibility: accessibility,
719
+ alias_of: original_method,
720
+ alias_member: original
721
+ )
722
+
723
+ method_definition.annotations.replace(original.annotations)
724
+ when AST::Members::MethodDefinition
725
+ if duplicated_method = methods[method.name]
726
+ raise DuplicatedMethodDefinitionError.new(
727
+ type: definition.self_type,
728
+ method_name: method.name,
729
+ members: [original, *duplicated_method.members]
730
+ )
731
+ end
732
+
733
+ defs = original.overloads.map do |overload|
734
+ Definition::Method::TypeDef.new(
735
+ type: subst.empty? ? overload.method_type : overload.method_type.sub(subst),
736
+ member: original,
737
+ defined_in: defined_in,
738
+ implemented_in: implemented_in
739
+ ).tap do |type_def|
740
+ # Keep the original annotations given to overloads.
741
+ type_def.overload_annotations.replace(overload.annotations)
742
+ end
743
+ end
744
+
745
+ # Respect the visibility of the original method definition.
746
+ accessibility = original.visibility || special_accessibility(original.instance?, method.name) || method.accessibility
747
+
748
+ # Skip setting up `super_method` if `implemented_in` is `nil`, that means the type doesn't have implementation.
749
+ # This typically happens if the type is an interface.
750
+ if implemented_in
751
+ super_method = existing_method
752
+ end
753
+
754
+ method_definition = Definition::Method.new(
755
+ super_method: super_method,
756
+ defs: defs,
757
+ accessibility: accessibility,
758
+ alias_of: nil,
759
+ alias_member: nil
760
+ )
761
+
762
+ method_definition.annotations.replace(original.annotations)
763
+ when AST::Members::AttrReader, AST::Members::AttrWriter, AST::Members::AttrAccessor
764
+ if duplicated_method = methods[method.name]
765
+ raise DuplicatedMethodDefinitionError.new(
766
+ type: definition.self_type,
767
+ method_name: method.name,
768
+ members: [*duplicated_method.members, original]
769
+ )
770
+ end
771
+
772
+ attr_type = original.type.sub(subst)
773
+ method_type =
774
+ if method.name.to_s.end_with?("=")
775
+ # setter
776
+ MethodType.new(
777
+ type_params: [],
778
+ type: Types::Function.empty(attr_type).update(
779
+ required_positionals: [
780
+ Types::Function::Param.new(type: attr_type, name: original.name)
781
+ ]
782
+ ),
783
+ block: nil,
784
+ location: original.location
785
+ )
786
+ else
787
+ # getter
788
+ MethodType.new(
789
+ type_params: [],
790
+ type: Types::Function.empty(attr_type),
791
+ block: nil,
792
+ location: original.location
793
+ )
794
+ end
795
+
796
+ if implemented_in
797
+ super_method = existing_method
798
+ end
799
+
800
+ # Respect the visibility of the original method definition.
801
+ accessibility = original.visibility || special_accessibility(original.kind == :instance, method.name) || method.accessibility
802
+
803
+ method_definition = Definition::Method.new(
804
+ super_method: super_method,
805
+ defs: [
806
+ Definition::Method::TypeDef.new(
807
+ type: method_type,
808
+ member: original,
809
+ defined_in: defined_in,
810
+ implemented_in: implemented_in
811
+ )
812
+ ],
813
+ accessibility: accessibility,
814
+ alias_of: nil,
815
+ alias_member: nil
816
+ )
817
+
818
+ method_definition.annotations.replace(original.annotations)
819
+ when AST::Ruby::Members::AttrReaderMember, AST::Ruby::Members::AttrWriterMember, AST::Ruby::Members::AttrAccessorMember
820
+ if duplicated_method = methods[method.name]
821
+ raise DuplicatedMethodDefinitionError.new(
822
+ type: definition.self_type,
823
+ method_name: method.name,
824
+ members: [*duplicated_method.members, original]
825
+ )
826
+ end
827
+
828
+ attr_type = original.type || Types::Bases::Any.new(location: nil)
829
+ method_type =
830
+ if method.name.to_s.end_with?("=")
831
+ # setter
832
+ MethodType.new(
833
+ type_params: [],
834
+ type: Types::Function.empty(attr_type).update(
835
+ required_positionals: [
836
+ Types::Function::Param.new(type: attr_type, name: method.name.to_s.chomp("=").to_sym)
837
+ ]
838
+ ),
839
+ block: nil,
840
+ location: original.location
841
+ )
842
+ else
843
+ # getter
844
+ MethodType.new(
845
+ type_params: [],
846
+ type: Types::Function.empty(attr_type),
847
+ block: nil,
848
+ location: original.location
849
+ )
850
+ end
851
+
852
+ if implemented_in
853
+ super_method = existing_method
854
+ end
855
+
856
+ method_definition = Definition::Method.new(
857
+ super_method: super_method,
858
+ defs: [
859
+ Definition::Method::TypeDef.new(
860
+ type: method_type,
861
+ member: original,
862
+ defined_in: defined_in,
863
+ implemented_in: implemented_in
864
+ )
865
+ ],
866
+ accessibility: method.accessibility,
867
+ alias_of: nil,
868
+ alias_member: nil
869
+ )
870
+
871
+ method_definition.annotations.replace([])
872
+ when AST::Ruby::Members::DefMember
873
+ if duplicated_method = methods[method.name]
874
+ raise DuplicatedMethodDefinitionError.new(
875
+ type: definition.self_type,
876
+ method_name: method.name,
877
+ members: [original, *duplicated_method.members]
878
+ )
879
+ end
880
+
881
+ if original.method_type.empty? && existing_method
882
+ # Unannotated method with a parent definition → inherit from the parent, like @rbs ...
883
+ method_definition = Definition::Method.new(
884
+ super_method: existing_method,
885
+ defs: existing_method.defs.map { |defn| defn.update(implemented_in: implemented_in) },
886
+ accessibility: :public,
887
+ alias_of: existing_method.alias_of,
888
+ alias_member: nil
889
+ )
890
+
891
+ method_definition.annotations.replace(existing_method.annotations)
892
+ else
893
+ defs = original.overloads.map do |overload|
894
+ Definition::Method::TypeDef.new(
895
+ type: subst.empty? ? overload.method_type : overload.method_type.sub(subst),
896
+ member: original,
897
+ defined_in: defined_in,
898
+ implemented_in: implemented_in
899
+ ).tap do |type_def|
900
+ # Keep the original annotations given to overloads.
901
+ type_def.overload_annotations.replace(overload.annotations)
902
+ end
903
+ end
904
+
905
+ method_definition = Definition::Method.new(
906
+ super_method: existing_method,
907
+ defs: defs,
908
+ accessibility: :public,
909
+ alias_of: nil,
910
+ alias_member: nil
911
+ )
912
+
913
+ method_definition.annotations.replace([])
914
+ end
915
+
916
+ when nil
917
+ # Overloading method definition only
918
+
919
+ case
920
+ when methods.key?(method.name)
921
+ # The method is defined in an interface
922
+ super_method = methods[method.name].super_method
923
+ when definition.methods.key?(method.name)
924
+ # The method is defined in the super class
925
+ super_method = existing_method
926
+ else
927
+ # Cannot find any non-overloading method
928
+ raise InvalidOverloadMethodError.new(
929
+ type_name: definition.type_name,
930
+ method_name: method.name,
931
+ kind: :instance,
932
+ members: method.overloads
933
+ )
934
+ end
935
+
936
+ method_definition = Definition::Method.new(
937
+ super_method: super_method,
938
+ defs: existing_method.defs.map do |defn|
939
+ defn.update(implemented_in: implemented_in)
940
+ end,
941
+ accessibility: existing_method.accessibility,
942
+ alias_of: existing_method.alias_of,
943
+ alias_member: nil
944
+ )
945
+
946
+ method_definition.annotations.replace(existing_method.annotations)
947
+ end
948
+
949
+ method.overloads.each do |overloading_def|
950
+ overloading_def.overloads.reverse_each do |overload|
951
+ type_def = Definition::Method::TypeDef.new(
952
+ type: subst.empty? ? overload.method_type : overload.method_type.sub(subst),
953
+ member: overloading_def,
954
+ defined_in: defined_in,
955
+ implemented_in: implemented_in
956
+ )
957
+
958
+ type_def.overload_annotations.replace(overload.annotations)
959
+
960
+ method_definition.defs.unshift(type_def)
961
+ end
962
+
963
+ method_definition.annotations.concat(overloading_def.annotations)
964
+ end
965
+
966
+ method_definition.defs.each do |type_def|
967
+ type_def.member_annotations.replace(method_definition.annotations)
968
+ end
969
+
970
+ methods[method.name] = method_definition
971
+ end
972
+
973
+ def special_accessibility(is_instance, method_name)
974
+ if is_instance && [:initialize, :initialize_copy, :initialize_clone, :initialize_dup, :respond_to_missing?].include?(method_name)
975
+ :private
976
+ end
977
+ end
978
+
979
+ def try_cache(type_name, cache:)
980
+ cache[type_name] ||= yield
981
+ end
982
+
983
+ def expand_alias(type_name)
984
+ expand_alias2(type_name, [])
985
+ end
986
+
987
+ def expand_alias1(type_name)
988
+ type_name = env.normalize_type_name(type_name)
989
+ entry = env.type_alias_decls[type_name] or raise "Unknown alias name: #{type_name}"
990
+ as = entry.decl.type_params.each.map { Types::Bases::Any.new(location: nil) }
991
+ expand_alias2(type_name, as)
992
+ end
993
+
994
+ def expand_alias2(type_name, args)
995
+ type_name = env.normalize_type_name(type_name)
996
+ entry = env.type_alias_decls[type_name] or raise "Unknown alias name: #{type_name}"
997
+
998
+ ensure_namespace!(type_name.namespace, location: entry.decl.location)
999
+ params = entry.decl.type_params.each.map(&:name)
1000
+
1001
+ unless params.size == args.size
1002
+ as = "[#{args.join(", ")}]" unless args.empty?
1003
+ ps = "[#{params.join(", ")}]" unless params.empty?
1004
+
1005
+ raise "Invalid type application: type = #{type_name}#{as}, decl = #{type_name}#{ps}"
1006
+ end
1007
+
1008
+ type = entry.decl.type
1009
+
1010
+ unless params.empty?
1011
+ subst = Substitution.build(params, args)
1012
+ type = type.sub(subst)
1013
+ end
1014
+
1015
+ type
1016
+ end
1017
+
1018
+ def update(env:, except:, ancestor_builder:)
1019
+ method_builder = self.method_builder.update(env: env, except: except)
1020
+
1021
+ DefinitionBuilder.new(env: env, ancestor_builder: ancestor_builder, method_builder: method_builder).tap do |builder|
1022
+ builder.instance_cache.merge!(instance_cache)
1023
+ builder.singleton_cache.merge!(singleton_cache)
1024
+ builder.singleton0_cache.merge!(singleton0_cache)
1025
+ builder.interface_cache.merge!(interface_cache)
1026
+
1027
+ except.each do |name|
1028
+ builder.instance_cache.delete(name)
1029
+ builder.singleton_cache.delete(name)
1030
+ builder.singleton0_cache.delete(name)
1031
+ builder.interface_cache.delete(name)
1032
+ end
1033
+ end
1034
+ end
1035
+
1036
+ def validate_type_presence(type)
1037
+ case type
1038
+ when Types::ClassInstance, Types::ClassSingleton, Types::Interface, Types::Alias
1039
+ validate_type_name(type.name, type.location)
1040
+ end
1041
+
1042
+ type.each_type do |type|
1043
+ validate_type_presence(type)
1044
+ end
1045
+ end
1046
+
1047
+ def validate_type_name(name, location)
1048
+ name = name.absolute! unless name.absolute?
1049
+ return if env.type_name?(env.normalize_type_name(name))
1050
+
1051
+ raise NoTypeFoundError.new(type_name: name, location: location)
1052
+ end
1053
+ end
1054
+ end