rbs 3.9.4 → 4.1.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 (348) hide show
  1. checksums.yaml +4 -4
  2. data/.clang-format +75 -0
  3. data/.clangd +2 -0
  4. data/.dockerignore +37 -0
  5. data/.github/dependabot.yml +16 -14
  6. data/.github/workflows/bundle-update.yml +63 -0
  7. data/.github/workflows/c-check.yml +66 -0
  8. data/.github/workflows/comments.yml +5 -3
  9. data/.github/workflows/dependabot.yml +2 -2
  10. data/.github/workflows/jruby.yml +79 -0
  11. data/.github/workflows/release-gems.yml +164 -0
  12. data/.github/workflows/ruby.yml +84 -30
  13. data/.github/workflows/rust.yml +186 -0
  14. data/.github/workflows/truffleruby.yml +54 -0
  15. data/.github/workflows/typecheck.yml +5 -2
  16. data/.github/workflows/wasm.yml +55 -0
  17. data/.github/workflows/windows.yml +9 -3
  18. data/.gitignore +16 -0
  19. data/.rubocop.yml +2 -2
  20. data/CHANGELOG.md +430 -0
  21. data/Dockerfile.jruby +53 -0
  22. data/README.md +41 -4
  23. data/Rakefile +777 -60
  24. data/Steepfile +11 -0
  25. data/config.yml +660 -62
  26. data/core/array.rbs +541 -398
  27. data/core/basic_object.rbs +9 -8
  28. data/core/binding.rbs +0 -2
  29. data/core/builtin.rbs +9 -8
  30. data/core/class.rbs +11 -8
  31. data/core/comparable.rbs +55 -34
  32. data/core/complex.rbs +104 -78
  33. data/core/dir.rbs +61 -49
  34. data/core/encoding.rbs +12 -15
  35. data/core/enumerable.rbs +297 -196
  36. data/core/enumerator/arithmetic_sequence.rbs +70 -0
  37. data/core/enumerator/product.rbs +5 -5
  38. data/core/enumerator.rbs +91 -28
  39. data/core/errno.rbs +11 -2
  40. data/core/errors.rbs +58 -29
  41. data/core/exception.rbs +13 -13
  42. data/core/fiber.rbs +74 -54
  43. data/core/file.rbs +260 -1151
  44. data/core/file_constants.rbs +463 -0
  45. data/core/file_stat.rbs +534 -0
  46. data/core/file_test.rbs +3 -3
  47. data/core/float.rbs +257 -116
  48. data/core/gc.rbs +425 -281
  49. data/core/hash.rbs +1151 -829
  50. data/core/integer.rbs +156 -195
  51. data/core/io/buffer.rbs +53 -42
  52. data/core/io/wait.rbs +13 -35
  53. data/core/io.rbs +220 -154
  54. data/core/kernel.rbs +239 -163
  55. data/core/marshal.rbs +4 -4
  56. data/core/match_data.rbs +16 -14
  57. data/core/math.rbs +107 -66
  58. data/core/method.rbs +69 -33
  59. data/core/module.rbs +302 -150
  60. data/core/nil_class.rbs +7 -6
  61. data/core/numeric.rbs +77 -63
  62. data/core/object.rbs +9 -11
  63. data/core/object_space/weak_key_map.rbs +7 -7
  64. data/core/object_space.rbs +30 -23
  65. data/core/pathname.rbs +1312 -0
  66. data/core/proc.rbs +95 -58
  67. data/core/process.rbs +222 -202
  68. data/core/ractor.rbs +364 -518
  69. data/core/random.rbs +21 -3
  70. data/core/range.rbs +181 -79
  71. data/core/rational.rbs +60 -89
  72. data/core/rbs/ops.rbs +154 -0
  73. data/core/rbs/unnamed/argf.rbs +63 -56
  74. data/core/rbs/unnamed/env_class.rbs +19 -14
  75. data/core/rbs/unnamed/main_class.rbs +123 -0
  76. data/core/rbs/unnamed/random.rbs +11 -118
  77. data/core/regexp.rbs +258 -214
  78. data/core/ruby.rbs +53 -0
  79. data/core/ruby_vm.rbs +78 -34
  80. data/core/rubygems/config_file.rbs +5 -5
  81. data/core/rubygems/errors.rbs +6 -70
  82. data/core/rubygems/requirement.rbs +5 -15
  83. data/core/rubygems/rubygems.rbs +18 -81
  84. data/core/rubygems/specification.rbs +8 -0
  85. data/core/rubygems/version.rbs +2 -163
  86. data/core/set.rbs +493 -363
  87. data/core/signal.rbs +26 -16
  88. data/core/string.rbs +3234 -1285
  89. data/core/struct.rbs +43 -42
  90. data/core/symbol.rbs +41 -34
  91. data/core/thread.rbs +139 -83
  92. data/core/time.rbs +81 -50
  93. data/core/trace_point.rbs +41 -35
  94. data/core/true_class.rbs +2 -2
  95. data/core/unbound_method.rbs +24 -16
  96. data/core/warning.rbs +7 -7
  97. data/docs/CONTRIBUTING.md +2 -1
  98. data/docs/aliases.md +79 -0
  99. data/docs/collection.md +3 -3
  100. data/docs/config.md +171 -0
  101. data/docs/encoding.md +56 -0
  102. data/docs/gem.md +0 -1
  103. data/docs/inline.md +634 -0
  104. data/docs/rbs_by_example.md +20 -20
  105. data/docs/release.md +151 -0
  106. data/docs/rust.md +96 -0
  107. data/docs/sigs.md +3 -3
  108. data/docs/syntax.md +48 -18
  109. data/docs/type_fingerprint.md +21 -0
  110. data/docs/wasm_serialization.md +80 -0
  111. data/exe/rbs +1 -1
  112. data/ext/rbs_extension/ast_translation.c +1855 -0
  113. data/ext/rbs_extension/ast_translation.h +41 -0
  114. data/ext/rbs_extension/class_constants.c +187 -0
  115. data/{include/rbs/constants.h → ext/rbs_extension/class_constants.h} +23 -1
  116. data/ext/rbs_extension/compat.h +10 -0
  117. data/ext/rbs_extension/extconf.rb +26 -1
  118. data/ext/rbs_extension/legacy_location.c +299 -0
  119. data/ext/rbs_extension/legacy_location.h +82 -0
  120. data/ext/rbs_extension/main.c +603 -23
  121. data/ext/rbs_extension/rbs_extension.h +6 -21
  122. data/ext/rbs_extension/rbs_string_bridging.c +9 -0
  123. data/ext/rbs_extension/rbs_string_bridging.h +24 -0
  124. data/include/rbs/ast.h +1047 -0
  125. data/include/rbs/defines.h +99 -0
  126. data/include/rbs/lexer.h +207 -0
  127. data/include/rbs/location.h +40 -0
  128. data/include/rbs/parser.h +153 -0
  129. data/include/rbs/serialize.h +39 -0
  130. data/include/rbs/string.h +47 -0
  131. data/include/rbs/util/rbs_allocator.h +59 -0
  132. data/include/rbs/util/rbs_assert.h +20 -0
  133. data/include/rbs/util/rbs_buffer.h +83 -0
  134. data/include/rbs/util/rbs_constant_pool.h +6 -70
  135. data/include/rbs/util/rbs_encoding.h +282 -0
  136. data/include/rbs/util/rbs_unescape.h +24 -0
  137. data/include/rbs.h +9 -2
  138. data/lib/rbs/annotate/formatter.rb +3 -13
  139. data/lib/rbs/annotate/rdoc_annotator.rb +30 -32
  140. data/lib/rbs/annotate/rdoc_source.rb +1 -1
  141. data/lib/rbs/ast/annotation.rb +1 -1
  142. data/lib/rbs/ast/comment.rb +1 -1
  143. data/lib/rbs/ast/declarations.rb +10 -10
  144. data/lib/rbs/ast/members.rb +14 -14
  145. data/lib/rbs/ast/ruby/annotations.rb +451 -0
  146. data/lib/rbs/ast/ruby/comment_block.rb +247 -0
  147. data/lib/rbs/ast/ruby/declarations.rb +291 -0
  148. data/lib/rbs/ast/ruby/helpers/constant_helper.rb +28 -0
  149. data/lib/rbs/ast/ruby/helpers/location_helper.rb +15 -0
  150. data/lib/rbs/ast/ruby/members.rb +762 -0
  151. data/lib/rbs/ast/type_param.rb +24 -4
  152. data/lib/rbs/buffer.rb +142 -20
  153. data/lib/rbs/cli/diff.rb +16 -15
  154. data/lib/rbs/cli/validate.rb +63 -126
  155. data/lib/rbs/cli.rb +59 -29
  156. data/lib/rbs/collection/config/lockfile_generator.rb +28 -3
  157. data/lib/rbs/collection/sources/git.rb +7 -0
  158. data/lib/rbs/definition.rb +6 -1
  159. data/lib/rbs/definition_builder/ancestor_builder.rb +121 -65
  160. data/lib/rbs/definition_builder/method_builder.rb +74 -33
  161. data/lib/rbs/definition_builder.rb +177 -20
  162. data/lib/rbs/diff.rb +7 -1
  163. data/lib/rbs/environment/class_entry.rb +69 -0
  164. data/lib/rbs/environment/module_entry.rb +66 -0
  165. data/lib/rbs/environment.rb +410 -215
  166. data/lib/rbs/environment_loader.rb +2 -8
  167. data/lib/rbs/errors.rb +31 -21
  168. data/lib/rbs/inline_parser/comment_association.rb +117 -0
  169. data/lib/rbs/inline_parser.rb +568 -0
  170. data/lib/rbs/location_aux.rb +36 -4
  171. data/lib/rbs/locator.rb +5 -1
  172. data/lib/rbs/method_type.rb +5 -3
  173. data/lib/rbs/namespace.rb +47 -18
  174. data/lib/rbs/parser_aux.rb +37 -7
  175. data/lib/rbs/prototype/helpers.rb +57 -0
  176. data/lib/rbs/prototype/rb.rb +3 -28
  177. data/lib/rbs/prototype/rbi.rb +196 -45
  178. data/lib/rbs/prototype/runtime.rb +12 -2
  179. data/lib/rbs/resolver/constant_resolver.rb +2 -2
  180. data/lib/rbs/resolver/type_name_resolver.rb +120 -44
  181. data/lib/rbs/rewriter.rb +70 -0
  182. data/lib/rbs/source.rb +99 -0
  183. data/lib/rbs/subtractor.rb +7 -4
  184. data/lib/rbs/test/type_check.rb +25 -3
  185. data/lib/rbs/type_name.rb +34 -21
  186. data/lib/rbs/types.rb +91 -79
  187. data/lib/rbs/unit_test/convertibles.rb +1 -0
  188. data/lib/rbs/unit_test/type_assertions.rb +44 -8
  189. data/lib/rbs/validator.rb +2 -2
  190. data/lib/rbs/version.rb +1 -1
  191. data/lib/rbs/wasm/deserializer.rb +213 -0
  192. data/lib/rbs/wasm/location.rb +61 -0
  193. data/lib/rbs/wasm/parser.rb +137 -0
  194. data/lib/rbs/wasm/runtime.rb +196 -0
  195. data/lib/rbs/wasm/serialization_schema.rb +110 -0
  196. data/lib/rbs.rb +25 -2
  197. data/lib/rbs_jars.rb +39 -0
  198. data/lib/rdoc/discover.rb +1 -1
  199. data/lib/rdoc_plugin/parser.rb +8 -3
  200. data/rbs.gemspec +37 -5
  201. data/schema/typeParam.json +17 -1
  202. data/sig/ancestor_builder.rbs +1 -1
  203. data/sig/annotate/formatter.rbs +2 -2
  204. data/sig/annotate/rdoc_annotater.rbs +13 -10
  205. data/sig/ast/ruby/annotations.rbs +470 -0
  206. data/sig/ast/ruby/comment_block.rbs +127 -0
  207. data/sig/ast/ruby/declarations.rbs +158 -0
  208. data/sig/ast/ruby/helpers/constant_helper.rbs +11 -0
  209. data/sig/ast/ruby/helpers/location_helper.rbs +15 -0
  210. data/sig/ast/ruby/members.rbs +198 -0
  211. data/sig/buffer.rbs +81 -5
  212. data/sig/cli/diff.rbs +5 -11
  213. data/sig/cli/validate.rbs +12 -8
  214. data/sig/cli.rbs +18 -18
  215. data/sig/collection/config/lockfile_generator.rbs +2 -0
  216. data/sig/definition.rbs +6 -0
  217. data/sig/definition_builder.rbs +3 -1
  218. data/sig/environment/class_entry.rbs +50 -0
  219. data/sig/environment/module_entry.rbs +50 -0
  220. data/sig/environment.rbs +94 -87
  221. data/sig/errors.rbs +26 -20
  222. data/sig/inline_parser/comment_association.rbs +71 -0
  223. data/sig/inline_parser.rbs +126 -0
  224. data/sig/location.rbs +32 -7
  225. data/sig/locator.rbs +0 -2
  226. data/sig/manifest.yaml +0 -2
  227. data/sig/method_builder.rbs +9 -4
  228. data/sig/namespace.rbs +20 -5
  229. data/sig/parser.rbs +77 -13
  230. data/sig/prototype/helpers.rbs +2 -0
  231. data/sig/prototype/rbi.rbs +33 -4
  232. data/sig/resolver/type_name_resolver.rbs +36 -10
  233. data/sig/rewriter.rbs +45 -0
  234. data/sig/source.rbs +48 -0
  235. data/sig/type_param.rbs +13 -8
  236. data/sig/typename.rbs +15 -5
  237. data/sig/types.rbs +10 -8
  238. data/sig/unit_test/spy.rbs +0 -8
  239. data/sig/unit_test/type_assertions.rbs +15 -0
  240. data/sig/wasm/deserializer.rbs +66 -0
  241. data/sig/wasm/serialization_schema.rbs +13 -0
  242. data/src/ast.c +1628 -0
  243. data/src/lexer.c +3221 -0
  244. data/src/lexer.re +155 -0
  245. data/src/lexstate.c +221 -0
  246. data/src/location.c +31 -0
  247. data/src/parser.c +4258 -0
  248. data/src/serialize.c +958 -0
  249. data/src/string.c +41 -0
  250. data/src/util/rbs_allocator.c +171 -0
  251. data/src/util/rbs_assert.c +19 -0
  252. data/src/util/rbs_buffer.c +54 -0
  253. data/src/util/rbs_constant_pool.c +18 -92
  254. data/src/util/rbs_encoding.c +21308 -0
  255. data/src/util/rbs_unescape.c +167 -0
  256. data/stdlib/abbrev/0/array.rbs +1 -1
  257. data/stdlib/bigdecimal/0/big_decimal.rbs +116 -98
  258. data/stdlib/bigdecimal-math/0/big_math.rbs +169 -8
  259. data/stdlib/cgi/0/core.rbs +9 -393
  260. data/stdlib/cgi/0/manifest.yaml +1 -0
  261. data/stdlib/cgi-escape/0/escape.rbs +171 -0
  262. data/stdlib/coverage/0/coverage.rbs +7 -4
  263. data/stdlib/csv/0/csv.rbs +5 -5
  264. data/stdlib/date/0/date.rbs +92 -79
  265. data/stdlib/date/0/date_time.rbs +25 -24
  266. data/stdlib/delegate/0/delegator.rbs +11 -7
  267. data/stdlib/did_you_mean/0/did_you_mean.rbs +17 -16
  268. data/stdlib/digest/0/digest.rbs +117 -1
  269. data/stdlib/erb/0/erb.rbs +748 -347
  270. data/stdlib/etc/0/etc.rbs +73 -54
  271. data/stdlib/fileutils/0/fileutils.rbs +179 -160
  272. data/stdlib/forwardable/0/forwardable.rbs +13 -10
  273. data/stdlib/io-console/0/io-console.rbs +2 -2
  274. data/stdlib/ipaddr/0/ipaddr.rbs +0 -5
  275. data/stdlib/json/0/json.rbs +232 -185
  276. data/stdlib/monitor/0/monitor.rbs +5 -5
  277. data/stdlib/net-http/0/net-http.rbs +162 -134
  278. data/stdlib/objspace/0/objspace.rbs +17 -34
  279. data/stdlib/open-uri/0/open-uri.rbs +48 -8
  280. data/stdlib/open3/0/open3.rbs +469 -10
  281. data/stdlib/openssl/0/openssl.rbs +521 -397
  282. data/stdlib/optparse/0/optparse.rbs +26 -17
  283. data/stdlib/pathname/0/pathname.rbs +11 -1381
  284. data/stdlib/pp/0/pp.rbs +9 -8
  285. data/stdlib/prettyprint/0/prettyprint.rbs +7 -7
  286. data/stdlib/pstore/0/pstore.rbs +35 -30
  287. data/stdlib/psych/0/psych.rbs +65 -12
  288. data/stdlib/psych/0/store.rbs +2 -4
  289. data/stdlib/pty/0/pty.rbs +9 -6
  290. data/stdlib/random-formatter/0/random-formatter.rbs +277 -0
  291. data/stdlib/rdoc/0/code_object.rbs +4 -3
  292. data/stdlib/rdoc/0/comment.rbs +2 -0
  293. data/stdlib/rdoc/0/options.rbs +76 -0
  294. data/stdlib/rdoc/0/parser.rbs +1 -1
  295. data/stdlib/rdoc/0/rdoc.rbs +7 -5
  296. data/stdlib/rdoc/0/store.rbs +2 -2
  297. data/stdlib/resolv/0/resolv.rbs +26 -69
  298. data/stdlib/ripper/0/ripper.rbs +25 -19
  299. data/stdlib/securerandom/0/manifest.yaml +2 -0
  300. data/stdlib/securerandom/0/securerandom.rbs +7 -20
  301. data/stdlib/shellwords/0/shellwords.rbs +3 -3
  302. data/stdlib/singleton/0/singleton.rbs +3 -0
  303. data/stdlib/socket/0/addrinfo.rbs +9 -9
  304. data/stdlib/socket/0/basic_socket.rbs +3 -3
  305. data/stdlib/socket/0/ip_socket.rbs +10 -8
  306. data/stdlib/socket/0/socket.rbs +23 -10
  307. data/stdlib/socket/0/tcp_server.rbs +1 -1
  308. data/stdlib/socket/0/tcp_socket.rbs +11 -3
  309. data/stdlib/socket/0/udp_socket.rbs +1 -1
  310. data/stdlib/socket/0/unix_server.rbs +1 -1
  311. data/stdlib/stringio/0/stringio.rbs +1209 -95
  312. data/stdlib/strscan/0/string_scanner.rbs +101 -80
  313. data/stdlib/tempfile/0/manifest.yaml +3 -0
  314. data/stdlib/tempfile/0/tempfile.rbs +25 -21
  315. data/stdlib/time/0/time.rbs +8 -6
  316. data/stdlib/timeout/0/timeout.rbs +58 -7
  317. data/stdlib/tsort/0/cyclic.rbs +4 -1
  318. data/stdlib/tsort/0/interfaces.rbs +8 -8
  319. data/stdlib/tsort/0/tsort.rbs +16 -15
  320. data/stdlib/uri/0/common.rbs +42 -20
  321. data/stdlib/uri/0/file.rbs +3 -3
  322. data/stdlib/uri/0/generic.rbs +21 -18
  323. data/stdlib/uri/0/http.rbs +2 -2
  324. data/stdlib/uri/0/ldap.rbs +2 -2
  325. data/stdlib/uri/0/mailto.rbs +3 -3
  326. data/stdlib/uri/0/rfc2396_parser.rbs +12 -12
  327. data/stdlib/zlib/0/deflate.rbs +4 -3
  328. data/stdlib/zlib/0/gzip_reader.rbs +8 -8
  329. data/stdlib/zlib/0/gzip_writer.rbs +14 -12
  330. data/stdlib/zlib/0/inflate.rbs +1 -1
  331. data/stdlib/zlib/0/need_dict.rbs +1 -1
  332. data/wasm/README.md +60 -0
  333. data/wasm/rbs_wasm.c +423 -0
  334. metadata +131 -19
  335. data/ext/rbs_extension/lexer.c +0 -2728
  336. data/ext/rbs_extension/lexer.h +0 -179
  337. data/ext/rbs_extension/lexer.re +0 -147
  338. data/ext/rbs_extension/lexstate.c +0 -175
  339. data/ext/rbs_extension/location.c +0 -325
  340. data/ext/rbs_extension/location.h +0 -85
  341. data/ext/rbs_extension/parser.c +0 -2982
  342. data/ext/rbs_extension/parser.h +0 -18
  343. data/ext/rbs_extension/parserstate.c +0 -411
  344. data/ext/rbs_extension/parserstate.h +0 -163
  345. data/ext/rbs_extension/unescape.c +0 -32
  346. data/include/rbs/ruby_objs.h +0 -72
  347. data/src/constants.c +0 -153
  348. data/src/ruby_objs.c +0 -799
