rbs 3.9.5 → 4.0.0

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