rbs 3.9.4 → 4.2.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 (354) 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/.gitattributes +1 -0
  6. data/.github/dependabot.yml +16 -14
  7. data/.github/workflows/bundle-update.yml +63 -0
  8. data/.github/workflows/c-check.yml +66 -0
  9. data/.github/workflows/changelog.yml +121 -0
  10. data/.github/workflows/comments.yml +6 -4
  11. data/.github/workflows/dependabot.yml +2 -2
  12. data/.github/workflows/jruby.yml +74 -0
  13. data/.github/workflows/release-gems.yml +234 -0
  14. data/.github/workflows/ruby.yml +86 -32
  15. data/.github/workflows/rust.yml +186 -0
  16. data/.github/workflows/truffleruby.yml +54 -0
  17. data/.github/workflows/typecheck.yml +6 -3
  18. data/.github/workflows/wasm.yml +55 -0
  19. data/.github/workflows/windows.yml +10 -4
  20. data/.gitignore +16 -0
  21. data/.rubocop.yml +1 -2
  22. data/CHANGELOG.md +502 -0
  23. data/Dockerfile.jruby +53 -0
  24. data/README.md +42 -5
  25. data/Rakefile +892 -111
  26. data/Steepfile +11 -0
  27. data/config.yml +665 -62
  28. data/core/array.rbs +541 -398
  29. data/core/basic_object.rbs +9 -8
  30. data/core/binding.rbs +0 -2
  31. data/core/builtin.rbs +9 -8
  32. data/core/class.rbs +11 -8
  33. data/core/comparable.rbs +55 -34
  34. data/core/complex.rbs +104 -78
  35. data/core/dir.rbs +61 -49
  36. data/core/encoding.rbs +12 -15
  37. data/core/enumerable.rbs +297 -196
  38. data/core/enumerator/arithmetic_sequence.rbs +70 -0
  39. data/core/enumerator/product.rbs +5 -5
  40. data/core/enumerator.rbs +91 -28
  41. data/core/errno.rbs +11 -2
  42. data/core/errors.rbs +58 -29
  43. data/core/exception.rbs +13 -13
  44. data/core/fiber.rbs +74 -54
  45. data/core/file.rbs +260 -1151
  46. data/core/file_constants.rbs +463 -0
  47. data/core/file_stat.rbs +534 -0
  48. data/core/file_test.rbs +3 -3
  49. data/core/float.rbs +257 -116
  50. data/core/gc.rbs +425 -281
  51. data/core/hash.rbs +1151 -829
  52. data/core/integer.rbs +156 -195
  53. data/core/io/buffer.rbs +53 -42
  54. data/core/io/wait.rbs +13 -35
  55. data/core/io.rbs +222 -155
  56. data/core/kernel.rbs +239 -163
  57. data/core/marshal.rbs +4 -4
  58. data/core/match_data.rbs +16 -14
  59. data/core/math.rbs +107 -66
  60. data/core/method.rbs +69 -33
  61. data/core/module.rbs +302 -150
  62. data/core/nil_class.rbs +7 -6
  63. data/core/numeric.rbs +77 -63
  64. data/core/object.rbs +9 -11
  65. data/core/object_space/weak_key_map.rbs +7 -7
  66. data/core/object_space.rbs +30 -23
  67. data/core/pathname.rbs +1312 -0
  68. data/core/proc.rbs +95 -58
  69. data/core/process.rbs +222 -202
  70. data/core/ractor.rbs +364 -518
  71. data/core/random.rbs +21 -3
  72. data/core/range.rbs +181 -79
  73. data/core/rational.rbs +60 -89
  74. data/core/rbs/ops.rbs +154 -0
  75. data/core/rbs/unnamed/argf.rbs +63 -56
  76. data/core/rbs/unnamed/env_class.rbs +19 -14
  77. data/core/rbs/unnamed/main_class.rbs +123 -0
  78. data/core/rbs/unnamed/random.rbs +11 -118
  79. data/core/regexp.rbs +258 -214
  80. data/core/ruby.rbs +53 -0
  81. data/core/ruby_vm.rbs +78 -34
  82. data/core/rubygems/config_file.rbs +5 -5
  83. data/core/rubygems/errors.rbs +6 -70
  84. data/core/rubygems/requirement.rbs +5 -15
  85. data/core/rubygems/rubygems.rbs +18 -81
  86. data/core/rubygems/specification.rbs +8 -0
  87. data/core/rubygems/version.rbs +2 -163
  88. data/core/set.rbs +493 -363
  89. data/core/signal.rbs +26 -16
  90. data/core/string.rbs +3234 -1285
  91. data/core/struct.rbs +43 -42
  92. data/core/symbol.rbs +41 -34
  93. data/core/thread.rbs +139 -83
  94. data/core/time.rbs +81 -50
  95. data/core/trace_point.rbs +41 -35
  96. data/core/true_class.rbs +2 -2
  97. data/core/unbound_method.rbs +24 -16
  98. data/core/warning.rbs +7 -7
  99. data/docs/CONTRIBUTING.md +3 -2
  100. data/docs/aliases.md +79 -0
  101. data/docs/collection.md +3 -3
  102. data/docs/config.md +171 -0
  103. data/docs/encoding.md +56 -0
  104. data/docs/gem.md +0 -1
  105. data/docs/inline.md +634 -0
  106. data/docs/rbs_by_example.md +20 -20
  107. data/docs/release.md +303 -0
  108. data/docs/rust.md +96 -0
  109. data/docs/sigs.md +3 -3
  110. data/docs/stdlib.md +8 -0
  111. data/docs/syntax.md +60 -18
  112. data/docs/type_fingerprint.md +21 -0
  113. data/docs/wasm_serialization.md +80 -0
  114. data/exe/rbs +1 -1
  115. data/ext/rbs_extension/ast_translation.c +1870 -0
  116. data/ext/rbs_extension/ast_translation.h +41 -0
  117. data/ext/rbs_extension/class_constants.c +189 -0
  118. data/{include/rbs/constants.h → ext/rbs_extension/class_constants.h} +24 -1
  119. data/ext/rbs_extension/compat.h +10 -0
  120. data/ext/rbs_extension/extconf.rb +26 -1
  121. data/ext/rbs_extension/legacy_location.c +299 -0
  122. data/ext/rbs_extension/legacy_location.h +82 -0
  123. data/ext/rbs_extension/main.c +639 -23
  124. data/ext/rbs_extension/rbs_extension.h +6 -21
  125. data/ext/rbs_extension/rbs_string_bridging.c +9 -0
  126. data/ext/rbs_extension/rbs_string_bridging.h +24 -0
  127. data/include/rbs/ast.h +1055 -0
  128. data/include/rbs/defines.h +104 -0
  129. data/include/rbs/lexer.h +208 -0
  130. data/include/rbs/location.h +40 -0
  131. data/include/rbs/parser.h +187 -0
  132. data/include/rbs/serialize.h +39 -0
  133. data/include/rbs/string.h +47 -0
  134. data/include/rbs/util/rbs_allocator.h +59 -0
  135. data/include/rbs/util/rbs_assert.h +20 -0
  136. data/include/rbs/util/rbs_buffer.h +83 -0
  137. data/include/rbs/util/rbs_constant_pool.h +6 -70
  138. data/include/rbs/util/rbs_encoding.h +282 -0
  139. data/include/rbs/util/rbs_unescape.h +24 -0
  140. data/include/rbs.h +9 -2
  141. data/lib/rbs/annotate/formatter.rb +3 -13
  142. data/lib/rbs/annotate/rdoc_annotator.rb +30 -32
  143. data/lib/rbs/annotate/rdoc_source.rb +1 -1
  144. data/lib/rbs/ast/annotation.rb +1 -1
  145. data/lib/rbs/ast/comment.rb +1 -1
  146. data/lib/rbs/ast/declarations.rb +11 -11
  147. data/lib/rbs/ast/members.rb +14 -14
  148. data/lib/rbs/ast/ruby/annotations.rb +451 -0
  149. data/lib/rbs/ast/ruby/comment_block.rb +247 -0
  150. data/lib/rbs/ast/ruby/declarations.rb +291 -0
  151. data/lib/rbs/ast/ruby/helpers/constant_helper.rb +28 -0
  152. data/lib/rbs/ast/ruby/helpers/location_helper.rb +15 -0
  153. data/lib/rbs/ast/ruby/members.rb +762 -0
  154. data/lib/rbs/ast/type_param.rb +25 -5
  155. data/lib/rbs/buffer.rb +142 -20
  156. data/lib/rbs/cli/diff.rb +16 -15
  157. data/lib/rbs/cli/validate.rb +63 -126
  158. data/lib/rbs/cli.rb +59 -29
  159. data/lib/rbs/collection/config/lockfile_generator.rb +28 -3
  160. data/lib/rbs/collection/sources/git.rb +7 -0
  161. data/lib/rbs/definition.rb +6 -1
  162. data/lib/rbs/definition_builder/ancestor_builder.rb +129 -70
  163. data/lib/rbs/definition_builder/method_builder.rb +74 -33
  164. data/lib/rbs/definition_builder.rb +181 -21
  165. data/lib/rbs/diff.rb +7 -1
  166. data/lib/rbs/environment/class_entry.rb +81 -0
  167. data/lib/rbs/environment/module_entry.rb +91 -0
  168. data/lib/rbs/environment.rb +410 -215
  169. data/lib/rbs/environment_loader.rb +2 -8
  170. data/lib/rbs/errors.rb +31 -21
  171. data/lib/rbs/inline_parser/comment_association.rb +117 -0
  172. data/lib/rbs/inline_parser.rb +568 -0
  173. data/lib/rbs/location_aux.rb +36 -4
  174. data/lib/rbs/locator.rb +5 -1
  175. data/lib/rbs/method_type.rb +5 -3
  176. data/lib/rbs/namespace.rb +47 -18
  177. data/lib/rbs/parser_aux.rb +37 -7
  178. data/lib/rbs/prototype/helpers.rb +24 -0
  179. data/lib/rbs/prototype/rb.rb +3 -28
  180. data/lib/rbs/prototype/rbi.rb +196 -45
  181. data/lib/rbs/prototype/runtime/value_object_generator.rb +0 -1
  182. data/lib/rbs/prototype/runtime.rb +13 -3
  183. data/lib/rbs/resolver/constant_resolver.rb +2 -2
  184. data/lib/rbs/resolver/type_name_resolver.rb +120 -44
  185. data/lib/rbs/rewriter.rb +70 -0
  186. data/lib/rbs/source.rb +99 -0
  187. data/lib/rbs/subtractor.rb +7 -4
  188. data/lib/rbs/test/type_check.rb +25 -3
  189. data/lib/rbs/type_name.rb +34 -21
  190. data/lib/rbs/types.rb +135 -81
  191. data/lib/rbs/unit_test/convertibles.rb +1 -0
  192. data/lib/rbs/unit_test/type_assertions.rb +47 -11
  193. data/lib/rbs/validator.rb +2 -2
  194. data/lib/rbs/version.rb +1 -1
  195. data/lib/rbs/wasm/deserializer.rb +213 -0
  196. data/lib/rbs/wasm/location.rb +61 -0
  197. data/lib/rbs/wasm/parser.rb +174 -0
  198. data/lib/rbs/wasm/runtime.rb +211 -0
  199. data/lib/rbs/wasm/serialization_schema.rb +111 -0
  200. data/lib/rbs.rb +25 -2
  201. data/lib/rbs_jars.rb +39 -0
  202. data/lib/rdoc/discover.rb +1 -1
  203. data/lib/rdoc_plugin/parser.rb +8 -3
  204. data/rbs.gemspec +34 -6
  205. data/schema/function.json +12 -1
  206. data/schema/typeParam.json +17 -1
  207. data/sig/ancestor_builder.rbs +1 -1
  208. data/sig/annotate/formatter.rbs +2 -2
  209. data/sig/annotate/rdoc_annotater.rbs +13 -10
  210. data/sig/ast/ruby/annotations.rbs +470 -0
  211. data/sig/ast/ruby/comment_block.rbs +127 -0
  212. data/sig/ast/ruby/declarations.rbs +158 -0
  213. data/sig/ast/ruby/helpers/constant_helper.rbs +11 -0
  214. data/sig/ast/ruby/helpers/location_helper.rbs +15 -0
  215. data/sig/ast/ruby/members.rbs +198 -0
  216. data/sig/buffer.rbs +81 -5
  217. data/sig/cli/diff.rbs +5 -11
  218. data/sig/cli/validate.rbs +12 -8
  219. data/sig/cli.rbs +18 -18
  220. data/sig/collection/config/lockfile_generator.rbs +2 -0
  221. data/sig/definition.rbs +6 -0
  222. data/sig/definition_builder.rbs +3 -1
  223. data/sig/environment/class_entry.rbs +56 -0
  224. data/sig/environment/module_entry.rbs +65 -0
  225. data/sig/environment.rbs +94 -87
  226. data/sig/errors.rbs +26 -20
  227. data/sig/inline_parser/comment_association.rbs +71 -0
  228. data/sig/inline_parser.rbs +126 -0
  229. data/sig/location.rbs +32 -7
  230. data/sig/locator.rbs +0 -2
  231. data/sig/manifest.yaml +0 -2
  232. data/sig/method_builder.rbs +9 -4
  233. data/sig/namespace.rbs +20 -5
  234. data/sig/parser.rbs +79 -15
  235. data/sig/prototype/helpers.rbs +2 -0
  236. data/sig/prototype/rbi.rbs +33 -4
  237. data/sig/resolver/type_name_resolver.rbs +36 -10
  238. data/sig/rewriter.rbs +45 -0
  239. data/sig/source.rbs +48 -0
  240. data/sig/type_param.rbs +13 -8
  241. data/sig/typename.rbs +15 -5
  242. data/sig/types.rbs +21 -9
  243. data/sig/unit_test/spy.rbs +0 -8
  244. data/sig/unit_test/type_assertions.rbs +17 -2
  245. data/sig/wasm/deserializer.rbs +66 -0
  246. data/sig/wasm/serialization_schema.rbs +13 -0
  247. data/src/ast.c +1644 -0
  248. data/src/lexer.c +3223 -0
  249. data/src/lexer.re +187 -0
  250. data/src/lexstate.c +222 -0
  251. data/src/location.c +31 -0
  252. data/src/parser.c +4318 -0
  253. data/src/serialize.c +965 -0
  254. data/src/string.c +41 -0
  255. data/src/util/rbs_allocator.c +171 -0
  256. data/src/util/rbs_assert.c +19 -0
  257. data/src/util/rbs_buffer.c +54 -0
  258. data/src/util/rbs_constant_pool.c +18 -92
  259. data/src/util/rbs_encoding.c +21454 -0
  260. data/src/util/rbs_unescape.c +167 -0
  261. data/stdlib/abbrev/0/array.rbs +1 -1
  262. data/stdlib/bigdecimal/0/big_decimal.rbs +116 -98
  263. data/stdlib/bigdecimal-math/0/big_math.rbs +169 -8
  264. data/stdlib/cgi/0/core.rbs +9 -393
  265. data/stdlib/cgi/0/manifest.yaml +1 -0
  266. data/stdlib/cgi-escape/0/escape.rbs +171 -0
  267. data/stdlib/coverage/0/coverage.rbs +7 -4
  268. data/stdlib/csv/0/csv.rbs +5 -5
  269. data/stdlib/date/0/date.rbs +92 -79
  270. data/stdlib/date/0/date_time.rbs +25 -24
  271. data/stdlib/delegate/0/delegator.rbs +11 -7
  272. data/stdlib/did_you_mean/0/did_you_mean.rbs +17 -16
  273. data/stdlib/digest/0/digest.rbs +117 -1
  274. data/stdlib/erb/0/erb.rbs +754 -353
  275. data/stdlib/etc/0/etc.rbs +73 -54
  276. data/stdlib/fileutils/0/fileutils.rbs +179 -160
  277. data/stdlib/forwardable/0/forwardable.rbs +13 -10
  278. data/stdlib/io-console/0/io-console.rbs +2 -2
  279. data/stdlib/ipaddr/0/ipaddr.rbs +0 -5
  280. data/stdlib/json/0/json.rbs +232 -185
  281. data/stdlib/monitor/0/monitor.rbs +9 -9
  282. data/stdlib/net-http/0/net-http.rbs +162 -134
  283. data/stdlib/objspace/0/objspace.rbs +17 -34
  284. data/stdlib/open-uri/0/open-uri.rbs +48 -8
  285. data/stdlib/open3/0/open3.rbs +469 -10
  286. data/stdlib/openssl/0/openssl.rbs +521 -397
  287. data/stdlib/optparse/0/optparse.rbs +26 -17
  288. data/stdlib/pathname/0/pathname.rbs +11 -1381
  289. data/stdlib/pp/0/pp.rbs +9 -8
  290. data/stdlib/prettyprint/0/prettyprint.rbs +7 -7
  291. data/stdlib/pstore/0/pstore.rbs +35 -30
  292. data/stdlib/psych/0/psych.rbs +65 -12
  293. data/stdlib/psych/0/store.rbs +2 -4
  294. data/stdlib/pty/0/pty.rbs +9 -6
  295. data/stdlib/random-formatter/0/random-formatter.rbs +277 -0
  296. data/stdlib/rdoc/0/code_object.rbs +4 -3
  297. data/stdlib/rdoc/0/comment.rbs +2 -0
  298. data/stdlib/rdoc/0/options.rbs +76 -0
  299. data/stdlib/rdoc/0/parser.rbs +1 -1
  300. data/stdlib/rdoc/0/rdoc.rbs +7 -5
  301. data/stdlib/rdoc/0/store.rbs +2 -2
  302. data/stdlib/resolv/0/resolv.rbs +26 -69
  303. data/stdlib/ripper/0/ripper.rbs +25 -19
  304. data/stdlib/securerandom/0/manifest.yaml +2 -0
  305. data/stdlib/securerandom/0/securerandom.rbs +7 -20
  306. data/stdlib/shellwords/0/shellwords.rbs +3 -3
  307. data/stdlib/singleton/0/singleton.rbs +6 -0
  308. data/stdlib/socket/0/addrinfo.rbs +9 -9
  309. data/stdlib/socket/0/basic_socket.rbs +3 -3
  310. data/stdlib/socket/0/ip_socket.rbs +10 -8
  311. data/stdlib/socket/0/socket.rbs +23 -10
  312. data/stdlib/socket/0/tcp_server.rbs +1 -1
  313. data/stdlib/socket/0/tcp_socket.rbs +11 -3
  314. data/stdlib/socket/0/udp_socket.rbs +1 -1
  315. data/stdlib/socket/0/unix_server.rbs +1 -1
  316. data/stdlib/stringio/0/stringio.rbs +1211 -96
  317. data/stdlib/strscan/0/string_scanner.rbs +101 -80
  318. data/stdlib/tempfile/0/manifest.yaml +3 -0
  319. data/stdlib/tempfile/0/tempfile.rbs +25 -21
  320. data/stdlib/time/0/time.rbs +8 -6
  321. data/stdlib/timeout/0/timeout.rbs +58 -7
  322. data/stdlib/tsort/0/cyclic.rbs +4 -1
  323. data/stdlib/tsort/0/interfaces.rbs +8 -8
  324. data/stdlib/tsort/0/tsort.rbs +16 -15
  325. data/stdlib/uri/0/common.rbs +42 -20
  326. data/stdlib/uri/0/file.rbs +3 -3
  327. data/stdlib/uri/0/generic.rbs +21 -18
  328. data/stdlib/uri/0/http.rbs +2 -2
  329. data/stdlib/uri/0/ldap.rbs +2 -2
  330. data/stdlib/uri/0/mailto.rbs +3 -3
  331. data/stdlib/uri/0/rfc2396_parser.rbs +12 -12
  332. data/stdlib/zlib/0/deflate.rbs +4 -3
  333. data/stdlib/zlib/0/gzip_file.rbs +1 -1
  334. data/stdlib/zlib/0/gzip_reader.rbs +8 -8
  335. data/stdlib/zlib/0/gzip_writer.rbs +16 -13
  336. data/stdlib/zlib/0/inflate.rbs +1 -1
  337. data/stdlib/zlib/0/need_dict.rbs +1 -1
  338. data/wasm/README.md +109 -0
  339. data/wasm/rbs_wasm.c +479 -0
  340. metadata +133 -19
  341. data/ext/rbs_extension/lexer.c +0 -2728
  342. data/ext/rbs_extension/lexer.h +0 -179
  343. data/ext/rbs_extension/lexer.re +0 -147
  344. data/ext/rbs_extension/lexstate.c +0 -175
  345. data/ext/rbs_extension/location.c +0 -325
  346. data/ext/rbs_extension/location.h +0 -85
  347. data/ext/rbs_extension/parser.c +0 -2982
  348. data/ext/rbs_extension/parser.h +0 -18
  349. data/ext/rbs_extension/parserstate.c +0 -411
  350. data/ext/rbs_extension/parserstate.h +0 -163
  351. data/ext/rbs_extension/unescape.c +0 -32
  352. data/include/rbs/ruby_objs.h +0 -72
  353. data/src/constants.c +0 -153
  354. data/src/ruby_objs.c +0 -799