@@ -0,0 +1,247 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RBS
4
+ module AST
5
+ module Ruby
6
+ class CommentBlock
7
+ attr_reader :name, :offsets, :comment_buffer
8
+
9
+ def initialize(source_buffer, comments)
10
+ @name = source_buffer.name
11
+
12
+ @offsets = []
13
+
14
+ # Assume the comment starts with a prefix whitespace
15
+ prefix_str = "# "
16
+
17
+ ranges = [] #: Array[Range[Integer]]
18
+ byte_ranges = [] #: Array[Range[Integer]]
19
+
20
+ comments.each do |comment|
21
+ tuple = [comment, 2] #: [Prism::Comment, Integer]
22
+
23
+ unless comment.location.slice.start_with?(prefix_str)
24
+ tuple[1] = 1
25
+ end
26
+
27
+ offsets << tuple
28
+
29
+ start_char = source_buffer.character_offset(comment.location.start_offset) + tuple[1]
30
+ end_char = source_buffer.character_offset(comment.location.end_offset)
31
+ ranges << (start_char ... end_char)
32
+ byte_ranges << ((comment.location.start_offset + tuple[1]) ... comment.location.end_offset)
33
+ end
34
+
35
+ @comment_buffer = source_buffer.sub_buffer(lines: ranges, byte_lines_hint: byte_ranges)
36
+ end
37
+
38
+ def leading?
39
+ comment = offsets[0][0] or raise
40
+ comment.location.start_line_slice.index(/\S/) ? false : true
41
+ end
42
+
43
+ def trailing?
44
+ comment = offsets[0][0] or raise
45
+ comment.location.start_line_slice.index(/\S/) ? true : false
46
+ end
47
+
48
+ def start_line
49
+ comments[0].location.start_line
50
+ end
51
+
52
+ def end_line
53
+ comments[-1].location.end_line
54
+ end
55
+
56
+ def line_starts
57
+ offsets.map do |comment, prefix_size|
58
+ comment_buffer.character_offset(comment.location.start_offset) + prefix_size
59
+ end
60
+ end
61
+
62
+ def self.build(buffer, comments)
63
+ blocks = [] #: Array[CommentBlock]
64
+
65
+ comments = comments.filter {|comment| comment.is_a?(Prism::InlineComment) }
66
+
67
+ until comments.empty?
68
+ block_comments = [] #: Array[Prism::Comment]
69
+
70
+ until comments.empty?
71
+ comment = comments.first or raise
72
+ last_comment = block_comments.last
73
+
74
+ if last_comment
75
+ if last_comment.location.end_line + 1 == comment.location.start_line
76
+ if last_comment.location.start_column == comment.location.start_column
77
+ unless comment.location.start_line_slice.index(/\S/)
78
+ block_comments << comments.shift
79
+ next
80
+ end
81
+ end
82
+ end
83
+
84
+ break
85
+ else
86
+ block_comments << comments.shift
87
+ end
88
+ end
89
+
90
+ unless block_comments.empty?
91
+ blocks << CommentBlock.new(buffer, block_comments.dup)
92
+ end
93
+ end
94
+
95
+ blocks
96
+ end
97
+
98
+ AnnotationSyntaxError = _ = Struct.new(:location, :error)
99
+
100
+ def each_paragraph(variables, &block)
101
+ if block
102
+ if leading_annotation?(0)
103
+ yield_annotation(0, 0, 0, variables, &block)
104
+ else
105
+ yield_paragraph(0, 0, variables, &block)
106
+ end
107
+ else
108
+ enum_for :each_paragraph, variables
109
+ end
110
+ end
111
+
112
+ def yield_paragraph(start_line, current_line, variables, &block)
113
+ # We already know at start_line..current_line are paragraph.
114
+
115
+ while true
116
+ next_line = current_line + 1
117
+
118
+ if next_line >= comment_buffer.line_count
119
+ yield line_location(start_line, current_line)
120
+ return
121
+ end
122
+
123
+ if leading_annotation?(next_line)
124
+ yield line_location(start_line, current_line)
125
+ return yield_annotation(next_line, next_line, next_line, variables, &block)
126
+ else
127
+ current_line = next_line
128
+ end
129
+ end
130
+ end
131
+
132
+ def yield_annotation(start_line, end_line, current_line, variables, &block)
133
+ # We already know at start_line..end_line are annotation.
134
+ while true
135
+ next_line = current_line + 1
136
+
137
+ if next_line >= comment_buffer.line_count
138
+ annotation = parse_annotation_lines(start_line, end_line, variables)
139
+ yield annotation
140
+
141
+ if end_line > current_line
142
+ yield_paragraph(end_line + 1, end_line + 1, variables, &block)
143
+ end
144
+
145
+ return
146
+ end
147
+
148
+ line_text = text(next_line)
149
+ if leading_spaces = line_text.index(/\S/)
150
+ if leading_spaces == 0
151
+ # End of annotation
152
+ yield parse_annotation_lines(start_line, end_line, variables)
153
+
154
+ if leading_annotation?(end_line + 1)
155
+ yield_annotation(end_line + 1, end_line + 1, end_line + 1, variables, &block)
156
+ else
157
+ yield_paragraph(end_line + 1, end_line + 1, variables, &block)
158
+ end
159
+
160
+ return
161
+ else
162
+ current_line = next_line
163
+ end_line = next_line
164
+ end
165
+ else
166
+ current_line = next_line
167
+ end
168
+ end
169
+ end
170
+
171
+ def text(comment_index)
172
+ range = comment_buffer.ranges[comment_index]
173
+ comment_buffer.content[range] or raise
174
+ end
175
+
176
+ def line_location(start_line, end_line)
177
+ start_offset = comment_buffer.ranges[start_line].begin
178
+ end_offset = comment_buffer.ranges[end_line].end
179
+ Location.new(comment_buffer, start_offset, end_offset)
180
+ end
181
+
182
+ def location()
183
+ first_comment = comments[0] or raise
184
+ last_comment = comments[-1] or raise
185
+
186
+ comment_buffer.rbs_location(first_comment.location.join last_comment.location)
187
+ end
188
+
189
+ def parse_annotation_lines(start_line, end_line, variables)
190
+ start_pos = comment_buffer.ranges[start_line].begin
191
+ end_pos = comment_buffer.ranges[end_line].end
192
+ begin
193
+ Parser.parse_inline_leading_annotation(comment_buffer, start_pos...end_pos, variables: variables)
194
+ rescue ParsingError => error
195
+ AnnotationSyntaxError.new(line_location(start_line, end_line), error)
196
+ end
197
+ end
198
+
199
+ def trailing_annotation(variables)
200
+ if trailing?
201
+ comment = comments[0] or raise
202
+ if comment.location.slice.start_with?(/#[:\[]/)
203
+ begin
204
+ Parser.parse_inline_trailing_annotation(comment_buffer, 0...comment_buffer.last_position, variables: variables)
205
+ rescue ParsingError => error
206
+ location = line_location(0, offsets.size - 1)
207
+ AnnotationSyntaxError.new(location, error)
208
+ end
209
+ end
210
+ end
211
+ end
212
+
213
+ def comments
214
+ offsets.map { _1[0]}
215
+ end
216
+
217
+ def leading_annotation?(index)
218
+ if index < comment_buffer.line_count
219
+ text(index).start_with?(/@rbs\b/) and return true
220
+
221
+ comment = offsets[index][0]
222
+ comment.location.slice.start_with?(/\#:/) and return true
223
+ end
224
+
225
+ false
226
+ end
227
+
228
+ def as_comment
229
+ lines = [] #: Array[String]
230
+
231
+ each_paragraph([]) do |paragraph|
232
+ case paragraph
233
+ when Location
234
+ lines << paragraph.local_source
235
+ end
236
+ end
237
+
238
+ string = lines.join("\n")
239
+
240
+ unless string.strip.empty?
241
+ AST::Comment.new(string: string, location: location)
242
+ end
243
+ end
244
+ end
245
+ end
246
+ end
247
+ end
@@ -0,0 +1,291 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RBS
4
+ module AST
5
+ module Ruby
6
+ module Declarations
7
+ class Base
8
+ attr_reader :buffer
9
+
10
+ include Helpers::ConstantHelper
11
+ include Helpers::LocationHelper
12
+
13
+ def initialize(buffer)
14
+ @buffer = buffer
15
+ end
16
+ end
17
+
18
+ class ClassDecl < Base
19
+ class SuperClass
20
+ attr_reader :type_name_location
21
+
22
+ attr_reader :operator_location
23
+
24
+ attr_reader :type_name
25
+
26
+ attr_reader :type_annotation
27
+
28
+ def initialize(type_name_location, operator_location, type_name, type_annotation)
29
+ @type_name_location = type_name_location
30
+ @operator_location = operator_location
31
+ @type_name = type_name
32
+ @type_annotation = type_annotation
33
+ end
34
+
35
+ def type_args
36
+ if type_annotation
37
+ type_annotation.type_args
38
+ else
39
+ []
40
+ end
41
+ end
42
+
43
+ def location
44
+ if type_annotation
45
+ Location.new(
46
+ type_name_location.buffer,
47
+ type_name_location.start_pos,
48
+ type_annotation.location.end_pos
49
+ )
50
+ else
51
+ type_name_location
52
+ end
53
+ end
54
+
55
+ alias name type_name
56
+ alias args type_args
57
+
58
+ def type_fingerprint
59
+ [
60
+ type_name.to_s,
61
+ type_annotation&.type_fingerprint
62
+ ]
63
+ end
64
+ end
65
+
66
+ attr_reader :class_name
67
+
68
+ attr_reader :members
69
+
70
+ attr_reader :node
71
+
72
+ attr_reader :super_class
73
+
74
+ def initialize(buffer, name, node, super_class)
75
+ super(buffer)
76
+ @class_name = name
77
+ @node = node
78
+ @members = []
79
+ @super_class = super_class
80
+ end
81
+
82
+ def each_decl(&block)
83
+ return enum_for(:each_decl) unless block
84
+
85
+ @members.each do |member|
86
+ if member.is_a?(Base)
87
+ yield member
88
+ end
89
+ end
90
+ end
91
+
92
+ def type_params = []
93
+
94
+ def location
95
+ rbs_location(node.location)
96
+ end
97
+
98
+ def name_location
99
+ rbs_location(node.constant_path.location)
100
+ end
101
+
102
+ def type_fingerprint
103
+ result = [] #: Array[untyped]
104
+
105
+ result << "decls/class"
106
+ result << class_name.to_s
107
+ result << super_class&.type_fingerprint
108
+ result << members.map { _1.type_fingerprint }
109
+
110
+ result
111
+ end
112
+ end
113
+
114
+ class ModuleDecl < Base
115
+ attr_reader :module_name
116
+
117
+ attr_reader :members
118
+
119
+ attr_reader :node
120
+
121
+ def initialize(buffer, name, node)
122
+ super(buffer)
123
+ @module_name = name
124
+ @node = node
125
+ @members = []
126
+ end
127
+
128
+ def each_decl(&block)
129
+ return enum_for(:each_decl) unless block
130
+
131
+ @members.each do |member|
132
+ if member.is_a?(Base)
133
+ yield member
134
+ end
135
+ end
136
+ end
137
+
138
+ def type_params = []
139
+
140
+ def self_types
141
+ members.filter_map do |member|
142
+ if member.is_a?(Members::ModuleSelfMember)
143
+ AST::Declarations::Module::Self.new(
144
+ name: member.name,
145
+ args: member.args,
146
+ location: member.location
147
+ )
148
+ end
149
+ end
150
+ end
151
+
152
+ def location
153
+ rbs_location(node.location)
154
+ end
155
+
156
+ def name_location
157
+ rbs_location(node.constant_path.location)
158
+ end
159
+
160
+ def type_fingerprint
161
+ result = [] #: Array[untyped]
162
+
163
+ result << "decls/module"
164
+ result << module_name.to_s
165
+ result << members.map { _1.type_fingerprint}
166
+
167
+ result
168
+ end
169
+ end
170
+
171
+ class ConstantDecl < Base
172
+ attr_reader :leading_comment
173
+ attr_reader :constant_name
174
+ attr_reader :node
175
+ attr_reader :type_annotation
176
+
177
+ def initialize(buffer, constant_name, node, leading_comment, type_annotation)
178
+ super(buffer)
179
+ @constant_name = constant_name
180
+ @node = node
181
+ @leading_comment = leading_comment
182
+ @type_annotation = type_annotation
183
+ end
184
+
185
+ def location
186
+ rbs_location(node.location)
187
+ end
188
+
189
+ def name_location
190
+ case node
191
+ when Prism::ConstantWriteNode
192
+ rbs_location(node.name_loc)
193
+ when Prism::ConstantPathWriteNode
194
+ rbs_location(node.target.location)
195
+ end
196
+ end
197
+
198
+ def type
199
+ return type_annotation.type if type_annotation
200
+
201
+ case node.value
202
+ when Prism::IntegerNode
203
+ BuiltinNames::Integer.instance_type
204
+ when Prism::FloatNode
205
+ BuiltinNames::Float.instance_type
206
+ when Prism::StringNode
207
+ BuiltinNames::String.instance_type
208
+ when Prism::TrueNode, Prism::FalseNode
209
+ Types::Bases::Bool.new(location: nil)
210
+ when Prism::SymbolNode
211
+ BuiltinNames::Symbol.instance_type
212
+ when Prism::NilNode
213
+ Types::Bases::Nil.new(location: nil)
214
+ else
215
+ Types::Bases::Any.new(location: nil)
216
+ end
217
+ end
218
+
219
+ def comment
220
+ leading_comment&.as_comment
221
+ end
222
+
223
+ def type_fingerprint
224
+ [
225
+ "decls/constant",
226
+ constant_name.to_s,
227
+ type.to_s,
228
+ leading_comment&.as_comment&.string
229
+ ]
230
+ end
231
+ end
232
+
233
+ class ClassModuleAliasDecl < Base
234
+ attr_reader :node
235
+ attr_reader :leading_comment
236
+ attr_reader :new_name
237
+ attr_reader :infered_old_name
238
+ attr_reader :annotation
239
+
240
+ def initialize(buffer, node, new_name, infered_old_name, leading_comment, annotation)
241
+ super(buffer)
242
+ @node = node
243
+ @new_name = new_name
244
+ @infered_old_name = infered_old_name
245
+ @leading_comment = leading_comment
246
+ @annotation = annotation
247
+ end
248
+
249
+ def location
250
+ rbs_location(node.location)
251
+ end
252
+
253
+ def name_location
254
+ case node
255
+ when Prism::ConstantWriteNode
256
+ rbs_location(node.name_loc)
257
+ when Prism::ConstantPathWriteNode
258
+ rbs_location(node.target.location)
259
+ end
260
+ end
261
+
262
+ def old_name
263
+ # Return explicit type name from annotation if provided, otherwise use inferred name
264
+ case
265
+ when annotation.type_name
266
+ annotation.type_name
267
+ when infered_old_name
268
+ infered_old_name
269
+ else
270
+ raise "No old name available"
271
+ end
272
+ end
273
+
274
+ def comment
275
+ leading_comment&.as_comment
276
+ end
277
+
278
+ def type_fingerprint
279
+ [
280
+ "decls/class_module_alias",
281
+ annotation.type_fingerprint,
282
+ new_name.to_s,
283
+ old_name.to_s,
284
+ leading_comment&.as_comment&.string
285
+ ]
286
+ end
287
+ end
288
+ end
289
+ end
290
+ end
291
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RBS
4
+ module AST
5
+ module Ruby
6
+ module Helpers
7
+ module ConstantHelper
8
+ module_function
9
+
10
+ def constant_as_type_name(node)
11
+ case node
12
+ when Prism::ConstantPathNode, Prism::ConstantReadNode
13
+ begin
14
+ TypeName.parse(node.full_name)
15
+ rescue Prism::ConstantPathNode::DynamicPartsInConstantPathError
16
+ nil
17
+ end
18
+ when Prism::ConstantWriteNode
19
+ TypeName.new(name: node.name, namespace: Namespace.empty)
20
+ when Prism::ConstantPathWriteNode
21
+ constant_as_type_name(node.target)
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RBS
4
+ module AST
5
+ module Ruby
6
+ module Helpers
7
+ module LocationHelper
8
+ def rbs_location(location)
9
+ Location.new(buffer, buffer.character_offset(location.start_offset), buffer.character_offset(location.end_offset))
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end