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
@@ -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,12 +173,12 @@ 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
180
+ super_types = with_super_classes.map do |decl|
181
+ super_class = decl.super_class or raise
182
182
  Types::ClassInstance.new(name: super_class.name, args: super_class.args, location: nil)
183
183
  end
184
184
 
@@ -200,8 +200,8 @@ module RBS
200
200
  case entry
201
201
  when Environment::ClassEntry
202
202
  validate_super_class!(type_name, entry)
203
- primary = entry.primary
204
- super_class = primary.decl.super_class
203
+ primary = entry.primary_decl
204
+ super_class = primary.super_class
205
205
 
206
206
  if type_name != BuiltinNames::BasicObject.name
207
207
  if super_class
@@ -214,13 +214,13 @@ module RBS
214
214
 
215
215
  super_name = env.normalize_module_name(super_name)
216
216
 
217
- NoSuperclassFoundError.check!(super_name, env: env, location: primary.decl.location)
217
+ NoSuperclassFoundError.check!(super_name, env: env, location: primary.location)
218
218
  if super_class
219
219
  InheritModuleError.check!(super_class, env: env)
220
220
  InvalidTypeApplicationError.check2!(type_name: super_class.name, args: super_class.args, env: env, location: super_class.location)
221
221
  end
222
222
 
223
- super_entry = env.normalized_class_entry(super_name) or raise
223
+ super_entry = env.class_entry(super_name, normalized: true) or raise
224
224
  super_args = AST::TypeParam.normalize_args(super_entry.type_params, super_args)
225
225
 
226
226
  ancestors = OneAncestors.class_instance(
@@ -248,7 +248,7 @@ module RBS
248
248
 
249
249
  module_name = module_self.name
250
250
  if module_name.class?
251
- module_entry = env.normalized_module_class_entry(module_name) or raise
251
+ module_entry = env.module_class_entry(module_name, normalized: true) or raise
252
252
  module_name = module_entry.name
253
253
  self_args = AST::TypeParam.normalize_args(module_entry.type_params, module_self.args)
254
254
  end
@@ -283,8 +283,8 @@ module RBS
283
283
  case entry
284
284
  when Environment::ClassEntry
285
285
  validate_super_class!(type_name, entry)
286
- primary = entry.primary
287
- super_class = primary.decl.super_class
286
+ primary = entry.primary_decl
287
+ super_class = primary.super_class
288
288
 
289
289
  if type_name != BuiltinNames::BasicObject.name
290
290
  if super_class
@@ -295,7 +295,7 @@ module RBS
295
295
 
296
296
  super_name = env.normalize_module_name(super_name)
297
297
 
298
- NoSuperclassFoundError.check!(super_name, env: env, location: primary.decl.location)
298
+ NoSuperclassFoundError.check!(super_name, env: env, location: primary.location)
299
299
  if super_class
300
300
  InheritModuleError.check!(super_class, env: env)
301
301
  end
@@ -348,75 +348,131 @@ module RBS
348
348
  end
349
349
 
350
350
  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 }
351
+ case decl
352
+ when AST::Declarations::Base
353
+ decl.each_mixin do |member|
354
+ case member
355
+ when AST::Members::Include
356
+ module_name = member.name
357
+ module_args = member.args.map {|type| align_params ? type.sub(align_params) : type }
356
358
 
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)
359
+ case
360
+ when member.name.class? && included_modules
361
+ MixinClassError.check!(type_name: type_name, env: env, member: member)
362
+ NoMixinFoundError.check!(member.name, env: env, member: member)
361
363
 
362
- module_decl = env.normalized_module_entry(module_name) or raise
363
- module_args = AST::TypeParam.normalize_args(module_decl.type_params, module_args)
364
+ module_decl = env.module_entry(module_name, normalized: true) or raise
365
+ module_args = AST::TypeParam.normalize_args(module_decl.type_params, module_args)
364
366
 
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)
367
+ module_name = env.normalize_module_name(module_name)
368
+ included_modules << Definition::Ancestor::Instance.new(name: module_name, args: module_args, source: member)
369
+ when member.name.interface? && included_interfaces
370
+ NoMixinFoundError.check!(member.name, env: env, member: member)
369
371
 
370
- interface_decl = env.interface_decls.fetch(module_name)
371
- module_args = AST::TypeParam.normalize_args(interface_decl.decl.type_params, module_args)
372
+ interface_decl = env.interface_decls.fetch(module_name)
373
+ module_args = AST::TypeParam.normalize_args(interface_decl.decl.type_params, module_args)
372
374
 
