rbs-relaxed 3.9.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (484) hide show
  1. checksums.yaml +7 -0
  2. data/.github/dependabot.yml +22 -0
  3. data/.github/workflows/comments.yml +35 -0
  4. data/.github/workflows/dependabot.yml +30 -0
  5. data/.github/workflows/ruby.yml +82 -0
  6. data/.github/workflows/typecheck.yml +38 -0
  7. data/.github/workflows/windows.yml +43 -0
  8. data/.gitignore +23 -0
  9. data/.rubocop.yml +68 -0
  10. data/BSDL +22 -0
  11. data/CHANGELOG.md +1868 -0
  12. data/COPYING +56 -0
  13. data/README.md +203 -0
  14. data/Rakefile +417 -0
  15. data/Steepfile +44 -0
  16. data/config.yml +313 -0
  17. data/core/array.rbs +4062 -0
  18. data/core/basic_object.rbs +375 -0
  19. data/core/binding.rbs +150 -0
  20. data/core/builtin.rbs +277 -0
  21. data/core/class.rbs +220 -0
  22. data/core/comparable.rbs +171 -0
  23. data/core/complex.rbs +786 -0
  24. data/core/constants.rbs +96 -0
  25. data/core/data.rbs +415 -0
  26. data/core/dir.rbs +981 -0
  27. data/core/encoding.rbs +1371 -0
  28. data/core/enumerable.rbs +2405 -0
  29. data/core/enumerator/product.rbs +92 -0
  30. data/core/enumerator.rbs +630 -0
  31. data/core/env.rbs +6 -0
  32. data/core/errno.rbs +673 -0
  33. data/core/errors.rbs +760 -0
  34. data/core/exception.rbs +485 -0
  35. data/core/false_class.rbs +82 -0
  36. data/core/fiber.rbs +550 -0
  37. data/core/fiber_error.rbs +11 -0
  38. data/core/file.rbs +2936 -0
  39. data/core/file_test.rbs +331 -0
  40. data/core/float.rbs +1151 -0
  41. data/core/gc.rbs +644 -0
  42. data/core/global_variables.rbs +184 -0
  43. data/core/hash.rbs +1861 -0
  44. data/core/integer.rbs +1413 -0
  45. data/core/io/buffer.rbs +984 -0
  46. data/core/io/wait.rbs +70 -0
  47. data/core/io.rbs +3406 -0
  48. data/core/kernel.rbs +3096 -0
  49. data/core/marshal.rbs +207 -0
  50. data/core/match_data.rbs +635 -0
  51. data/core/math.rbs +729 -0
  52. data/core/method.rbs +386 -0
  53. data/core/module.rbs +1704 -0
  54. data/core/nil_class.rbs +209 -0
  55. data/core/numeric.rbs +818 -0
  56. data/core/object.rbs +110 -0
  57. data/core/object_space/weak_key_map.rbs +166 -0
  58. data/core/object_space.rbs +190 -0
  59. data/core/proc.rbs +868 -0
  60. data/core/process.rbs +2296 -0
  61. data/core/ractor.rbs +1068 -0
  62. data/core/random.rbs +237 -0
  63. data/core/range.rbs +1107 -0
  64. data/core/rational.rbs +531 -0
  65. data/core/rb_config.rbs +88 -0
  66. data/core/rbs/unnamed/argf.rbs +1229 -0
  67. data/core/rbs/unnamed/env_class.rbs +1209 -0
  68. data/core/rbs/unnamed/random.rbs +293 -0
  69. data/core/refinement.rbs +59 -0
  70. data/core/regexp.rbs +1930 -0
  71. data/core/ruby_vm.rbs +765 -0
  72. data/core/rubygems/basic_specification.rbs +6 -0
  73. data/core/rubygems/config_file.rbs +38 -0
  74. data/core/rubygems/dependency_installer.rbs +6 -0
  75. data/core/rubygems/errors.rbs +176 -0
  76. data/core/rubygems/installer.rbs +15 -0
  77. data/core/rubygems/path_support.rbs +6 -0
  78. data/core/rubygems/platform.rbs +7 -0
  79. data/core/rubygems/request_set.rbs +49 -0
  80. data/core/rubygems/requirement.rbs +148 -0
  81. data/core/rubygems/rubygems.rbs +1171 -0
  82. data/core/rubygems/source_list.rbs +15 -0
  83. data/core/rubygems/specification.rbs +23 -0
  84. data/core/rubygems/stream_ui.rbs +5 -0
  85. data/core/rubygems/uninstaller.rbs +10 -0
  86. data/core/rubygems/version.rbs +294 -0
  87. data/core/set.rbs +621 -0
  88. data/core/signal.rbs +100 -0
  89. data/core/string.rbs +3583 -0
  90. data/core/struct.rbs +667 -0
  91. data/core/symbol.rbs +475 -0
  92. data/core/thread.rbs +1765 -0
  93. data/core/thread_group.rbs +79 -0
  94. data/core/time.rbs +1762 -0
  95. data/core/trace_point.rbs +477 -0
  96. data/core/true_class.rbs +98 -0
  97. data/core/unbound_method.rbs +329 -0
  98. data/core/warning.rbs +87 -0
  99. data/docs/CONTRIBUTING.md +106 -0
  100. data/docs/architecture.md +110 -0
  101. data/docs/collection.md +192 -0
  102. data/docs/data_and_struct.md +86 -0
  103. data/docs/gem.md +57 -0
  104. data/docs/rbs_by_example.md +309 -0
  105. data/docs/repo.md +125 -0
  106. data/docs/sigs.md +167 -0
  107. data/docs/stdlib.md +147 -0
  108. data/docs/syntax.md +910 -0
  109. data/docs/tools.md +17 -0
  110. data/exe/rbs +7 -0
  111. data/ext/rbs_extension/extconf.rb +15 -0
  112. data/ext/rbs_extension/lexer.c +2728 -0
  113. data/ext/rbs_extension/lexer.h +179 -0
  114. data/ext/rbs_extension/lexer.re +147 -0
  115. data/ext/rbs_extension/lexstate.c +175 -0
  116. data/ext/rbs_extension/location.c +325 -0
  117. data/ext/rbs_extension/location.h +85 -0
  118. data/ext/rbs_extension/main.c +33 -0
  119. data/ext/rbs_extension/parser.c +2973 -0
  120. data/ext/rbs_extension/parser.h +18 -0
  121. data/ext/rbs_extension/parserstate.c +397 -0
  122. data/ext/rbs_extension/parserstate.h +163 -0
  123. data/ext/rbs_extension/rbs_extension.h +31 -0
  124. data/ext/rbs_extension/unescape.c +32 -0
  125. data/goodcheck.yml +91 -0
  126. data/include/rbs/constants.h +82 -0
  127. data/include/rbs/ruby_objs.h +72 -0
  128. data/include/rbs/util/rbs_constant_pool.h +219 -0
  129. data/include/rbs.h +7 -0
  130. data/lib/rbs/ancestor_graph.rb +92 -0
  131. data/lib/rbs/annotate/annotations.rb +199 -0
  132. data/lib/rbs/annotate/formatter.rb +92 -0
  133. data/lib/rbs/annotate/rdoc_annotator.rb +400 -0
  134. data/lib/rbs/annotate/rdoc_source.rb +131 -0
  135. data/lib/rbs/annotate.rb +8 -0
  136. data/lib/rbs/ast/annotation.rb +29 -0
  137. data/lib/rbs/ast/comment.rb +29 -0
  138. data/lib/rbs/ast/declarations.rb +467 -0
  139. data/lib/rbs/ast/directives.rb +49 -0
  140. data/lib/rbs/ast/members.rb +451 -0
  141. data/lib/rbs/ast/type_param.rb +225 -0
  142. data/lib/rbs/ast/visitor.rb +137 -0
  143. data/lib/rbs/buffer.rb +67 -0
  144. data/lib/rbs/builtin_names.rb +58 -0
  145. data/lib/rbs/cli/colored_io.rb +48 -0
  146. data/lib/rbs/cli/diff.rb +83 -0
  147. data/lib/rbs/cli/validate.rb +357 -0
  148. data/lib/rbs/cli.rb +1223 -0
  149. data/lib/rbs/collection/cleaner.rb +38 -0
  150. data/lib/rbs/collection/config/lockfile.rb +92 -0
  151. data/lib/rbs/collection/config/lockfile_generator.rb +218 -0
  152. data/lib/rbs/collection/config.rb +81 -0
  153. data/lib/rbs/collection/installer.rb +32 -0
  154. data/lib/rbs/collection/sources/base.rb +14 -0
  155. data/lib/rbs/collection/sources/git.rb +258 -0
  156. data/lib/rbs/collection/sources/local.rb +81 -0
  157. data/lib/rbs/collection/sources/rubygems.rb +48 -0
  158. data/lib/rbs/collection/sources/stdlib.rb +50 -0
  159. data/lib/rbs/collection/sources.rb +38 -0
  160. data/lib/rbs/collection.rb +16 -0
  161. data/lib/rbs/constant.rb +28 -0
  162. data/lib/rbs/definition.rb +401 -0
  163. data/lib/rbs/definition_builder/ancestor_builder.rb +620 -0
  164. data/lib/rbs/definition_builder/method_builder.rb +254 -0
  165. data/lib/rbs/definition_builder.rb +845 -0
  166. data/lib/rbs/diff.rb +125 -0
  167. data/lib/rbs/environment/use_map.rb +77 -0
  168. data/lib/rbs/environment.rb +829 -0
  169. data/lib/rbs/environment_loader.rb +173 -0
  170. data/lib/rbs/environment_walker.rb +155 -0
  171. data/lib/rbs/errors.rb +645 -0
  172. data/lib/rbs/factory.rb +18 -0
  173. data/lib/rbs/file_finder.rb +28 -0
  174. data/lib/rbs/location_aux.rb +138 -0
  175. data/lib/rbs/locator.rb +243 -0
  176. data/lib/rbs/method_type.rb +143 -0
  177. data/lib/rbs/namespace.rb +125 -0
  178. data/lib/rbs/parser/lex_result.rb +15 -0
  179. data/lib/rbs/parser/token.rb +23 -0
  180. data/lib/rbs/parser_aux.rb +114 -0
  181. data/lib/rbs/prototype/helpers.rb +140 -0
  182. data/lib/rbs/prototype/node_usage.rb +99 -0
  183. data/lib/rbs/prototype/rb.rb +840 -0
  184. data/lib/rbs/prototype/rbi.rb +641 -0
  185. data/lib/rbs/prototype/runtime/helpers.rb +59 -0
  186. data/lib/rbs/prototype/runtime/reflection.rb +19 -0
  187. data/lib/rbs/prototype/runtime/value_object_generator.rb +279 -0
  188. data/lib/rbs/prototype/runtime.rb +667 -0
  189. data/lib/rbs/repository.rb +127 -0
  190. data/lib/rbs/resolver/constant_resolver.rb +219 -0
  191. data/lib/rbs/resolver/type_name_resolver.rb +91 -0
  192. data/lib/rbs/sorter.rb +198 -0
  193. data/lib/rbs/substitution.rb +83 -0
  194. data/lib/rbs/subtractor.rb +201 -0
  195. data/lib/rbs/test/errors.rb +80 -0
  196. data/lib/rbs/test/guaranteed.rb +30 -0
  197. data/lib/rbs/test/hook.rb +212 -0
  198. data/lib/rbs/test/observer.rb +19 -0
  199. data/lib/rbs/test/setup.rb +84 -0
  200. data/lib/rbs/test/setup_helper.rb +50 -0
  201. data/lib/rbs/test/tester.rb +167 -0
  202. data/lib/rbs/test/type_check.rb +435 -0
  203. data/lib/rbs/test.rb +112 -0
  204. data/lib/rbs/type_alias_dependency.rb +100 -0
  205. data/lib/rbs/type_alias_regularity.rb +126 -0
  206. data/lib/rbs/type_name.rb +109 -0
  207. data/lib/rbs/types.rb +1596 -0
  208. data/lib/rbs/unit_test/convertibles.rb +176 -0
  209. data/lib/rbs/unit_test/spy.rb +138 -0
  210. data/lib/rbs/unit_test/type_assertions.rb +347 -0
  211. data/lib/rbs/unit_test/with_aliases.rb +143 -0
  212. data/lib/rbs/unit_test.rb +6 -0
  213. data/lib/rbs/validator.rb +186 -0
  214. data/lib/rbs/variance_calculator.rb +189 -0
  215. data/lib/rbs/vendorer.rb +71 -0
  216. data/lib/rbs/version.rb +5 -0
  217. data/lib/rbs/writer.rb +424 -0
  218. data/lib/rbs.rb +94 -0
  219. data/lib/rdoc/discover.rb +20 -0
  220. data/lib/rdoc_plugin/parser.rb +163 -0
  221. data/rbs-relaxed.gemspec +48 -0
  222. data/schema/annotation.json +14 -0
  223. data/schema/comment.json +26 -0
  224. data/schema/decls.json +326 -0
  225. data/schema/function.json +87 -0
  226. data/schema/location.json +56 -0
  227. data/schema/members.json +266 -0
  228. data/schema/methodType.json +50 -0
  229. data/schema/typeParam.json +36 -0
  230. data/schema/types.json +317 -0
  231. data/sig/ancestor_builder.rbs +163 -0
  232. data/sig/ancestor_graph.rbs +60 -0
  233. data/sig/annotate/annotations.rbs +102 -0
  234. data/sig/annotate/formatter.rbs +24 -0
  235. data/sig/annotate/rdoc_annotater.rbs +82 -0
  236. data/sig/annotate/rdoc_source.rbs +30 -0
  237. data/sig/annotation.rbs +27 -0
  238. data/sig/buffer.rbs +32 -0
  239. data/sig/builtin_names.rbs +44 -0
  240. data/sig/cli/colored_io.rbs +15 -0
  241. data/sig/cli/diff.rbs +21 -0
  242. data/sig/cli/validate.rbs +43 -0
  243. data/sig/cli.rbs +87 -0
  244. data/sig/collection/cleaner.rbs +13 -0
  245. data/sig/collection/config/lockfile.rbs +74 -0
  246. data/sig/collection/config/lockfile_generator.rbs +66 -0
  247. data/sig/collection/config.rbs +46 -0
  248. data/sig/collection/installer.rbs +17 -0
  249. data/sig/collection/sources.rbs +214 -0
  250. data/sig/collection.rbs +4 -0
  251. data/sig/comment.rbs +26 -0
  252. data/sig/constant.rbs +21 -0
  253. data/sig/declarations.rbs +267 -0
  254. data/sig/definition.rbs +173 -0
  255. data/sig/definition_builder.rbs +165 -0
  256. data/sig/diff.rbs +28 -0
  257. data/sig/directives.rbs +77 -0
  258. data/sig/environment.rbs +279 -0
  259. data/sig/environment_loader.rbs +111 -0
  260. data/sig/environment_walker.rbs +65 -0
  261. data/sig/errors.rbs +405 -0
  262. data/sig/factory.rbs +5 -0
  263. data/sig/file_finder.rbs +28 -0
  264. data/sig/location.rbs +110 -0
  265. data/sig/locator.rbs +58 -0
  266. data/sig/manifest.yaml +7 -0
  267. data/sig/members.rbs +258 -0
  268. data/sig/method_builder.rbs +84 -0
  269. data/sig/method_types.rbs +58 -0
  270. data/sig/namespace.rbs +146 -0
  271. data/sig/parser.rbs +100 -0
  272. data/sig/prototype/helpers.rbs +27 -0
  273. data/sig/prototype/node_usage.rbs +20 -0
  274. data/sig/prototype/rb.rbs +96 -0
  275. data/sig/prototype/rbi.rbs +75 -0
  276. data/sig/prototype/runtime.rbs +182 -0
  277. data/sig/rbs.rbs +21 -0
  278. data/sig/rdoc/rbs.rbs +67 -0
  279. data/sig/repository.rbs +85 -0
  280. data/sig/resolver/constant_resolver.rbs +92 -0
  281. data/sig/resolver/context.rbs +34 -0
  282. data/sig/resolver/type_name_resolver.rbs +35 -0
  283. data/sig/shims/bundler.rbs +38 -0
  284. data/sig/shims/enumerable.rbs +5 -0
  285. data/sig/shims/rubygems.rbs +19 -0
  286. data/sig/sorter.rbs +41 -0
  287. data/sig/substitution.rbs +48 -0
  288. data/sig/subtractor.rbs +37 -0
  289. data/sig/test/errors.rbs +52 -0
  290. data/sig/test/guranteed.rbs +9 -0
  291. data/sig/test/type_check.rbs +19 -0
  292. data/sig/test.rbs +82 -0
  293. data/sig/type_alias_dependency.rbs +53 -0
  294. data/sig/type_alias_regularity.rbs +98 -0
  295. data/sig/type_param.rbs +110 -0
  296. data/sig/typename.rbs +79 -0
  297. data/sig/types.rbs +579 -0
  298. data/sig/unit_test/convertibles.rbs +154 -0
  299. data/sig/unit_test/spy.rbs +30 -0
  300. data/sig/unit_test/type_assertions.rbs +196 -0
  301. data/sig/unit_test/with_aliases.rbs +136 -0
  302. data/sig/use_map.rbs +35 -0
  303. data/sig/util.rbs +9 -0
  304. data/sig/validator.rbs +63 -0
  305. data/sig/variance_calculator.rbs +87 -0
  306. data/sig/vendorer.rbs +51 -0
  307. data/sig/version.rbs +3 -0
  308. data/sig/visitor.rbs +47 -0
  309. data/sig/writer.rbs +127 -0
  310. data/src/constants.c +153 -0
  311. data/src/ruby_objs.c +795 -0
  312. data/src/util/rbs_constant_pool.c +342 -0
  313. data/stdlib/abbrev/0/abbrev.rbs +66 -0
  314. data/stdlib/abbrev/0/array.rbs +26 -0
  315. data/stdlib/base64/0/base64.rbs +355 -0
  316. data/stdlib/benchmark/0/benchmark.rbs +452 -0
  317. data/stdlib/bigdecimal/0/big_decimal.rbs +1629 -0
  318. data/stdlib/bigdecimal-math/0/big_math.rbs +119 -0
  319. data/stdlib/bigdecimal-math/0/manifest.yaml +2 -0
  320. data/stdlib/cgi/0/core.rbs +1285 -0
  321. data/stdlib/cgi/0/manifest.yaml +3 -0
  322. data/stdlib/coverage/0/coverage.rbs +263 -0
  323. data/stdlib/csv/0/csv.rbs +3776 -0
  324. data/stdlib/csv/0/manifest.yaml +3 -0
  325. data/stdlib/date/0/date.rbs +1585 -0
  326. data/stdlib/date/0/date_time.rbs +616 -0
  327. data/stdlib/date/0/time.rbs +26 -0
  328. data/stdlib/dbm/0/dbm.rbs +421 -0
  329. data/stdlib/delegate/0/delegator.rbs +184 -0
  330. data/stdlib/delegate/0/kernel.rbs +47 -0
  331. data/stdlib/delegate/0/simple_delegator.rbs +96 -0
  332. data/stdlib/did_you_mean/0/did_you_mean.rbs +343 -0
  333. data/stdlib/digest/0/digest.rbs +577 -0
  334. data/stdlib/erb/0/erb.rbs +532 -0
  335. data/stdlib/etc/0/etc.rbs +865 -0
  336. data/stdlib/fileutils/0/fileutils.rbs +1734 -0
  337. data/stdlib/find/0/find.rbs +49 -0
  338. data/stdlib/forwardable/0/forwardable.rbs +268 -0
  339. data/stdlib/io-console/0/io-console.rbs +414 -0
  340. data/stdlib/ipaddr/0/ipaddr.rbs +428 -0
  341. data/stdlib/json/0/json.rbs +1916 -0
  342. data/stdlib/kconv/0/kconv.rbs +166 -0
  343. data/stdlib/logger/0/formatter.rbs +45 -0
  344. data/stdlib/logger/0/log_device.rbs +100 -0
  345. data/stdlib/logger/0/logger.rbs +796 -0
  346. data/stdlib/logger/0/manifest.yaml +2 -0
  347. data/stdlib/logger/0/period.rbs +17 -0
  348. data/stdlib/logger/0/severity.rbs +34 -0
  349. data/stdlib/minitest/0/kernel.rbs +42 -0
  350. data/stdlib/minitest/0/minitest/abstract_reporter.rbs +52 -0
  351. data/stdlib/minitest/0/minitest/assertion.rbs +17 -0
  352. data/stdlib/minitest/0/minitest/assertions.rbs +590 -0
  353. data/stdlib/minitest/0/minitest/backtrace_filter.rbs +23 -0
  354. data/stdlib/minitest/0/minitest/bench_spec.rbs +102 -0
  355. data/stdlib/minitest/0/minitest/benchmark.rbs +259 -0
  356. data/stdlib/minitest/0/minitest/composite_reporter.rbs +25 -0
  357. data/stdlib/minitest/0/minitest/compress.rbs +13 -0
  358. data/stdlib/minitest/0/minitest/error_on_warning.rbs +3 -0
  359. data/stdlib/minitest/0/minitest/expectation.rbs +2 -0
  360. data/stdlib/minitest/0/minitest/expectations.rbs +21 -0
  361. data/stdlib/minitest/0/minitest/guard.rbs +64 -0
  362. data/stdlib/minitest/0/minitest/mock.rbs +64 -0
  363. data/stdlib/minitest/0/minitest/parallel/executor.rbs +46 -0
  364. data/stdlib/minitest/0/minitest/parallel/test/class_methods.rbs +5 -0
  365. data/stdlib/minitest/0/minitest/parallel/test.rbs +3 -0
  366. data/stdlib/minitest/0/minitest/parallel.rbs +2 -0
  367. data/stdlib/minitest/0/minitest/pride_io.rbs +62 -0
  368. data/stdlib/minitest/0/minitest/pride_lol.rbs +19 -0
  369. data/stdlib/minitest/0/minitest/progress_reporter.rbs +11 -0
  370. data/stdlib/minitest/0/minitest/reportable.rbs +53 -0
  371. data/stdlib/minitest/0/minitest/reporter.rbs +5 -0
  372. data/stdlib/minitest/0/minitest/result.rbs +28 -0
  373. data/stdlib/minitest/0/minitest/runnable.rbs +163 -0
  374. data/stdlib/minitest/0/minitest/skip.rbs +6 -0
  375. data/stdlib/minitest/0/minitest/spec/dsl/instance_methods.rbs +48 -0
  376. data/stdlib/minitest/0/minitest/spec/dsl.rbs +129 -0
  377. data/stdlib/minitest/0/minitest/spec.rbs +11 -0
  378. data/stdlib/minitest/0/minitest/statistics_reporter.rbs +81 -0
  379. data/stdlib/minitest/0/minitest/summary_reporter.rbs +18 -0
  380. data/stdlib/minitest/0/minitest/test/lifecycle_hooks.rbs +92 -0
  381. data/stdlib/minitest/0/minitest/test.rbs +69 -0
  382. data/stdlib/minitest/0/minitest/unexpected_error.rbs +12 -0
  383. data/stdlib/minitest/0/minitest/unexpected_warning.rbs +6 -0
  384. data/stdlib/minitest/0/minitest/unit/test_case.rbs +3 -0
  385. data/stdlib/minitest/0/minitest/unit.rbs +4 -0
  386. data/stdlib/minitest/0/minitest.rbs +115 -0
  387. data/stdlib/monitor/0/monitor.rbs +363 -0
  388. data/stdlib/mutex_m/0/mutex_m.rbs +104 -0
  389. data/stdlib/net-http/0/manifest.yaml +3 -0
  390. data/stdlib/net-http/0/net-http.rbs +5552 -0
  391. data/stdlib/net-protocol/0/manifest.yaml +2 -0
  392. data/stdlib/net-protocol/0/net-protocol.rbs +56 -0
  393. data/stdlib/net-smtp/0/manifest.yaml +2 -0
  394. data/stdlib/net-smtp/0/net-smtp.rbs +55 -0
  395. data/stdlib/nkf/0/nkf.rbs +402 -0
  396. data/stdlib/objspace/0/objspace.rbs +487 -0
  397. data/stdlib/observable/0/observable.rbs +217 -0
  398. data/stdlib/open-uri/0/manifest.yaml +4 -0
  399. data/stdlib/open-uri/0/open-uri.rbs +393 -0
  400. data/stdlib/open3/0/open3.rbs +147 -0
  401. data/stdlib/openssl/0/manifest.yaml +3 -0
  402. data/stdlib/openssl/0/openssl.rbs +12113 -0
  403. data/stdlib/optparse/0/optparse.rbs +1725 -0
  404. data/stdlib/pathname/0/pathname.rbs +1406 -0
  405. data/stdlib/pp/0/manifest.yaml +2 -0
  406. data/stdlib/pp/0/pp.rbs +300 -0
  407. data/stdlib/prettyprint/0/prettyprint.rbs +383 -0
  408. data/stdlib/pstore/0/pstore.rbs +603 -0
  409. data/stdlib/psych/0/core_ext.rbs +12 -0
  410. data/stdlib/psych/0/dbm.rbs +237 -0
  411. data/stdlib/psych/0/manifest.yaml +3 -0
  412. data/stdlib/psych/0/psych.rbs +402 -0
  413. data/stdlib/psych/0/store.rbs +59 -0
  414. data/stdlib/pty/0/pty.rbs +237 -0
  415. data/stdlib/rdoc/0/code_object.rbs +51 -0
  416. data/stdlib/rdoc/0/comment.rbs +59 -0
  417. data/stdlib/rdoc/0/context.rbs +153 -0
  418. data/stdlib/rdoc/0/markup.rbs +117 -0
  419. data/stdlib/rdoc/0/parser.rbs +56 -0
  420. data/stdlib/rdoc/0/rdoc.rbs +391 -0
  421. data/stdlib/rdoc/0/ri.rbs +17 -0
  422. data/stdlib/rdoc/0/store.rbs +48 -0
  423. data/stdlib/rdoc/0/top_level.rbs +97 -0
  424. data/stdlib/resolv/0/manifest.yaml +3 -0
  425. data/stdlib/resolv/0/resolv.rbs +1830 -0
  426. data/stdlib/ripper/0/ripper.rbs +1648 -0
  427. data/stdlib/securerandom/0/securerandom.rbs +62 -0
  428. data/stdlib/shellwords/0/shellwords.rbs +229 -0
  429. data/stdlib/singleton/0/singleton.rbs +131 -0
  430. data/stdlib/socket/0/addrinfo.rbs +666 -0
  431. data/stdlib/socket/0/basic_socket.rbs +590 -0
  432. data/stdlib/socket/0/constants.rbs +2295 -0
  433. data/stdlib/socket/0/ip_socket.rbs +92 -0
  434. data/stdlib/socket/0/socket.rbs +4157 -0
  435. data/stdlib/socket/0/socket_error.rbs +5 -0
  436. data/stdlib/socket/0/tcp_server.rbs +192 -0
  437. data/stdlib/socket/0/tcp_socket.rbs +79 -0
  438. data/stdlib/socket/0/udp_socket.rbs +133 -0
  439. data/stdlib/socket/0/unix_server.rbs +169 -0
  440. data/stdlib/socket/0/unix_socket.rbs +172 -0
  441. data/stdlib/stringio/0/stringio.rbs +567 -0
  442. data/stdlib/strscan/0/string_scanner.rbs +1627 -0
  443. data/stdlib/tempfile/0/tempfile.rbs +479 -0
  444. data/stdlib/time/0/time.rbs +432 -0
  445. data/stdlib/timeout/0/timeout.rbs +81 -0
  446. data/stdlib/tmpdir/0/tmpdir.rbs +69 -0
  447. data/stdlib/tsort/0/cyclic.rbs +5 -0
  448. data/stdlib/tsort/0/interfaces.rbs +20 -0
  449. data/stdlib/tsort/0/tsort.rbs +409 -0
  450. data/stdlib/uri/0/common.rbs +582 -0
  451. data/stdlib/uri/0/file.rbs +118 -0
  452. data/stdlib/uri/0/ftp.rbs +13 -0
  453. data/stdlib/uri/0/generic.rbs +1108 -0
  454. data/stdlib/uri/0/http.rbs +104 -0
  455. data/stdlib/uri/0/https.rbs +14 -0
  456. data/stdlib/uri/0/ldap.rbs +230 -0
  457. data/stdlib/uri/0/ldaps.rbs +14 -0
  458. data/stdlib/uri/0/mailto.rbs +92 -0
  459. data/stdlib/uri/0/rfc2396_parser.rbs +189 -0
  460. data/stdlib/uri/0/rfc3986_parser.rbs +2 -0
  461. data/stdlib/uri/0/ws.rbs +13 -0
  462. data/stdlib/uri/0/wss.rbs +9 -0
  463. data/stdlib/yaml/0/manifest.yaml +2 -0
  464. data/stdlib/yaml/0/yaml.rbs +1 -0
  465. data/stdlib/zlib/0/buf_error.rbs +10 -0
  466. data/stdlib/zlib/0/data_error.rbs +10 -0
  467. data/stdlib/zlib/0/deflate.rbs +210 -0
  468. data/stdlib/zlib/0/error.rbs +20 -0
  469. data/stdlib/zlib/0/gzip_file/crc_error.rbs +12 -0
  470. data/stdlib/zlib/0/gzip_file/error.rbs +23 -0
  471. data/stdlib/zlib/0/gzip_file/length_error.rbs +12 -0
  472. data/stdlib/zlib/0/gzip_file/no_footer.rbs +11 -0
  473. data/stdlib/zlib/0/gzip_file.rbs +156 -0
  474. data/stdlib/zlib/0/gzip_reader.rbs +293 -0
  475. data/stdlib/zlib/0/gzip_writer.rbs +166 -0
  476. data/stdlib/zlib/0/inflate.rbs +180 -0
  477. data/stdlib/zlib/0/mem_error.rbs +10 -0
  478. data/stdlib/zlib/0/need_dict.rbs +13 -0
  479. data/stdlib/zlib/0/stream_end.rbs +11 -0
  480. data/stdlib/zlib/0/stream_error.rbs +11 -0
  481. data/stdlib/zlib/0/version_error.rbs +11 -0
  482. data/stdlib/zlib/0/zlib.rbs +449 -0
  483. data/stdlib/zlib/0/zstream.rbs +200 -0
  484. metadata +532 -0