@@ -8,14 +8,30 @@ module RBS
8
8
  "mutex_m" => ">= 0.3.0",
9
9
  "abbrev" => nil,
10
10
  "base64" => nil,
11
+ "benchmark" => nil,
11
12
  "bigdecimal" => nil,
12
13
  "csv" => nil,
14
+ "kconv" => nil,
15
+ "logger" => nil,
13
16
  "minitest" => nil,
14
17
  "net-smtp" => nil,
15
18
  "nkf" => nil,
16
19
  "observer" => nil,
20
+ "cgi" => nil,
21
+ "pstore" => nil,
17
22
  }
18
23
 
24
+ NONGEM_STDLIBS = Set[
25
+ "cgi-escape",
26
+ "coverage",
27
+ "monitor",
28
+ "objspace",
29
+ "pathname",
30
+ "pty",
31
+ "ripper",
32
+ "socket",
33
+ ]
34
+
19
35
  class GemfileLockMismatchError < StandardError
20
36
  def initialize(expected:, actual:)
21
37
  @expected = expected
@@ -163,7 +179,9 @@ module RBS
163
179
  end
164
180
  end
165
181
  else
166
- RBS.logger.warn "Cannot find `#{name}` gem. Using incorrect Bundler context? (#{definition.lockfile})"
182
+ unless NONGEM_STDLIBS.include?(name)
183
+ RBS.logger.warn "Cannot find `#{name}` gem. Using incorrect Bundler context? (#{definition.lockfile})"
184
+ end
167
185
  end
