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,117 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RBS
4
+ class InlineParser
5
+ class CommentAssociation
6
+ attr_reader :blocks, :associated_blocks, :start_line_map, :end_line_map
7
+
8
+ def initialize(blocks)
9
+ @blocks = blocks.sort_by {|block| block.start_line }
10
+ @associated_blocks = Set[].compare_by_identity
11
+
12
+ @start_line_map = {}
13
+ @end_line_map = {}
14
+
15
+ blocks.each do |block|
16
+ if block.leading?
17
+ end_line_map[block.end_line] = block
18
+ else
19
+ start_line_map[block.start_line] = block
20
+ end
21
+ end
22
+ end
23
+
24
+ def self.build(buffer, result)
25
+ blocks = AST::Ruby::CommentBlock.build(buffer, result.comments)
26
+ new(blocks)
27
+ end
28
+
29
+ class Reference
30
+ attr_reader :block
31
+
32
+ def initialize(block, association)
33
+ @block = block
34
+ @associated_blocks = association
35
+ end
36
+
37
+ def associate!
38
+ @associated_blocks << block
39
+ self
40
+ end
41
+
42
+ def associated?
43
+ @associated_blocks.include?(block)
44
+ end
45
+ end
46
+
47
+ def leading_block(node)
48
+ start_line = node.location.start_line
49
+
50
+ if block = end_line_map.fetch(start_line - 1, nil)
51
+ Reference.new(block, associated_blocks)
52
+ end
53
+ end
54
+
55
+ def leading_block!(node)
56
+ if ref = leading_block(node)
57
+ unless ref.associated?
58
+ ref.associate!.block
59
+ end
60
+ end
61
+ end
62
+
63
+ def trailing_block(node)
64
+ location =
65
+ if node.is_a?(Prism::Node)
66
+ node.location
67
+ else
68
+ node
69
+ end #: Prism::Location
70
+ end_line = location.end_line
71
+ if block = start_line_map.fetch(end_line, nil)
72
+ Reference.new(block, associated_blocks)
73
+ end
74
+ end
75
+
76
+ def trailing_block!(node)
77
+ if ref = trailing_block(node)
78
+ unless ref.associated?
79
+ ref.associate!.block
80
+ end
81
+ end
82
+ end
83
+
84
+ def each_enclosed_block(node)
85
+ if block_given?
86
+ start_line = node.location.start_line
87
+ end_line = node.location.end_line
88
+
89
+ if start_line+1 < end_line
90
+ ((start_line + 1)...end_line).each do |line|
91
+ if block = end_line_map.fetch(line, nil)
92
+ unless associated_blocks.include?(block)
93
+ associated_blocks << block
94
+ yield block
95
+ end
96
+ end
97
+ end
98
+ end
99
+ else
100
+ enum_for :each_enclosed_block, node
101
+ end
102
+ end
103
+
104
+ def each_unassociated_block
105
+ if block_given?
106
+ blocks.each do |block|
107
+ unless associated_blocks.include?(block)
108
+ yield block
109
+ end
110
+ end
111
+ else
112
+ enum_for :each_unassociated_block
113
+ end
114
+ end
115
+ end
116
+ end
117
+ end
@@ -0,0 +1,568 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RBS
4
+ class InlineParser
5
+ class Result
6
+ attr_reader :buffer, :prism_result, :declarations, :diagnostics
7
+
8
+ def initialize(buffer, prism)
9
+ @buffer = buffer
10
+ @prism_result = prism
11
+ @declarations = []
12
+ @diagnostics = []
13
+ end
14
+
15
+ def type_fingerprint
16
+ declarations.map(&:type_fingerprint)
17
+ end
18
+ end
19
+
20
+ module Diagnostic
21
+ class Base
22
+ attr_reader :message, :location
23
+
24
+ def initialize(location, message)
25
+ @location = location
26
+ @message = message
27
+ end
28
+ end
29
+
30
+ NotImplementedYet = _ = Class.new(Base)
31
+ NonConstantClassName = _ = Class.new(Base)
32
+ NonConstantModuleName = _ = Class.new(Base)
33
+ NonConstantSuperClassName = _ = Class.new(Base)
34
+ TopLevelMethodDefinition = _ = Class.new(Base)
35
+ TopLevelAttributeDefinition = _ = Class.new(Base)
36
+ NonConstantConstantDeclaration = _ = Class.new(Base)
37
+ UnusedInlineAnnotation = _ = Class.new(Base)
38
+ AnnotationSyntaxError = _ = Class.new(Base)
39
+ MixinMultipleArguments = _ = Class.new(Base)
40
+ MixinNonConstantModule = _ = Class.new(Base)
41
+ AttributeNonSymbolName = _ = Class.new(Base)
42
+ ClassModuleAliasDeclarationMissingTypeName = _ = Class.new(Base)
43
+ end
44
+
45
+ def self.parse(buffer, prism)
46
+ result = Result.new(buffer, prism)
47
+
48
+ parser = Parser.new(result)
49
+ parser.visit(prism.value)
50
+ parser.comments.each_unassociated_block do |block|
51
+ parser.report_unused_block(block)
52
+ end
53
+
54
+ result
55
+ end
56
+
57
+ class Parser < Prism::Visitor
58
+ attr_reader :module_nesting, :result, :comments
59
+
60
+ include AST::Ruby::Helpers::ConstantHelper
61
+ include AST::Ruby::Helpers::LocationHelper
62
+
63
+ def initialize(result)
64
+ @result = result
65
+ @module_nesting = []
66
+ @comments = CommentAssociation.build(result.buffer, result.prism_result)
67
+ end
68
+
69
+ def buffer
70
+ result.buffer
71
+ end
72
+
73
+ def current_module
74
+ module_nesting.last
75
+ end
76
+
77
+ def current_module!
78
+ current_module || raise("#current_module is nil")
79
+ end
80
+
81
+ def diagnostics
82
+ result.diagnostics
83
+ end
84
+
85
+ def push_module_nesting(mod)
86
+ module_nesting.push(mod)
87
+ yield
88
+ ensure
89
+ module_nesting.pop()
90
+ end
91
+
92
+ def skip_node?(node)
93
+ if ref = comments.leading_block(node)
94
+ if ref.block.each_paragraph([]).any? { _1.is_a?(AST::Ruby::Annotations::SkipAnnotation) }
95
+ ref.associate!
96
+ return true
97
+ end
98
+ end
99
+
100
+ false
101
+ end
102
+
103
+ def visit_class_node(node)
104
+ return if skip_node?(node)
105
+
106
+ unless class_name = constant_as_type_name(node.constant_path)
107
+ diagnostics << Diagnostic::NonConstantClassName.new(
108
+ rbs_location(node.constant_path.location),
109
+ "Class name must be a constant"
110
+ )
111
+ return
112
+ end
113
+
114
+ # Parse super class if present
115
+ super_class = if node.superclass
116
+ node.inheritance_operator_loc or raise
117
+ parse_super_class(node.superclass, node.inheritance_operator_loc)
118
+ end
119
+
120
+ class_decl = AST::Ruby::Declarations::ClassDecl.new(buffer, class_name, node, super_class)
121
+ insert_declaration(class_decl)
122
+ visit_class_or_module_body(class_decl, node)
123
+ end
124
+
125
+ def visit_module_node(node)
126
+ return if skip_node?(node)
127
+
128
+ unless module_name = constant_as_type_name(node.constant_path)
129
+ diagnostics << Diagnostic::NonConstantModuleName.new(
130
+ rbs_location(node.constant_path.location),
131
+ "Module name must be a constant"
132
+ )
133
+ return
134
+ end
135
+
136
+ module_decl = AST::Ruby::Declarations::ModuleDecl.new(buffer, module_name, node)
137
+
138
+ if leading_ref = comments.leading_block(node)
139
+ unused_annotations = [] #: Array[AST::Ruby::CommentBlock::AnnotationSyntaxError | AST::Ruby::Annotations::leading_annotation]
140
+
141
+ leading_ref.block.each_paragraph([]) do |paragraph|
142
+ case paragraph
143
+ when AST::Ruby::Annotations::ModuleSelfAnnotation
144
+ module_decl.members << AST::Ruby::Members::ModuleSelfMember.new(buffer, paragraph)
145
+ when Location
146
+ # Skip
147
+ when AST::Ruby::CommentBlock::AnnotationSyntaxError
148
+ unused_annotations << paragraph
149
+ when AST::Ruby::Annotations::SkipAnnotation
150
+ # Already handled by skip_node?
151
+ else
152
+ unused_annotations << paragraph
153
+ end
154
+ end
155
+
156
+ unless unused_annotations.empty?
157
+ report_unused_annotation(*unused_annotations)
158
+ end
159
+
160
+ leading_ref.associate!
161
+ end
162
+
163
+ insert_declaration(module_decl)
164
+ visit_class_or_module_body(module_decl, node)
165
+ end
166
+
167
+ def visit_class_or_module_body(decl, node)
168
+ push_module_nesting(decl) do
169
+ visit_child_nodes(node)
170
+
171
+ node.child_nodes.each do |child_node|
172
+ if child_node
173
+ comments.each_enclosed_block(child_node) do |block|
174
+ report_unused_block(block)
175
+ end
176
+ end
177
+ end
178
+ end
179
+
180
+ comments.each_enclosed_block(node) do |block|
181
+ unused_annotations = [] #: Array[AST::Ruby::CommentBlock::AnnotationSyntaxError | AST::Ruby::Annotations::leading_annotation]
182
+
183
+ block.each_paragraph([]) do |paragraph|
184
+ case paragraph
185
+ when AST::Ruby::Annotations::InstanceVariableAnnotation
186
+ decl.members << AST::Ruby::Members::InstanceVariableMember.new(buffer, paragraph)
187
+ when Location
188
+ # Skip
189
+ when AST::Ruby::CommentBlock::AnnotationSyntaxError
190
+ unused_annotations << paragraph
191
+ else
192
+ unused_annotations << paragraph
193
+ end
194
+ end
195
+
196
+ report_unused_annotation(*unused_annotations)
197
+ end
198
+
199
+ decl.members.sort_by! { _1.location.start_line }
200
+ end
201
+
202
+ def visit_def_node(node)
203
+ return if skip_node?(node)
204
+
205
+ if node.receiver && !node.receiver.is_a?(Prism::SelfNode)
206
+ diagnostics << Diagnostic::NotImplementedYet.new(
207
+ rbs_location(node.receiver.location),
208
+ "Method definition with non-self receiver is not supported"
209
+ )
210
+ return
211
+ end
212
+
213
+ kind = node.receiver ? :singleton : :instance #: :singleton | :instance
214
+
215
+ case current = current_module
216
+ when AST::Ruby::Declarations::ClassDecl, AST::Ruby::Declarations::ModuleDecl
217
+ leading_block = comments.leading_block!(node)
218
+
219
+ if node.end_keyword_loc
220
+ # Not an end-less def
221
+ end_loc = node.rparen_loc || node.parameters&.location || node.name_loc
222
+ trailing_block = comments.trailing_block!(end_loc)
223
+ end
224
+
225
+ method_type, leading_unuseds, trailing_unused = AST::Ruby::Members::MethodTypeAnnotation.build(leading_block, trailing_block, [], node)
226
+ report_unused_annotation(trailing_unused, *leading_unuseds)
227
+
228
+ defn = AST::Ruby::Members::DefMember.new(buffer, node.name, node, method_type, leading_block, kind: kind)
229
+ current.members << defn
230
+
231
+ # Skip other comments in `def` node
232
+ comments.each_enclosed_block(node) do |block|
233
+ report_unused_block(block)
234
+ end
235
+ else
236
+ diagnostics << Diagnostic::TopLevelMethodDefinition.new(
237
+ rbs_location(node.name_loc),
238
+ "Top-level method definition is not supported"
239
+ )
240
+ end
241
+ end
242
+
243
+ def visit_call_node(node)
244
+ return unless node.receiver.nil? # Only handle top-level calls like include, extend, prepend, attr_*
245
+
246
+ case node.name
247
+ when :include, :extend, :prepend
248
+ return if skip_node?(node)
249
+
250
+ case current = current_module
251
+ when AST::Ruby::Declarations::ClassDecl, AST::Ruby::Declarations::ModuleDecl
252
+ parse_mixin_call(node)
253
+ end
254
+ when :attr_reader, :attr_writer, :attr_accessor
255
+ return if skip_node?(node)
256
+
257
+ case current = current_module
258
+ when AST::Ruby::Declarations::ClassDecl, AST::Ruby::Declarations::ModuleDecl
259
+ parse_attribute_call(node)
260
+ when nil
261
+ # Top-level attribute definition
262
+ diagnostics << Diagnostic::TopLevelAttributeDefinition.new(
263
+ rbs_location(node.message_loc || node.location),
264
+ "Top-level attribute definition is not supported"
265
+ )
266
+ end
267
+ else
268
+ visit_child_nodes(node)
269
+ end
270
+ end
271
+
272
+ def visit_constant_write_node(node)
273
+ return if skip_node?(node)
274
+
275
+ # Parse constant declaration (both top-level and in classes/modules)
276
+ parse_constant_declaration(node)
277
+ end
278
+
279
+ def visit_constant_path_write_node(node)
280
+ return if skip_node?(node)
281
+
282
+ parse_constant_declaration(node)
283
+ end
284
+
285
+ def parse_mixin_call(node)
286
+ # Check for multiple arguments
287
+ if node.arguments && node.arguments.arguments.length > 1
288
+ diagnostics << Diagnostic::MixinMultipleArguments.new(
289
+ rbs_location(node.location),
290
+ "Mixing multiple modules with one call is not supported"
291
+ )
292
+ return
293
+ end
294
+
295
+ # Check for missing arguments
296
+ unless node.arguments && node.arguments.arguments.length == 1
297
+ # This shouldn't happen in valid Ruby code, but handle it gracefully
298
+ return
299
+ end
300
+
301
+ first_arg = node.arguments.arguments.first
302
+
303
+ # Check if the argument is a constant
304
+ unless module_name = constant_as_type_name(first_arg)
305
+ diagnostics << Diagnostic::MixinNonConstantModule.new(
306
+ rbs_location(first_arg.location),
307
+ "Module name must be a constant"
308
+ )
309
+ return
310
+ end
311
+
312
+ # Look for type application annotation in trailing comments
313
+ # For single-line calls like "include Bar #[String]", the annotation is trailing
314
+ trailing_block = comments.trailing_block!(node.location)
315
+ annotation = nil
316
+
317
+ if trailing_block
318
+ case trailing_annotation = trailing_block.trailing_annotation([])
319
+ when AST::Ruby::Annotations::TypeApplicationAnnotation
320
+ annotation = trailing_annotation
321
+ else
322
+ report_unused_annotation(trailing_annotation)
323
+ end
324
+ end
325
+
326
+ # Create the appropriate member based on the method name
327
+ member = case node.name
328
+ when :include
329
+ AST::Ruby::Members::IncludeMember.new(buffer, node, module_name, annotation)
330
+ when :extend
331
+ AST::Ruby::Members::ExtendMember.new(buffer, node, module_name, annotation)
332
+ when :prepend
333
+ AST::Ruby::Members::PrependMember.new(buffer, node, module_name, annotation)
334
+ else
335
+ raise "Unexpected mixin method: #{node.name}"
336
+ end
337
+
338
+ current_module!.members << member
339
+ end
340
+
341
+ def parse_attribute_call(node)
342
+ # Get the name nodes (arguments to attr_*)
343
+ unless node.arguments && !node.arguments.arguments.empty?
344
+ return # No arguments, nothing to do
345
+ end
346
+
347
+ name_nodes = [] #: Array[Prism::SymbolNode]
348
+ node.arguments.arguments.each do |arg|
349
+ case arg
350
+ when Prism::SymbolNode
351
+ name_nodes << arg
352
+ else
353
+ # Non-symbol argument, report error
354
+ diagnostics << Diagnostic::AttributeNonSymbolName.new(
355
+ rbs_location(arg.location),
356
+ "Attribute name must be a symbol"
357
+ )
358
+ end
359
+ end
360
+
361
+ return if name_nodes.empty?
362
+
363
+ # Look for leading comment block
364
+ leading_block = comments.leading_block!(node)
365
+
366
+ # Look for trailing type annotation (#: Type)
367
+ trailing_block = comments.trailing_block!(node.location)
368
+ type_annotation = nil
369
+
370
+ if trailing_block
371
+ case annotation = trailing_block.trailing_annotation([])
372
+ when AST::Ruby::Annotations::NodeTypeAssertion
373
+ type_annotation = annotation
374
+ when AST::Ruby::CommentBlock::AnnotationSyntaxError
375
+ diagnostics << Diagnostic::AnnotationSyntaxError.new(
376
+ annotation.location, "Syntax error: " + annotation.error.error_message
377
+ )
378
+ end
379
+ end
380
+
381
+ # Report unused leading annotations since @rbs annotations are not used for attributes
382
+ if leading_block
383
+ report_unused_block(leading_block)
384
+ end
385
+
386
+ # Create the appropriate member type
387
+ member = case node.name
388
+ when :attr_reader
389
+ AST::Ruby::Members::AttrReaderMember.new(buffer, node, name_nodes, leading_block, type_annotation)
390
+ when :attr_writer
391
+ AST::Ruby::Members::AttrWriterMember.new(buffer, node, name_nodes, leading_block, type_annotation)
392
+ when :attr_accessor
393
+ AST::Ruby::Members::AttrAccessorMember.new(buffer, node, name_nodes, leading_block, type_annotation)
394
+ else
395
+ raise "Unexpected attribute method: #{node.name}"
396
+ end
397
+
398
+ current_module!.members << member
399
+ end
400
+
401
+ def parse_constant_declaration(node)
402
+ # Create TypeName for the constant
403
+ unless constant_name = constant_as_type_name(node)
404
+ location =
405
+ case node
406
+ when Prism::ConstantWriteNode
407
+ node.name_loc
408
+ when Prism::ConstantPathWriteNode
409
+ node.target.location
410
+ end
411
+
412
+ diagnostics << Diagnostic::NonConstantConstantDeclaration.new(
413
+ rbs_location(location),
414
+ "Constant name must be a constant"
415
+ )
416
+ return
417
+ end
418
+
419
+ # Look for leading comment block
420
+ leading_block = comments.leading_block!(node)
421
+ report_unused_block(leading_block) if leading_block
422
+
423
+ # Look for trailing type annotation (#: Type)
424
+ trailing_block = comments.trailing_block!(node.location)
425
+ type_annotation = nil
426
+ alias_annotation = nil
427
+
428
+ if trailing_block
429
+ case annotation = trailing_block.trailing_annotation([])
430
+ when AST::Ruby::Annotations::NodeTypeAssertion
431
+ type_annotation = annotation
432
+ when AST::Ruby::Annotations::ClassAliasAnnotation, AST::Ruby::Annotations::ModuleAliasAnnotation
433
+ alias_annotation = annotation
434
+ when AST::Ruby::CommentBlock::AnnotationSyntaxError
435
+ diagnostics << Diagnostic::AnnotationSyntaxError.new(
436
+ annotation.location, "Syntax error: " + annotation.error.error_message
437
+ )
438
+ end
439
+ end
440
+
441
+ # Handle class/module alias declarations
442
+ if alias_annotation
443
+ # Try to infer the old name from the right-hand side
444
+ infered_old_name = constant_as_type_name(node.value)
445
+
446
+ # Check if we have either an explicit type name or can infer one
447
+ if alias_annotation.type_name.nil? && infered_old_name.nil?
448
+ message =
449
+ if alias_annotation.is_a?(AST::Ruby::Annotations::ClassAliasAnnotation)
450
+ "Class name is missing in class alias declaration"
451
+ else
452
+ "Module name is missing in module alias declaration"
453
+ end
454
+
455
+ diagnostics << Diagnostic::ClassModuleAliasDeclarationMissingTypeName.new(
456
+ alias_annotation.location,
457
+ message
458
+ )
459
+ return
460
+ end
461
+
462
+ # Create class/module alias declaration
463
+ alias_decl = AST::Ruby::Declarations::ClassModuleAliasDecl.new(
464
+ buffer,
465
+ node,
466
+ constant_name,
467
+ infered_old_name,
468
+ leading_block,
469
+ alias_annotation
470
+ )
471
+
472
+ # Insert the alias declaration appropriately
473
+
474
+ if current_module
475
+ current_module.members << alias_decl
476
+ else
477
+ result.declarations << alias_decl
478
+ end
479
+ else
480
+ # Create regular constant declaration
481
+ constant_decl = AST::Ruby::Declarations::ConstantDecl.new(
482
+ buffer,
483
+ constant_name,
484
+ node,
485
+ leading_block,
486
+ type_annotation
487
+ )
488
+
489
+ # Insert the constant declaration appropriately
490
+ if current_module
491
+ current_module.members << constant_decl
492
+ else
493
+ result.declarations << constant_decl
494
+ end
495
+ end
496
+ end
497
+
498
+ def insert_declaration(decl)
499
+ if current_module
500
+ current_module.members << decl
501
+ else
502
+ result.declarations << decl
503
+ end
504
+ end
505
+
506
+ def report_unused_annotation(*annotations)
507
+ annotations.each do |annotation|
508
+ case annotation
509
+ when AST::Ruby::CommentBlock::AnnotationSyntaxError
510
+ diagnostics << Diagnostic::AnnotationSyntaxError.new(
511
+ annotation.location, "Syntax error: " + annotation.error.error_message
512
+ )
513
+ when AST::Ruby::Annotations::Base
514
+ diagnostics << Diagnostic::UnusedInlineAnnotation.new(
515
+ annotation.location, "Unused inline rbs annotation"
516
+ )
517
+ end
518
+ end
519
+ end
520
+
521
+ def report_unused_block(block)
522
+ return unless block.leading?
523
+
524
+ block.each_paragraph([]) do |paragraph|
525
+ case paragraph
526
+ when Location
527
+ # noop
528
+ else
529
+ report_unused_annotation(paragraph)
530
+ end
531
+ end
532
+ end
533
+
534
+ def parse_super_class(super_class_expr, inheritance_operator_loc)
535
+ # Check if the superclass is a constant
536
+ unless super_class_name = constant_as_type_name(super_class_expr)
537
+ diagnostics << Diagnostic::NonConstantSuperClassName.new(
538
+ rbs_location(super_class_expr.location),
539
+ "Super class name must be a constant"
540
+ )
541
+ return nil
542
+ end
543
+
544
+ # Look for type application annotation in trailing comments
545
+ # For example: class StringArray < Array #[String]
546
+ trailing_block = comments.trailing_block!(super_class_expr.location)
547
+ type_annotation = nil
548
+
549
+ if trailing_block
550
+ case annotation = trailing_block.trailing_annotation([])
551
+ when AST::Ruby::Annotations::TypeApplicationAnnotation
552
+ type_annotation = annotation
553
+ else
554
+ report_unused_annotation(annotation)
555
+ end
556
+ end
557
+
558
+ # Create SuperClass object
559
+ AST::Ruby::Declarations::ClassDecl::SuperClass.new(
560
+ rbs_location(super_class_expr.location),
561
+ rbs_location(inheritance_operator_loc),
562
+ super_class_name,
563
+ type_annotation
564
+ )
565
+ end
566
+ end
567
+ end
568
+ end