373
- included_interfaces << Definition::Ancestor::Instance.new(name: module_name, args: module_args, source: member)
374
- end
375
+ included_interfaces << Definition::Ancestor::Instance.new(name: module_name, args: module_args, source: member)
376
+ end
375
377
 
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)
378
+ when AST::Members::Prepend
379
+ if prepended_modules
380
+ MixinClassError.check!(type_name: type_name, env: env, member: member)
381
+ NoMixinFoundError.check!(member.name, env: env, member: member)
380
382
 
381
- module_decl = env.normalized_module_entry(member.name) or raise
382
- module_name = module_decl.name
383
+ module_decl = env.module_entry(member.name, normalized: true) or raise
384
+ module_name = module_decl.name
383
385
 
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)
386
+ module_args = member.args.map {|type| align_params ? type.sub(align_params) : type }
387
+ module_args = AST::TypeParam.normalize_args(module_decl.type_params, module_args)
386
388
 
387
- prepended_modules << Definition::Ancestor::Instance.new(name: module_name, args: module_args, source: member)
388
- end
389
+ prepended_modules << Definition::Ancestor::Instance.new(name: module_name, args: module_args, source: member)
390
+ end
389
391
 
390
- when AST::Members::Extend
391
- module_name = member.name
392
- module_args = member.args
392
+ when AST::Members::Extend
393
+ module_name = member.name
394
+ module_args = member.args
393
395
 
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)
396
+ case
397
+ when member.name.class? && extended_modules
398
+ MixinClassError.check!(type_name: type_name, env: env, member: member)
399
+ NoMixinFoundError.check!(member.name, env: env, member: member)
398
400
 
399
- module_decl = env.normalized_module_entry(module_name) or raise
400
- module_args = AST::TypeParam.normalize_args(module_decl.type_params, module_args)
401
+ module_decl = env.module_entry(module_name, normalized: true) or raise
402
+ module_args = AST::TypeParam.normalize_args(module_decl.type_params, module_args)
401
403
 
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)
404
+ module_name = env.normalize_module_name(module_name)
405
+ extended_modules << Definition::Ancestor::Instance.new(name: module_name, args: module_args, source: member)
406
+ when member.name.interface? && extended_interfaces
407
+ NoMixinFoundError.check!(member.name, env: env, member: member)
406
408
 
407
- interface_decl = env.interface_decls.fetch(module_name)
408
- module_args = AST::TypeParam.normalize_args(interface_decl.decl.type_params, module_args)
409
+ interface_decl = env.interface_decls.fetch(module_name)
410
+ module_args = AST::TypeParam.normalize_args(interface_decl.decl.type_params, module_args)
409
411
 
410
- extended_interfaces << Definition::Ancestor::Instance.new(name: module_name, args: module_args, source: member)
412
+ extended_interfaces << Definition::Ancestor::Instance.new(name: module_name, args: module_args, source: member)
413
+ end
414
+ end
415
+ end
416
+ when AST::Ruby::Declarations::Base
417
+ decl.members.each do |member|
418
+ case member
419
+ when AST::Ruby::Members::IncludeMember
420
+ if included_modules
421
+ module_name = member.module_name
422
+ module_args = member.type_args
423
+
424
+ # Check if mixing in a class (not allowed)
425
+ if env.class_decl?(module_name)
426
+ raise MixinClassError.new(type_name: type_name, member: member)
427
+ end
428
+
429
+ # Check if module exists
430
+ module_decl = env.module_entry(module_name, normalized: true) or raise NoMixinFoundError.new(type_name: module_name, member: member)
431
+ module_args = AST::TypeParam.normalize_args(module_decl.type_params, module_args)
432
+ module_name = env.normalize_module_name(module_name)
433
+ included_modules << Definition::Ancestor::Instance.new(name: module_name, args: module_args, source: member)
434
+ end
435
+
436
+ when AST::Ruby::Members::ExtendMember
437
+ if extended_modules
438
+ module_name = member.module_name
439
+ module_args = member.type_args
440
+
441
+ # Check if mixing in a class (not allowed)
442
+ if env.class_decl?(module_name)
443
+ raise MixinClassError.new(type_name: type_name, member: member)
444
+ end
445
+
446
+ # Check if module exists
447
+ module_decl = env.module_entry(module_name, normalized: true) or raise NoMixinFoundError.new(type_name: module_name, member: member)
448
+ module_args = AST::TypeParam.normalize_args(module_decl.type_params, module_args)
449
+ module_name = env.normalize_module_name(module_name)
450
+ extended_modules << Definition::Ancestor::Instance.new(name: module_name, args: module_args, source: member)
451
+ end
452
+
453
+ when AST::Ruby::Members::PrependMember
454
+ if prepended_modules
455
+ module_name = member.module_name
456
+ module_args = member.type_args
457
+
458
+ # Check if mixing in a class (not allowed)
459
+ if env.class_decl?(module_name)
460
+ raise MixinClassError.new(type_name: type_name, member: member)
461
+ end
462
+
463
+ # Check if module exists
464
+ module_decl = env.module_entry(module_name, normalized: true) or raise NoMixinFoundError.new(type_name: module_name, member: member)
465
+ module_args = AST::TypeParam.normalize_args(module_decl.type_params, module_args)
466
+ module_name = env.normalize_module_name(module_name)
467
+ prepended_modules << Definition::Ancestor::Instance.new(name: module_name, args: module_args, source: member)
468
+ end
411
469
  end