168
186
  end
169
187
 
@@ -171,8 +189,8 @@ module RBS
171
189
  return if lockfile.gems.key?(name)
172
190
 
173
191
  case name
174
- when 'bigdecimal-math'
175
- # The `bigdecimal-math` is never released as a gem.
192
+ when 'bigdecimal-math', 'kconv'
193
+ # These gems are never released as a gem.
176
194
  # Therefore, `assign_gem` should not be called.
177
195
  RBS.logger.info {
178
196
  from = from_gem || "rbs_collection.yaml"
@@ -183,6 +201,13 @@ module RBS
183
201
  lockfile.gems[name] = { name: name, version: "0", source: source }
184
202
  end
185
203
  return
204
+ when 'set'
205
+ # set is migrated to core from stdlib.
206
+ RBS.logger.info {
207
+ from = from_gem || "rbs_collection.yaml"
208
+ "`#{name}` is a part of the Ruby core library. The dependency to the library can be safely deleted from #{from}."
209
+ }
210
+ return
186
211
  when *ALUMNI_STDLIBS.keys
187
212
  version = ALUMNI_STDLIBS.fetch(name)
188
213
  if from_gem
@@ -3,6 +3,7 @@
3
3
  require 'digest/sha2'
4
4
  require 'open3'
5
5
  require 'find'
6
+ require 'fileutils'
6
7
 
7
8
  module RBS
8
9
  module Collection
@@ -139,6 +140,12 @@ module RBS
139
140
  # git v2.27.0 or greater
140
141
  git 'clone', '--filter=blob:none', remote, git_dir.to_s, chdir: nil
141
142
  rescue CommandError
143
+ # The failed `--filter=blob:none` clone may leave behind a
144
+ # partial repository (e.g. when the server returned an error
145
+ # mid-clone), which would cause the fallback `git clone` to
146
+ # fail with "destination path ... already exists and is not
147
+ # an empty directory". Clean it up before retrying.
148
+ FileUtils.rm_rf(git_dir)
142
149
  git 'clone', remote, git_dir.to_s, chdir: nil
143
150
  end
144
151
  end
@@ -62,7 +62,12 @@ module RBS
62
62
  end
63
63
 
64
64
  def comment
65
- member.comment
65
+ case member
66
+ when AST::Members::Base
67
+ member.comment
68
+ when AST::Ruby::Members::Base
69
+ member.leading_comment&.as_comment
70
+ end
66
71
  end
67
72
 
68
73
  def update(type: self.type, member: self.member, defined_in: self.defined_in, implemented_in: self.implemented_in)
@@ -173,13 +173,19 @@ module RBS
173
173
  end
174
174
 
175
175
  def validate_super_class!(type_name, entry)
176
- with_super_classes = entry.decls.select {|d| d.decl.super_class }
176
+ with_super_classes = entry.each_decl.select {|decl| decl.super_class }
177
177
 
178
178
  return if with_super_classes.size <= 1
179
179
 
180
- super_types = with_super_classes.map do |d|
181
- super_class = d.decl.super_class or raise
182
- Types::ClassInstance.new(name: super_class.name, args: super_class.args, location: nil)
180
+ super_types = with_super_classes.map do |decl|
181
+ super_class = decl.super_class or raise
182
+ args = super_class.args
183
+
184
+ if align_params = entry.align_params(decl)
185
+ args = args.map {|type| type.sub(align_params) }
186
+ end
187
+
188
+ Types::ClassInstance.new(name: super_class.name, args: args, location: nil)
183
189
  end
184
190
 
185
191
  super_types.uniq!
@@ -200,8 +206,8 @@ module RBS
200
206
  case entry
201
207
  when Environment::ClassEntry
202
208
  validate_super_class!(type_name, entry)
203
- primary = entry.primary
204
- super_class = primary.decl.super_class
209
+ primary = entry.primary_decl
210
+ super_class = primary.super_class
205
211
 
206
212
  if type_name != BuiltinNames::BasicObject.name
207
213
  if super_class
@@ -214,13 +220,13 @@ module RBS
214
220
 
215
221
  super_name = env.normalize_module_name(super_name)
216
222
 
217
- NoSuperclassFoundError.check!(super_name, env: env, location: primary.decl.location)
223
+ NoSuperclassFoundError.check!(super_name, env: env, location: primary.location)
218
224
  if super_class
219
225
  InheritModuleError.check!(super_class, env: env)
220
226
  InvalidTypeApplicationError.check2!(type_name: super_class.name, args: super_class.args, env: env, location: super_class.location)
221
227
  end
222
228
 
223
- super_entry = env.normalized_class_entry(super_name) or raise
229
+ super_entry = env.class_entry(super_name, normalized: true) or raise
224
230
  super_args = AST::TypeParam.normalize_args(super_entry.type_params, super_args)
225
231
 
226
232
  ancestors = OneAncestors.class_instance(
@@ -248,7 +254,7 @@ module RBS
248
254
 
249
255
  module_name = module_self.name
250
256
  if module_name.class?
251
- module_entry = env.normalized_module_class_entry(module_name) or raise
257
+ module_entry = env.module_class_entry(module_name, normalized: true) or raise
252
258
  module_name = module_entry.name
253
259
  self_args = AST::TypeParam.normalize_args(module_entry.type_params, module_self.args)
254
260
  end
@@ -283,8 +289,8 @@ module RBS
283
289
  case entry
284
290
  when Environment::ClassEntry
285
291
  validate_super_class!(type_name, entry)
286
- primary = entry.primary
287
- super_class = primary.decl.super_class
292
+ primary = entry.primary_decl
293
+ super_class = primary.super_class
288
294
 
289
295
  if type_name != BuiltinNames::BasicObject.name
290
296
  if super_class
@@ -295,7 +301,7 @@ module RBS
295
301
 
296
302
  super_name = env.normalize_module_name(super_name)
297
303
 
298
- NoSuperclassFoundError.check!(super_name, env: env, location: primary.decl.location)
304
+ NoSuperclassFoundError.check!(super_name, env: env, location: primary.location)
299
305
  if super_class
300
306
  InheritModuleError.check!(super_class, env: env)
301
307
  end
@@ -348,79 +354,132 @@ module RBS
348
354
  end
349
355
 
350
356
  def mixin_ancestors0(decl, type_name, align_params:, included_modules:, included_interfaces:, extended_modules:, prepended_modules:, extended_interfaces:)
351
- decl.each_mixin do |member|
352
- case member
353
- when AST::Members::Include
354
- module_name = member.name
355
- module_args = member.args.map {|type| align_params ? type.sub(align_params) : type }
357
+ case decl
358
+ when AST::Declarations::Base
359
+ decl.each_mixin do |member|
360
+ case member
361
+ when AST::Members::Include
362
+ module_name = member.name
363
+ module_args = member.args.map {|type| align_params ? type.sub(align_params) : type }
356
364
 
357
- case
358
- when member.name.class? && included_modules
359
- MixinClassError.check!(type_name: type_name, env: env, member: member)
360
- NoMixinFoundError.check!(member.name, env: env, member: member)
365
+ case
366
+ when member.name.class? && included_modules
367
+ MixinClassError.check!(type_name: type_name, env: env, member: member)
368
+ NoMixinFoundError.check!(member.name, env: env, member: member)
361
369
 
362
- module_decl = env.normalized_module_entry(module_name) or raise
363
- module_args = AST::TypeParam.normalize_args(module_decl.type_params, module_args)
370
+ module_decl = env.module_entry(module_name, normalized: true) or raise
371
+ module_args = AST::TypeParam.normalize_args(module_decl.type_params, module_args)
364
372
 
365
- module_name = env.normalize_module_name(module_name)
366
- included_modules << Definition::Ancestor::Instance.new(name: module_name, args: module_args, source: member)
367
- when member.name.interface? && included_interfaces
368
- NoMixinFoundError.check!(member.name, env: env, member: member)
373
+ module_name = env.normalize_module_name(module_name)
374
+ included_modules << Definition::Ancestor::Instance.new(name: module_name, args: module_args, source: member)
375
+ when member.name.interface? && included_interfaces
376
+ NoMixinFoundError.check!(member.name, env: env, member: member)
369
377
 
370
- interface_decl = env.interface_decls.fetch(module_name)
371
- module_args = AST::TypeParam.normalize_args(interface_decl.decl.type_params, module_args)
378
+ interface_decl = env.interface_decls.fetch(module_name)
379
+ module_args = AST::TypeParam.normalize_args(interface_decl.decl.type_params, module_args)
372
380
 
373
- included_interfaces << Definition::Ancestor::Instance.new(name: module_name, args: module_args, source: member)
374
- end
381
+ included_interfaces << Definition::Ancestor::Instance.new(name: module_name, args: module_args, source: member)
382
+ end
375
383
 
376
- when AST::Members::Prepend
377
- if prepended_modules
378
- MixinClassError.check!(type_name: type_name, env: env, member: member)
379
- NoMixinFoundError.check!(member.name, env: env, member: member)
384
+ when AST::Members::Prepend
385
+ if prepended_modules
386
+ MixinClassError.check!(type_name: type_name, env: env, member: member)
387
+ NoMixinFoundError.check!(member.name, env: env, member: member)
380
388
 
381
- module_decl = env.normalized_module_entry(member.name) or raise
382
- module_name = module_decl.name
389
+ module_decl = env.module_entry(member.name, normalized: true) or raise
390
+ module_name = module_decl.name
383
391
 
384
- module_args = member.args.map {|type| align_params ? type.sub(align_params) : type }
385
- module_args = AST::TypeParam.normalize_args(module_decl.type_params, module_args)
392
+ module_args = member.args.map {|type| align_params ? type.sub(align_params) : type }
393
+ module_args = AST::TypeParam.normalize_args(module_decl.type_params, module_args)
386
394
 
387
- prepended_modules << Definition::Ancestor::Instance.new(name: module_name, args: module_args, source: member)
388
- end
395
+ prepended_modules << Definition::Ancestor::Instance.new(name: module_name, args: module_args, source: member)
396
+ end
389
397
 
390
- when AST::Members::Extend
391
- module_name = member.name
392
- module_args = member.args
398
+ when AST::Members::Extend
399
+ module_name = member.name
400
+ module_args = member.args
393
401
 
394
- case
395
- when member.name.class? && extended_modules
396
- MixinClassError.check!(type_name: type_name, env: env, member: member)
397
- NoMixinFoundError.check!(member.name, env: env, member: member)
402
+ case
403
+ when member.name.class? && extended_modules
404
+ MixinClassError.check!(type_name: type_name, env: env, member: member)
405
+ NoMixinFoundError.check!(member.name, env: env, member: member)
398
406
 
399
- module_decl = env.normalized_module_entry(module_name) or raise
400
- module_args = AST::TypeParam.normalize_args(module_decl.type_params, module_args)
407
+ module_decl = env.module_entry(module_name, normalized: true) or raise
408
+ module_args = AST::TypeParam.normalize_args(module_decl.type_params, module_args)
401
409
 
402
- module_name = env.normalize_module_name(module_name)
403
- extended_modules << Definition::Ancestor::Instance.new(name: module_name, args: module_args, source: member)
404
- when member.name.interface? && extended_interfaces
405
- NoMixinFoundError.check!(member.name, env: env, member: member)
410
+ module_name = env.normalize_module_name(module_name)
411
+ extended_modules << Definition::Ancestor::Instance.new(name: module_name, args: module_args, source: member)
412
+ when member.name.interface? && extended_interfaces
413
+ NoMixinFoundError.check!(member.name, env: env, member: member)
406
414
 
407
- interface_decl = env.interface_decls.fetch(module_name)
408
- module_args = AST::TypeParam.normalize_args(interface_decl.decl.type_params, module_args)
415
+ interface_decl = env.interface_decls.fetch(module_name)
416
+ module_args = AST::TypeParam.normalize_args(interface_decl.decl.type_params, module_args)
409
417
 
410
- extended_interfaces << Definition::Ancestor::Instance.new(name: module_name, args: module_args, source: member)
418
+ extended_interfaces << Definition::Ancestor::Instance.new(name: module_name, args: module_args, source: member)
419
+ end
420
+ end
421
+ end
422
+ when AST::Ruby::Declarations::Base
423
+ decl.members.each do |member|
424
+ case member
425
+ when AST::Ruby::Members::IncludeMember
426
+ if included_modules
427
+ module_name = member.module_name
428
+ module_args = member.type_args
429
+
430
+ # Check if mixing in a class (not allowed)
431
+ if env.class_decl?(module_name)
432
+ raise MixinClassError.new(type_name: type_name, member: member)
433
+ end
434
+
435
+ # Check if module exists
436
+ module_decl = env.module_entry(module_name, normalized: true) or raise NoMixinFoundError.new(type_name: module_name, member: member)
437
+ module_args = AST::TypeParam.normalize_args(module_decl.type_params, module_args)
438
+ module_name = env.normalize_module_name(module_name)
439
+ included_modules << Definition::Ancestor::Instance.new(name: module_name, args: module_args, source: member)
440
+ end
441
+
442
+ when AST::Ruby::Members::ExtendMember
443
+ if extended_modules
444
+ module_name = member.module_name
445
+ module_args = member.type_args
446
+
447
+ # Check if mixing in a class (not allowed)
448
+ if env.class_decl?(module_name)
449
+ raise MixinClassError.new(type_name: type_name, member: member)
450
+ end
451
+
452
+ # Check if module exists
453
+ module_decl = env.module_entry(module_name, normalized: true) or raise NoMixinFoundError.new(type_name: module_name, member: member)
454
+ module_args = AST::TypeParam.normalize_args(module_decl.type_params, module_args)
455
+ module_name = env.normalize_module_name(module_name)
456
+ extended_modules << Definition::Ancestor::Instance.new(name: module_name, args: module_args, source: member)
457
+ end
458
+
459
+ when AST::Ruby::Members::PrependMember
460
+ if prepended_modules
461
+ module_name = member.module_name
462
+ module_args = member.type_args
463
+
464
+ # Check if mixing in a class (not allowed)
465
+ if env.class_decl?(module_name)
466
+ raise MixinClassError.new(type_name: type_name, member: member)
467
+ end
468
+
469
+ # Check if module exists
470
+ module_decl = env.module_entry(module_name, normalized: true) or raise NoMixinFoundError.new(type_name: module_name, member: member)
471
+ module_args = AST::TypeParam.normalize_args(module_decl.type_params, module_args)
472
+ module_name = env.normalize_module_name(module_name)
473
+ prepended_modules << Definition::Ancestor::Instance.new(name: module_name, args: module_args, source: member)
474
+ end
411
475
  end
412
476
  end
413
477
  end
414
478
  end
415
479
 
416
480
  def mixin_ancestors(entry, type_name, included_modules:, included_interfaces:, extended_modules:, prepended_modules:, extended_interfaces:)
417
- entry.decls.each do |d|
418
- decl = d.decl
419
-
420
- align_params = Substitution.build(
421
- decl.type_params.each.map(&:name),
422
- entry.type_params.map {|param| Types::Variable.new(name: param.name, location: param.location) }
423
- )
481
+ entry.each_decl do |decl|
482
+ align_params = entry.align_params(decl)
424
483
 
425
484
  mixin_ancestors0(decl,
426
485
  type_name,
@@ -445,7 +504,7 @@ module RBS
445
504
 
446
505
  RecursiveAncestorError.check!(self_ancestor,
447
506
  ancestors: building_ancestors,
448
- location: entry.primary.decl.location)
507
+ location: entry.primary_decl.location)
449
508
  building_ancestors.push self_ancestor
450
509
 
451
510
  one_ancestors = one_instance_ancestors(type_name)
@@ -462,7 +521,7 @@ module RBS
462
521
 
463
522
  super_ancestors =
464
523
  instance_ancestors(super_name, building_ancestors: building_ancestors)
465
- .apply(super_args, env: env, location: entry.primary.decl.super_class&.location)
524
+ .apply(super_args, env: env, location: entry.primary_decl.super_class&.location)
466
525
  super_ancestors.map! {|ancestor| fill_ancestor_source(ancestor, name: super_name, source: :super) }
467
526
  ancestors.unshift(*super_ancestors)
468
527
  end
@@ -481,7 +540,7 @@ module RBS
481
540
  included_modules.each do |mod|
482
541
  name = mod.name
483
542
  arg_types = mod.args
484
- mod.source.is_a?(AST::Members::Include) or raise
543
+ (mod.source.is_a?(AST::Members::Include) || mod.source.is_a?(AST::Ruby::Members::IncludeMember)) or raise
485
544
  mod_ancestors =
486
545
  instance_ancestors(name, building_ancestors: building_ancestors)
487
546
  .apply(arg_types, env: env, location: mod.source.location)
@@ -496,7 +555,7 @@ module RBS
496
555
  prepended_modules.each do |mod|
497
556
  name = mod.name
498
557
  arg_types = mod.args
499
- mod.source.is_a?(AST::Members::Prepend) or raise
558
+ (mod.source.is_a?(AST::Members::Prepend) || mod.source.is_a?(AST::Ruby::Members::PrependMember)) or raise
500
559
  mod_ancestors =
501
560
  instance_ancestors(name, building_ancestors: building_ancestors)
502
561
  .apply(arg_types, env: env, location: mod.source.location)
@@ -522,7 +581,7 @@ module RBS
522
581
 
523
582
  RecursiveAncestorError.check!(self_ancestor,
524
583
  ancestors: building_ancestors,
525
- location: entry.primary.decl.location)
584
+ location: entry.primary_decl.location)
526
585
  building_ancestors.push self_ancestor
527
586
 
528
587
  one_ancestors = one_singleton_ancestors(type_name)
@@ -551,7 +610,7 @@ module RBS
551
610
  extended_modules.each do |mod|
552
611
  name = mod.name
553
612
  args = mod.args
554
- mod.source.is_a?(AST::Members::Extend) or raise
613
+ (mod.source.is_a?(AST::Members::Extend) || mod.source.is_a?(AST::Ruby::Members::ExtendMember)) or raise
555
614
  mod_ancestors =
556
615
  instance_ancestors(name, building_ancestors: building_ancestors)
557
616
  .apply(args, env: env, location: mod.source.location)
@@ -103,37 +103,56 @@ module RBS
103
103
  args = entry.type_params.map {|param| Types::Variable.new(name: param.name, location: param.location) }
104
104
  type = Types::ClassInstance.new(name: type_name, args: args, location: nil)
105
105
  Methods.new(type: type).tap do |methods|
106
- entry.decls.each do |d|
107
- subst = Substitution.build(d.decl.type_params.each.map(&:name), args)
108
- each_member_with_accessibility(d.decl.members) do |member, accessibility|
109
- case member
110
- when AST::Members::MethodDefinition
111
- case member.kind
112
- when :instance
113
- build_method(
114
- methods,
115
- type,
116
- member: member.update(overloads: member.overloads.map {|overload| overload.sub(subst) }),
117
- accessibility: member.visibility || accessibility
118
- )
119
- when :singleton_instance
120
- build_method(
121
- methods,
122
- type,
123
- member: member.update(overloads: member.overloads.map {|overload| overload.sub(subst) }),
124
- accessibility: :private
125
- )
106
+ entry.each_decl do |decl|
107
+ subst = entry.align_params(decl)
108
+ case decl
109
+ when AST::Declarations::Base
110
+ each_rbs_member_with_accessibility(decl.members) do |member, accessibility|
111
+ case member
112
+ when AST::Members::MethodDefinition
113
+ case member.kind
114
+ when :instance
115
+ build_method(
116
+ methods,
117
+ type,
118
+ member: subst ? member.update(overloads: member.overloads.map {|overload| overload.sub(subst) }) : member,
119
+ accessibility: member.visibility || accessibility
120
+ )
121
+ when :singleton_instance
122
+ build_method(
123
+ methods,
124
+ type,
125
+ member: subst ? member.update(overloads: member.overloads.map {|overload| overload.sub(subst) }) : member,
126
+ accessibility: :private
127
+ )
128
+ end
129
+ when AST::Members::AttrReader, AST::Members::AttrWriter, AST::Members::AttrAccessor
130
+ if member.kind == :instance
131
+ build_attribute(methods,
132
+ type,
133
+ member: subst ? member.update(type: member.type.sub(subst)) : member,
134
+ accessibility: member.visibility || accessibility)
135
+ end
136
+ when AST::Members::Alias
137
+ if member.kind == :instance
138
+ build_alias(methods, type, member: member)
139
+ end
126
140
  end
127
- when AST::Members::AttrReader, AST::Members::AttrWriter, AST::Members::AttrAccessor
128
- if member.kind == :instance
129
- build_attribute(methods,
130
- type,
131
- member: member.update(type: member.type.sub(subst)),
132
- accessibility: member.visibility || accessibility)
133
- end
134
- when AST::Members::Alias
135
- if member.kind == :instance
136
- build_alias(methods, type, member: member)
141
+ end
142
+ when AST::Ruby::Declarations::Base
143
+ decl.members.each do |member|
144
+ case member
145
+ when AST::Ruby::Members::DefMember
146
+ if member.instance?
147
+ build_method(
148
+ methods,
149
+ type,
150
+ member: member,
151
+ accessibility: :public
152
+ )
153
+ end
154
+ when AST::Ruby::Members::AttrReaderMember, AST::Ruby::Members::AttrWriterMember, AST::Ruby::Members::AttrAccessorMember
155
+ build_ruby_attribute(methods, type, member: member, accessibility: :public)
137
156
  end
138
157
  end
139
158
  end
@@ -149,8 +168,8 @@ module RBS
149
168
  type = Types::ClassSingleton.new(name: type_name, location: nil)
150
169
 
151
170
  Methods.new(type: type).tap do |methods|
152
- entry.decls.each do |d|
153
- d.decl.members.each do |member|
171
+ entry.each_decl do |decl|
172
+ decl.members.each do |member|
154
173
  case member
155
174
  when AST::Members::MethodDefinition
156
175
  if member.singleton?
@@ -164,6 +183,10 @@ module RBS
164
183
  if member.kind == :singleton
165
184
  build_alias(methods, type, member: member)
166
185
  end
186
+ when AST::Ruby::Members::DefMember
187
+ if member.singleton?
188
+ build_method(methods, type, member: member, accessibility: :public)
189
+ end
167
190
  end
168
191
  end
169
192
  end
@@ -212,6 +235,24 @@ module RBS
212
235
  end
213
236
  end
214
237
 
238
+ def build_ruby_attribute(methods, type, member:, accessibility:)
239
+ member.names.each do |name|
240
+ if member.is_a?(AST::Ruby::Members::AttrReaderMember) || member.is_a?(AST::Ruby::Members::AttrAccessorMember)
241
+ defn = methods.methods[name] ||= Methods::Definition.empty(type: type, name: name)
242
+
243
+ defn.accessibilities << accessibility
244
+ defn.originals << member
245
+ end
246
+
247
+ if member.is_a?(AST::Ruby::Members::AttrWriterMember) || member.is_a?(AST::Ruby::Members::AttrAccessorMember)
248
+ defn = methods.methods[:"#{name}="] ||= Methods::Definition.empty(type: type, name: :"#{name}=")
249
+
250
+ defn.accessibilities << accessibility
251
+ defn.originals << member
252
+ end
253
+ end
254
+ end
255
+
215
256
  def build_method(methods, type, member:, accessibility:)
216
257
  defn = methods.methods[member.name] ||= Methods::Definition.empty(type: type, name: member.name)
217
258
 
@@ -223,7 +264,7 @@ module RBS
223
264
  end
224
265
  end
225
266
 
226
- def each_member_with_accessibility(members, accessibility: :public)
267
+ def each_rbs_member_with_accessibility(members, accessibility: :public)
227
268
  members.each do |member|
228
269
  case member
229
270
  when AST::Members::Public