@@ -0,0 +1,18 @@
1
+ #ifndef RBS__PARSER_H
2
+ #define RBS__PARSER_H
3
+
4
+ #include "ruby.h"
5
+ #include "parserstate.h"
6
+
7
+ /**
8
+ * RBS::Parser class
9
+ * */
10
+ extern VALUE RBS_Parser;
11
+
12
+ VALUE parse_type(parserstate *state);
13
+ VALUE parse_method_type(parserstate *state);
14
+ VALUE parse_signature(parserstate *state);
15
+
16
+ void rbs__init_parser();
17
+
18
+ #endif
@@ -0,0 +1,397 @@
1
+ #include "rbs_extension.h"
2
+ #include "rbs/util/rbs_constant_pool.h"
3
+
4
+ #define RESET_TABLE_P(table) (table->size == 0)
5
+
6
+ id_table *alloc_empty_table(void) {
7
+ id_table *table = malloc(sizeof(id_table));
8
+
9
+ *table = (id_table) {
10
+ .size = 10,
11
+ .count = 0,
12
+ .ids = calloc(10, sizeof(rbs_constant_id_t)),
13
+ .next = NULL,
14
+ };
15
+
16
+ return table;
17
+ }
18
+
19
+ id_table *alloc_reset_table(void) {
20
+ id_table *table = malloc(sizeof(id_table));
21
+
22
+ *table = (id_table) {
23
+ .size = 0,
24
+ .count = 0,
25
+ .ids = NULL,
26
+ .next = NULL,
27
+ };
28
+
29
+ return table;
30
+ }
31
+
32
+ id_table *parser_push_typevar_table(parserstate *state, bool reset) {
33
+ if (reset) {
34
+ id_table *table = alloc_reset_table();
35
+ table->next = state->vars;
36
+ state->vars = table;
37
+ }
38
+
39
+ id_table *table = alloc_empty_table();
40
+ table->next = state->vars;
41
+ state->vars = table;
42
+
43
+ return table;
44
+ }
45
+
46
+ void parser_pop_typevar_table(parserstate *state) {
47
+ id_table *table;
48
+
49
+ if (state->vars) {
50
+ table = state->vars;
51
+ state->vars = table->next;
52
+ free(table->ids);
53
+ free(table);
54
+ } else {
55
+ rb_raise(rb_eRuntimeError, "Cannot pop empty table");
56
+ }
57
+
58
+ if (state->vars && RESET_TABLE_P(state->vars)) {
59
+ table = state->vars;
60
+ state->vars = table->next;
61
+ free(table);
62
+ }
63
+ }
64
+
65
+ void parser_insert_typevar(parserstate *state, rbs_constant_id_t id) {
66
+ id_table *table = state->vars;
67
+
68
+ if (RESET_TABLE_P(table)) {
69
+ rb_raise(rb_eRuntimeError, "Cannot insert to reset table");
70
+ }
71
+
72
+ if (table->size == table->count) {
73
+ // expand
74
+ rbs_constant_id_t *ptr = table->ids;
75
+ table->size += 10;
76
+ table->ids = calloc(table->size, sizeof(rbs_constant_id_t));
77
+ memcpy(table->ids, ptr, sizeof(rbs_constant_id_t) * table->count);
78
+ free(ptr);
79
+ }
80
+
81
+ table->ids[table->count++] = id;
82
+ }
83
+
84
+ bool parser_typevar_member(parserstate *state, rbs_constant_id_t id) {
85
+ id_table *table = state->vars;
86
+
87
+ while (table && !RESET_TABLE_P(table)) {
88
+ for (size_t i = 0; i < table->count; i++) {
89
+ if (table->ids[i] == id) {
90
+ return true;
91
+ }
92
+ }
93
+
94
+ table = table->next;
95
+ }
96
+
97
+ return false;
98
+ }
99
+
100
+ void print_parser(parserstate *state) {
101
+ printf(" current_token = %s (%d...%d)\n", token_type_str(state->current_token.type), state->current_token.range.start.char_pos, state->current_token.range.end.char_pos);
102
+ printf(" next_token = %s (%d...%d)\n", token_type_str(state->next_token.type), state->next_token.range.start.char_pos, state->next_token.range.end.char_pos);
103
+ printf(" next_token2 = %s (%d...%d)\n", token_type_str(state->next_token2.type), state->next_token2.range.start.char_pos, state->next_token2.range.end.char_pos);
104
+ printf(" next_token3 = %s (%d...%d)\n", token_type_str(state->next_token3.type), state->next_token3.range.start.char_pos, state->next_token3.range.end.char_pos);
105
+ }
106
+
107
+ void parser_advance(parserstate *state) {
108
+ state->current_token = state->next_token;
109
+ state->next_token = state->next_token2;
110
+ state->next_token2 = state->next_token3;
111
+
112
+ while (true) {
113
+ if (state->next_token3.type == pEOF) {
114
+ break;
115
+ }
116
+
117
+ state->next_token3 = rbsparser_next_token(state->lexstate);
118
+
119
+ if (state->next_token3.type == tCOMMENT) {
120
+ // skip
121
+ } else if (state->next_token3.type == tLINECOMMENT) {
122
+ insert_comment_line(state, state->next_token3);
123
+ } else if (state->next_token3.type == tTRIVIA) {
124
+ //skip
125
+ } else {
126
+ break;
127
+ }
128
+ }
129
+ }
130
+
131
+ /**
132
+ * Advance token if _next_ token is `type`.
133
+ * Ensures one token advance and `state->current_token.type == type`, or current token not changed.
134
+ *
135
+ * @returns true if token advances, false otherwise.
136
+ **/
137
+ bool parser_advance_if(parserstate *state, enum TokenType type) {
138
+ if (state->next_token.type == type) {
139
+ parser_advance(state);
140
+ return true;
141
+ } else {
142
+ return false;
143
+ }
144
+ }
145
+
146
+ void parser_assert(parserstate *state, enum TokenType type) {
147
+ if (state->current_token.type != type) {
148
+ raise_syntax_error(
149
+ state,
150
+ state->current_token,
151
+ "expected a token `%s`",
152
+ token_type_str(type)
153
+ );
154
+ }
155
+ }
156
+
157
+ void parser_advance_assert(parserstate *state, enum TokenType type) {
158
+ parser_advance(state);
159
+ parser_assert(state, type);
160
+ }
161
+
162
+ void print_token(token tok) {
163
+ printf(
164
+ "%s char=%d...%d\n",
165
+ token_type_str(tok.type),
166
+ tok.range.start.char_pos,
167
+ tok.range.end.char_pos
168
+ );
169
+ }
170
+
171
+ void insert_comment_line(parserstate *state, token tok) {
172
+ int prev_line = tok.range.start.line - 1;
173
+
174
+ comment *com = comment_get_comment(state->last_comment, prev_line);
175
+
176
+ if (com) {
177
+ comment_insert_new_line(com, tok);
178
+ } else {
179
+ state->last_comment = alloc_comment(tok, state->last_comment);
180
+ }
181
+ }
182
+
183
+ VALUE get_comment(parserstate *state, int subject_line) {
184
+ int comment_line = subject_line - 1;
185
+
186
+ comment *com = comment_get_comment(state->last_comment, comment_line);
187
+
188
+ if (com) {
189
+ return comment_to_ruby(com, state->buffer);
190
+ } else {
191
+ return Qnil;
192
+ }
193
+ }
194
+
195
+ comment *alloc_comment(token comment_token, comment *last_comment) {
196
+ comment *new_comment = malloc(sizeof(comment));
197
+
198
+ *new_comment = (comment) {
199
+ .start = comment_token.range.start,
200
+ .end = comment_token.range.end,
201
+
202
+ .line_size = 0,
203
+ .line_count = 0,
204
+ .tokens = NULL,
205
+
206
+ .next_comment = last_comment,
207
+ };
208
+
209
+ comment_insert_new_line(new_comment, comment_token);
210
+
211
+ return new_comment;
212
+ }
213
+
214
+ void free_comment(comment *com) {
215
+ if (com->next_comment) {
216
+ free_comment(com->next_comment);
217
+ }
218
+
219
+ free(com->tokens);
220
+ free(com);
221
+ }
222
+
223
+ void comment_insert_new_line(comment *com, token comment_token) {
224
+ if (com->line_count == 0) {
225
+ com->start = comment_token.range.start;
226
+ }
227
+
228
+ if (com->line_count == com->line_size) {
229
+ com->line_size += 10;
230
+
231
+ if (com->tokens) {
232
+ token *p = com->tokens;
233
+ com->tokens = calloc(com->line_size, sizeof(token));
234
+ memcpy(com->tokens, p, sizeof(token) * com->line_count);
235
+ free(p);
236
+ } else {
237
+ com->tokens = calloc(com->line_size, sizeof(token));
238
+ }
239
+ }
240
+
241
+ com->tokens[com->line_count++] = comment_token;
242
+ com->end = comment_token.range.end;
243
+ }
244
+
245
+ comment *comment_get_comment(comment *com, int line) {
246
+ if (com == NULL) {
247
+ return NULL;
248
+ }
249
+
250
+ if (com->end.line < line) {
251
+ return NULL;
252
+ }
253
+
254
+ if (com->end.line == line) {
255
+ return com;
256
+ }
257
+
258
+ return comment_get_comment(com->next_comment, line);
259
+ }
260
+
261
+ VALUE comment_to_ruby(comment *com, VALUE buffer) {
262
+ VALUE content = rb_funcall(buffer, rb_intern("content"), 0);
263
+ rb_encoding *enc = rb_enc_get(content);
264
+ VALUE string = rb_enc_str_new_cstr("", enc);
265
+
266
+ int hash_bytes = rb_enc_codelen('#', enc);
267
+ int space_bytes = rb_enc_codelen(' ', enc);
268
+
269
+ for (size_t i = 0; i < com->line_count; i++) {
270
+ token tok = com->tokens[i];
271
+
272
+ char *comment_start = RSTRING_PTR(content) + tok.range.start.byte_pos + hash_bytes;
273
+ int comment_bytes = RANGE_BYTES(tok.range) - hash_bytes;
274
+ unsigned char c = rb_enc_mbc_to_codepoint(comment_start, RSTRING_END(content), enc);
275
+
276
+ if (c == ' ') {
277
+ comment_start += space_bytes;
278
+ comment_bytes -= space_bytes;
279
+ }
280
+
281
+ rb_str_cat(string, comment_start, comment_bytes);
282
+ rb_str_cat_cstr(string, "\n");
283
+ }
284
+
285
+ return rbs_ast_comment(
286
+ string,
287
+ rbs_location_pp(buffer, &com->start, &com->end)
288
+ );
289
+ }
290
+
291
+ lexstate *alloc_lexer(VALUE string, int start_pos, int end_pos) {
292
+ if (start_pos < 0 || end_pos < 0) {
293
+ rb_raise(rb_eArgError, "negative position range: %d...%d", start_pos, end_pos);
294
+ }
295
+
296
+ lexstate *lexer = malloc(sizeof(lexstate));
297
+
298
+ position start_position = (position) {
299
+ .byte_pos = 0,
300
+ .char_pos = 0,
301
+ .line = 1,
302
+ .column = 0,
303
+ };
304
+
305
+ *lexer = (lexstate) {
306
+ .string = string,
307
+ .start_pos = start_pos,
308
+ .end_pos = end_pos,
309
+ .current = start_position,
310
+ .start = { 0 },
311
+ .first_token_of_line = false,
312
+ .last_char = 0,
313
+ };
314
+
315
+ skipn(lexer, start_pos);
316
+ lexer->start = lexer->current;
317
+ lexer->first_token_of_line = lexer->current.column == 0;
318
+
319
+ return lexer;
320
+ }
321
+
322
+ parserstate *alloc_parser(VALUE buffer, lexstate *lexer, int start_pos, int end_pos, VALUE variables) {
323
+ parserstate *parser = malloc(sizeof(parserstate));
324
+
325
+ *parser = (parserstate) {
326
+ .lexstate = lexer,
327
+
328
+ .current_token = NullToken,
329
+ .next_token = NullToken,
330
+ .next_token2 = NullToken,
331
+ .next_token3 = NullToken,
332
+ .buffer = buffer,
333
+
334
+ .vars = NULL,
335
+ .last_comment = NULL,
336
+
337
+ .constant_pool = {},
338
+ };
339
+
340
+ // The parser's constant pool is mainly used for storing the names of type variables, which usually aren't many.
341
+ // Below are some statistics gathered from the current test suite. We can see that 56% of parsers never add to their
342
+ // constant pool at all. The initial capacity needs to be a power of 2. Picking 2 means that we won't need to realloc
343
+ // in 85% of cases.
344
+ //
345
+ // TODO: recalculate these statistics based on a real world codebase, rather than the test suite.
346
+ //
347
+ // | Size | Count | Cumulative | % Coverage |
348
+ // |------|-------|------------|------------|
349
+ // | 0 | 7,862 | 7,862 | 56% |
350
+ // | 1 | 3,196 | 11,058 | 79% |
351
+ // | 2 | 778 | 12,719 | 85% |
352
+ // | 3 | 883 | 11,941 | 91% |
353
+ // | 4 | 478 | 13,197 | 95% |
354
+ // | 5 | 316 | 13,513 | 97% |
355
+ // | 6 | 288 | 13,801 | 99% |
356
+ // | 7 | 144 | 13,945 | 100% |
357
+ const size_t initial_pool_capacity = 2;
358
+ rbs_constant_pool_init(&parser->constant_pool, initial_pool_capacity);
359
+
360
+ parser_advance(parser);
361
+ parser_advance(parser);
362
+ parser_advance(parser);
363
+
364
+ if (!NIL_P(variables)) {
365
+ if (!RB_TYPE_P(variables, T_ARRAY)) {
366
+ rb_raise(rb_eTypeError,
367
+ "wrong argument type %"PRIsVALUE" (must be array or nil)",
368
+ rb_obj_class(variables));
369
+ }
370
+
371
+ parser_push_typevar_table(parser, true);
372
+
373
+ for (long i = 0; i < rb_array_len(variables); i++) {
374
+ VALUE symbol = rb_ary_entry(variables, i);
375
+ VALUE name = rb_sym2str(symbol);
376
+
377
+ rbs_constant_id_t id = rbs_constant_pool_insert_shared(
378
+ &parser->constant_pool,
379
+ (const uint8_t *) RSTRING_PTR(name),
380
+ RSTRING_LEN(name)
381
+ );
382
+
383
+ parser_insert_typevar(parser, id);
384
+ }
385
+ }
386
+
387
+ return parser;
388
+ }
389
+
390
+ void free_parser(parserstate *parser) {
391
+ free(parser->lexstate);
392
+ if (parser->last_comment) {
393
+ free_comment(parser->last_comment);
394
+ }
395
+ rbs_constant_pool_free(&parser->constant_pool);
396
+ free(parser);
397
+ }
@@ -0,0 +1,163 @@
1
+ #ifndef RBS__PARSERSTATE_H
2
+ #define RBS__PARSERSTATE_H
3
+
4
+ #include <stdbool.h>
5
+
6
+ #include "lexer.h"
7
+ #include "location.h"
8
+
9
+ /**
10
+ * id_table represents a set of RBS constant IDs.
11
+ * This is used to manage the set of bound variables.
12
+ * */
13
+ typedef struct id_table {
14
+ size_t size;
15
+ size_t count;
16
+ rbs_constant_id_t *ids;
17
+ struct id_table *next;
18
+ } id_table;
19
+
20
+ /**
21
+ * comment represents a sequence of comment lines.
22
+ *
23
+ * # Comment for the method.
24
+ * #
25
+ * # ```rb
26
+ * # object.foo() # Do something
27
+ * # ```
28
+ * #
29
+ * def foo: () -> void
30
+ *
31
+ * A comment object represents the six lines of comments.
32
+ * */
33
+ typedef struct comment {
34
+ position start;
35
+ position end;
36
+
37
+ size_t line_size;
38
+ size_t line_count;
39
+ token *tokens;
40
+
41
+ struct comment *next_comment;
42
+ } comment;
43
+
44
+ /**
45
+ * An RBS parser is a LL(3) parser.
46
+ * */
47
+ typedef struct {
48
+ lexstate *lexstate;
49
+
50
+ token current_token;
51
+ token next_token; /* The first lookahead token */
52
+ token next_token2; /* The second lookahead token */
53
+ token next_token3; /* The third lookahead token */
54
+ VALUE buffer;
55
+
56
+ id_table *vars; /* Known type variables */
57
+ comment *last_comment; /* Last read comment */
58
+
59
+ rbs_constant_pool_t constant_pool;
60
+ } parserstate;
61
+
62
+ comment *alloc_comment(token comment_token, comment *last_comment);
63
+ void free_comment(comment *com);
64
+ void comment_insert_new_line(comment *com, token comment_token);
65
+ comment *comment_get_comment(comment *com, int line);
66
+ VALUE comment_to_ruby(comment *com, VALUE buffer);
67
+
68
+ /**
69
+ * Insert new table entry.
70
+ * Setting `reset` inserts a _reset_ entry, which stops searching.
71
+ *
72
+ * ```
73
+ * class Foo[A]
74
+ * ^^^ <= push new table with reset
75
+ * def foo: [B] () -> [A, B]
76
+ * ^^^ <= push new table without reset
77
+ *
78
+ * class Baz[C]
79
+ * ^^^ <= push new table with reset
80
+ * end
81
+ * end
82
+ * ```
83
+ * */
84
+ id_table *parser_push_typevar_table(parserstate *state, bool reset);
85
+ void parser_pop_typevar_table(parserstate *state);
86
+ /**
87
+ * Insert new type variable into the latest table.
88
+ * */
89
+ void parser_insert_typevar(parserstate *state, rbs_constant_id_t id);
90
+
91
+ /**
92
+ * Returns true if given type variable is recorded in the table.
93
+ * If not found, it goes one table up, if it's not a reset table.
94
+ * Or returns false, if it's a reset table.
95
+ * */
96
+ bool parser_typevar_member(parserstate *state, rbs_constant_id_t id);
97
+
98
+ /**
99
+ * Allocate new lexstate object.
100
+ *
101
+ * ```
102
+ * VALUE string = rb_funcall(buffer, rb_intern("content"), 0);
103
+ * alloc_lexer(string, 0, 31) // New lexstate with buffer content
104
+ * ```
105
+ * */
106
+ lexstate *alloc_lexer(VALUE string, int start_pos, int end_pos);
107
+
108
+ /**
109
+ * Allocate new parserstate object.
110
+ *
111
+ * ```
112
+ * alloc_parser(buffer, lexer, 0, 1, variables) // New parserstate with variables
113
+ * alloc_parser(buffer, lexer, 3, 5, Qnil) // New parserstate without variables
114
+ * ```
115
+ * */
116
+ parserstate *alloc_parser(VALUE buffer, lexstate *lexer, int start_pos, int end_pos, VALUE variables);
117
+ void free_parser(parserstate *parser);
118
+ /**
119
+ * Advance one token.
120
+ * */
121
+ void parser_advance(parserstate *state);
122
+
123
+ /**
124
+ * @brief Raises an exception if `current_token->type != type`.
125
+ *
126
+ * @param state
127
+ * @param type
128
+ */
129
+ void parser_assert(parserstate *state, enum TokenType type);
130
+
131
+ /**
132
+ * Advance one token, and assert the current token type.
133
+ * Raises an exception if `current_token->type != type`.
134
+ * */
135
+ void parser_advance_assert(parserstate *state, enum TokenType type);
136
+
137
+ /**
138
+ * Advance one token if the next_token is a token of the type.
139
+ * */
140
+ bool parser_advance_if(parserstate *state, enum TokenType type);
141
+ void print_parser(parserstate *state);
142
+
143
+ /**
144
+ * Insert new comment line token.
145
+ * */
146
+ void insert_comment_line(parserstate *state, token token);
147
+
148
+ /**
149
+ * Returns a RBS::Comment object associated with an subject at `subject_line`.
150
+ *
151
+ * ```rbs
152
+ * # Comment1
153
+ * class Foo # This is the subject line for Comment1
154
+ *
155
+ * # Comment2
156
+ * %a{annotation} # This is the subject line for Comment2
157
+ * def foo: () -> void
158
+ * end
159
+ * ```
160
+ * */
161
+ VALUE get_comment(parserstate *state, int subject_line);
162
+
163
+ #endif
@@ -0,0 +1,31 @@
1
+ #include <stdbool.h>
2
+
3
+ #include "ruby.h"
4
+ #include "ruby/re.h"
5
+ #include "ruby/encoding.h"
6
+
7
+ #include "rbs.h"
8
+ #include "lexer.h"
9
+ #include "parser.h"
10
+
11
+ /**
12
+ * Receives `parserstate` and `range`, which represents a string token or symbol token, and returns a string VALUE.
13
+ *
14
+ * Input token | Output string
15
+ * ------------+-------------
16
+ * "foo\\n" | foo\n
17
+ * 'foo' | foo
18
+ * `bar` | bar
19
+ * :"baz\\t" | baz\t
20
+ * :'baz' | baz
21
+ * */
22
+ VALUE rbs_unquote_string(parserstate *state, range rg, int offset_bytes);
23
+
24
+ /**
25
+ * Raises RBS::ParsingError on `tok` with message constructed with given `fmt`.
26
+ *
27
+ * ```
28
+ * foo.rbs:11:21...11:25: Syntax error: {message}, token=`{tok source}` ({tok type})
29
+ * ```
30
+ * */
31
+ PRINTF_ARGS(NORETURN(void) raise_syntax_error(parserstate *state, token tok, const char *fmt, ...), 3, 4);
@@ -0,0 +1,32 @@
1
+ #include "rbs_extension.h"
2
+
3
+ VALUE rbs_unquote_string(parserstate *state, range rg, int offset_bytes) {
4
+ VALUE string = state->lexstate->string;
5
+ rb_encoding *enc = rb_enc_get(string);
6
+
7
+ unsigned int first_char = rb_enc_mbc_to_codepoint(
8
+ RSTRING_PTR(string) + rg.start.byte_pos + offset_bytes,
9
+ RSTRING_END(string),
10
+ enc
11
+ );
12
+
13
+ int byte_length = rg.end.byte_pos - rg.start.byte_pos - offset_bytes;
14
+
15
+ if (first_char == '"' || first_char == '\'' || first_char == '`') {
16
+ int bs = rb_enc_codelen(first_char, enc);
17
+ offset_bytes += bs;
18
+ byte_length -= 2 * bs;
19
+ }
20
+
21
+ char *buffer = RSTRING_PTR(state->lexstate->string) + rg.start.byte_pos + offset_bytes;
22
+ VALUE str = rb_enc_str_new(buffer, byte_length, enc);
23
+
24
+ return rb_funcall(
25
+ RBS_Types_Literal,
26
+ rb_intern("unescape_string"),
27
+ 2,
28
+ str,
29
+ first_char == '\"' ? Qtrue : Qfalse
30
+ );
31
+ }
32
+