412
470
  end
413
471
  end
414
472
  end
415
473
 
416
474
  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
-
475
+ entry.each_decl do |decl|
420
476
  align_params = Substitution.build(
421
477
  decl.type_params.each.map(&:name),
422
478
  entry.type_params.map {|param| Types::Variable.new(name: param.name, location: param.location) }
@@ -445,7 +501,7 @@ module RBS
445
501
 
446
502
  RecursiveAncestorError.check!(self_ancestor,
447
503
  ancestors: building_ancestors,
448
- location: entry.primary.decl.location)
504
+ location: entry.primary_decl.location)
449
505
  building_ancestors.push self_ancestor
450
506
 
451
507
  one_ancestors = one_instance_ancestors(type_name)
@@ -462,7 +518,7 @@ module RBS
462
518
 
463
519
  super_ancestors =
464
520
  instance_ancestors(super_name, building_ancestors: building_ancestors)
465
- .apply(super_args, env: env, location: entry.primary.decl.super_class&.location)
521
+ .apply(super_args, env: env, location: entry.primary_decl.super_class&.location)
466
522
  super_ancestors.map! {|ancestor| fill_ancestor_source(ancestor, name: super_name, source: :super) }
467
523
  ancestors.unshift(*super_ancestors)
468
524
  end
@@ -481,7 +537,7 @@ module RBS
481
537
  included_modules.each do |mod|
482
538
  name = mod.name
483
539
  arg_types = mod.args
484
- mod.source.is_a?(AST::Members::Include) or raise
540
+ (mod.source.is_a?(AST::Members::Include) || mod.source.is_a?(AST::Ruby::Members::IncludeMember)) or raise
485
541
  mod_ancestors =
486
542
  instance_ancestors(name, building_ancestors: building_ancestors)
487
543
  .apply(arg_types, env: env, location: mod.source.location)
@@ -496,7 +552,7 @@ module RBS
496
552
  prepended_modules.each do |mod|
497
553
  name = mod.name
498
554
  arg_types = mod.args
499
- mod.source.is_a?(AST::Members::Prepend) or raise
555
+ (mod.source.is_a?(AST::Members::Prepend) || mod.source.is_a?(AST::Ruby::Members::PrependMember)) or raise
500
556
  mod_ancestors =
501
557
  instance_ancestors(name, building_ancestors: building_ancestors)
502
558
  .apply(arg_types, env: env, location: mod.source.location)
@@ -522,7 +578,7 @@ module RBS
522
578
 
523
579
  RecursiveAncestorError.check!(self_ancestor,
524
580
  ancestors: building_ancestors,
525
- location: entry.primary.decl.location)
581
+ location: entry.primary_decl.location)
526
582
  building_ancestors.push self_ancestor
527
583
 
528
584
  one_ancestors = one_singleton_ancestors(type_name)
@@ -551,7 +607,7 @@ module RBS
551
607
  extended_modules.each do |mod|
552
608
  name = mod.name
553
609
  args = mod.args
554
- mod.source.is_a?(AST::Members::Extend) or raise
610
+ (mod.source.is_a?(AST::Members::Extend) || mod.source.is_a?(AST::Ruby::Members::ExtendMember)) or raise
555
611
  mod_ancestors =
556
612
  instance_ancestors(name, building_ancestors: building_ancestors)
557
613
  .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 = Substitution.build(decl.type_params.each.map(&:name), args)
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: member.update(overloads: member.overloads.map {|overload| overload.sub(subst) }),
119
+ accessibility: member.visibility || accessibility
120
+ )
121
+ when :singleton_instance
122
+ build_method(
123
+ methods,
124
+ type,
125
+ member: member.update(overloads: member.overloads.map {|overload| overload.sub(subst) }),
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: member.update(type: member.type.sub(subst)),
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