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
@@ -126,10 +126,10 @@ module RBS
126
126
  entry = env.class_decls[type_name] or raise "Unknown name for build_instance: #{type_name}"
127
127
  args = entry.type_params.map {|param| Types::Variable.new(name: param.name, location: param.location) }
128
128
 
129
- entry.decls.each do |d|
130
- subst_ = subst + Substitution.build(d.decl.type_params.each.map(&:name), args)
129
+ entry.each_decl do |decl|
130
+ subst_ = subst + Substitution.build(decl.type_params.each.map(&:name), args)
131
131
 
132
- d.decl.members.each do |member|
132
+ decl.members.each do |member|
133
133
  case member
134
134
  when AST::Members::AttrReader, AST::Members::AttrAccessor, AST::Members::AttrWriter
135
135
  if member.kind == :instance
@@ -151,6 +151,29 @@ module RBS
151
151
  end
152
152
  end
153
153
 
154
+ when AST::Ruby::Members::AttrReaderMember, AST::Ruby::Members::AttrWriterMember, AST::Ruby::Members::AttrAccessorMember
155
+ member.names.each do |name|
156
+ ivar_name = :"@#{name}"
157
+ attr_type = member.type || Types::Bases::Any.new(location: nil)
158
+
159
+ insert_variable(
160
+ type_name,
161
+ definition.instance_variables,
162
+ name: ivar_name,
163
+ type: attr_type,
164
+ source: member
165
+ )
166
+ end
167
+
168
+ when AST::Ruby::Members::InstanceVariableMember
169
+ insert_variable(
170
+ type_name,
171
+ definition.instance_variables,
172
+ name: member.name,
173
+ type: member.type,
174
+ source: member
175
+ )
176
+
154
177
  when AST::Members::InstanceVariable
155
178
  insert_variable(
156
179
  type_name,
@@ -174,7 +197,7 @@ module RBS
174
197
 
175
198
  try_cache(type_name, cache: instance_cache) do
176
199
  entry = env.class_decls[type_name] or raise "Unknown name for build_instance: #{type_name}"
177
- ensure_namespace!(type_name.namespace, location: entry.decls[0].decl.location)
200
+ ensure_namespace!(type_name.namespace, location: entry.primary_decl.location)
178
201
 
179
202
  ancestors = ancestor_builder.instance_ancestors(type_name)
180
203
  args = entry.type_params.map {|param| Types::Variable.new(name: param.name, location: param.location) }
@@ -234,7 +257,7 @@ module RBS
234
257
  def build_singleton0(type_name)
235
258
  try_cache type_name, cache: singleton0_cache do
236
259
  entry = env.class_decls[type_name] or raise "Unknown name for build_singleton0: #{type_name}"
237
- ensure_namespace!(type_name.namespace, location: entry.decls[0].decl.location)
260
+ ensure_namespace!(type_name.namespace, location: entry.primary_decl.location)
238
261
 
239
262
  ancestors = ancestor_builder.singleton_ancestors(type_name)
240
263
  self_type = Types::ClassSingleton.new(name: type_name, location: nil)
@@ -272,8 +295,8 @@ module RBS
272
295
  interface_methods = interface_methods(all_interfaces)
273
296
  import_methods(definition, type_name, methods, interface_methods, Substitution.new, nil)
274
297
 
275
- entry.decls.each do |d|
276
- d.decl.members.each do |member|
298
+ entry.each_decl do |decl|
299
+ decl.members.each do |member|
277
300
  case member
278
301
  when AST::Members::AttrReader, AST::Members::AttrAccessor, AST::Members::AttrWriter
279
302
  if member.kind == :singleton
@@ -306,7 +329,7 @@ module RBS
306
329
 
307
330
  try_cache type_name, cache: singleton_cache do
308
331
  entry = env.class_decls[type_name] or raise "Unknown name for build_singleton: #{type_name}"
309
- ensure_namespace!(type_name.namespace, location: entry.decls[0].decl.location)
332
+ ensure_namespace!(type_name.namespace, location: entry.primary_decl.location)
310
333
 
311
334
  ancestors = ancestor_builder.singleton_ancestors(type_name)
312
335
  self_type = Types::ClassSingleton.new(name: type_name, location: nil)
@@ -375,6 +398,19 @@ module RBS
375
398
  .update(type_params: class_params + method_type.type_params)
376
399
  end
377
400
 
401
+ method_type = method_type.map_type do |type|
402
+ case type
403
+ when Types::Bases::Self
404
+ Types::ClassInstance.new(
405
+ name: type_name,
406
+ args: entry.type_params.map {|param| Types::Variable.new(name: param.name, location: param.location) },
407
+ location: nil
408
+ )
409
+ else
410
+ type
411
+ end
412
+ end
413
+
378
414
  method_type = method_type.update(
379
415
  type: method_type.type.with_return_type(
380
416
  Types::ClassInstance.new(
@@ -452,6 +488,10 @@ module RBS
452
488
  case decl
453
489
  when AST::Declarations::Class
454
490
  decl.super_class&.location
491
+ when AST::Ruby::Declarations::ClassDecl
492
+ nil
493
+ else
494
+ raise "Unexpected `:super` source location with #{decl.class}"
455
495
  end
456
496
  else
457
497
  source.location
@@ -471,7 +511,7 @@ module RBS
471
511
  validate_params_with(type_params, result: result) do |param|
472
512
  decl = case entry = definition.entry
473
513
  when Environment::ModuleEntry, Environment::ClassEntry
474
- entry.primary.decl
514
+ entry.primary_decl
475
515
  when Environment::SingleEntry
476
516
  entry.decl
477
517
  end
@@ -547,6 +587,7 @@ module RBS
547
587
  declared_in: type_name,
548
588
  source: source
549
589
  )
590
+
550
591
  validate_variable(variables[name])
551
592
  end
552
593
 
@@ -557,7 +598,15 @@ module RBS
557
598
  variables = [] #: Array[Definition::Variable]
558
599
  tmp_var = var
559
600
  while tmp_var
560
- variables << tmp_var if tmp_var.source.is_a?(AST::Members::Var)
601
+ case tmp_var.source
602
+ when AST::Members::AttrReader, AST::Members::AttrWriter, AST::Members::AttrAccessor
603
+ # nop
604
+ when AST::Ruby::Members::AttrReaderMember, AST::Ruby::Members::AttrWriterMember, AST::Ruby::Members::AttrAccessorMember
605
+ # nop
606
+ else
607
+ variables << tmp_var
608
+ end
609
+
561
610
  tmp_var = tmp_var.parent_variable
562
611
  end
563
612
 
@@ -575,6 +624,10 @@ module RBS
575
624
  if r.source.instance_of?(AST::Members::ClassInstanceVariable) && l.declared_in == r.declared_in
576
625
  raise ClassInstanceVariableDuplicationError.new(type_name: l.declared_in, variable_name: l.source.name, location: l.source.location)
577
626
  end
627
+ when AST::Ruby::Members::InstanceVariableMember
628
+ if l.declared_in == r.declared_in
629
+ raise InstanceVariableDuplicationError.new(type_name: l.declared_in, variable_name: l.source.name, location: l.source.location)
630
+ end
578
631
  end
579
632
  end
580
633
 
@@ -602,7 +655,7 @@ module RBS
602
655
 
603
656
  methods.each do |method|
604
657
  if interface_method_duplicates.include?(method.name)
605
- member.is_a?(AST::Members::Include) || member.is_a?(AST::Members::Extend) or raise
658
+ (member.is_a?(AST::Members::Include) || member.is_a?(AST::Members::Extend)) or raise
606
659
 
607
660
  raise DuplicatedInterfaceMethodDefinitionError.new(
608
661
  type: definition.self_type,
@@ -655,12 +708,14 @@ module RBS
655
708
  )
656
709
  end
657
710
 
711
+ accessibility = special_accessibility(original.instance?, original.new_name) || original_method.accessibility
712
+
658
713
  method_definition = Definition::Method.new(
659
714
  super_method: existing_method,
660
715
  defs: original_method.defs.map do |defn|
661
716
  defn.update(defined_in: defined_in, implemented_in: implemented_in)
662
717
  end,
663
- accessibility: original_method.accessibility,
718
+ accessibility: accessibility,
664
719
  alias_of: original_method,
665
720
  alias_member: original
666
721
  )
@@ -687,13 +742,9 @@ module RBS
687
742
  end
688
743
  end
689
744
 
690
- # @type var accessibility: RBS::Definition::accessibility
691
- accessibility =
692
- if original.instance? && [:initialize, :initialize_copy, :initialize_clone, :initialize_dup, :respond_to_missing?].include?(method.name)
693
- :private
694
- else
695
- method.accessibility
696
- end
745
+ # Respect the visibility of the original method definition.
746
+ accessibility = original.visibility || special_accessibility(original.instance?, method.name) || method.accessibility
747
+
697
748
  # Skip setting up `super_method` if `implemented_in` is `nil`, that means the type doesn't have implementation.
698
749
  # This typically happens if the type is an interface.
699
750
  if implemented_in
@@ -746,6 +797,9 @@ module RBS
746
797
  super_method = existing_method
747
798
  end
748
799
 
800
+ # Respect the visibility of the original method definition.
801
+ accessibility = original.visibility || special_accessibility(original.kind == :instance, method.name) || method.accessibility
802
+
749
803
  method_definition = Definition::Method.new(
750
804
  super_method: super_method,
751
805
  defs: [
@@ -756,12 +810,109 @@ module RBS
756
810
  implemented_in: implemented_in
757
811
  )
758
812
  ],
759
- accessibility: method.accessibility,
813
+ accessibility: accessibility,
760
814
  alias_of: nil,
761
815
  alias_member: nil
762
816
  )
763
817
 
764
818
  method_definition.annotations.replace(original.annotations)
819
+ when AST::Ruby::Members::AttrReaderMember, AST::Ruby::Members::AttrWriterMember, AST::Ruby::Members::AttrAccessorMember
820
+ if duplicated_method = methods[method.name]
821
+ raise DuplicatedMethodDefinitionError.new(
822
+ type: definition.self_type,
823
+ method_name: method.name,
824
+ members: [*duplicated_method.members, original]
825
+ )
826
+ end
827
+
828
+ attr_type = original.type || Types::Bases::Any.new(location: nil)
829
+ method_type =
830
+ if method.name.to_s.end_with?("=")
831
+ # setter
832
+ MethodType.new(
833
+ type_params: [],
834
+ type: Types::Function.empty(attr_type).update(
835
+ required_positionals: [
836
+ Types::Function::Param.new(type: attr_type, name: method.name.to_s.chomp("=").to_sym)
837
+ ]
838
+ ),
839
+ block: nil,
840
+ location: original.location
841
+ )
842
+ else
843
+ # getter
844
+ MethodType.new(
845
+ type_params: [],
846
+ type: Types::Function.empty(attr_type),
847
+ block: nil,
848
+ location: original.location
849
+ )
850
+ end
851
+
852
+ if implemented_in
853
+ super_method = existing_method
854
+ end
855
+
856
+ method_definition = Definition::Method.new(
857
+ super_method: super_method,
858
+ defs: [
859
+ Definition::Method::TypeDef.new(
860
+ type: method_type,
861
+ member: original,
862
+ defined_in: defined_in,
863
+ implemented_in: implemented_in
864
+ )
865
+ ],
866
+ accessibility: method.accessibility,
867
+ alias_of: nil,
868
+ alias_member: nil
869
+ )
870
+
871
+ method_definition.annotations.replace([])
872
+ when AST::Ruby::Members::DefMember
873
+ if duplicated_method = methods[method.name]
874
+ raise DuplicatedMethodDefinitionError.new(
875
+ type: definition.self_type,
876
+ method_name: method.name,
877
+ members: [original, *duplicated_method.members]
878
+ )
879
+ end
880
+
881
+ if original.method_type.empty? && existing_method
882
+ # Unannotated method with a parent definition → inherit from the parent, like @rbs ...
883
+ method_definition = Definition::Method.new(
884
+ super_method: existing_method,
885
+ defs: existing_method.defs.map { |defn| defn.update(implemented_in: implemented_in) },
886
+ accessibility: :public,
887
+ alias_of: existing_method.alias_of,
888
+ alias_member: nil
889
+ )
890
+
891
+ method_definition.annotations.replace(existing_method.annotations)
892
+ else
893
+ defs = original.overloads.map do |overload|
894
+ Definition::Method::TypeDef.new(
895
+ type: subst.empty? ? overload.method_type : overload.method_type.sub(subst),
896
+ member: original,
897
+ defined_in: defined_in,
898
+ implemented_in: implemented_in
899
+ ).tap do |type_def|
900
+ # Keep the original annotations given to overloads.
901
+ type_def.overload_annotations.replace(overload.annotations)
902
+ end
903
+ end
904
+
905
+ method_definition = Definition::Method.new(
906
+ super_method: existing_method,
907
+ defs: defs,
908
+ accessibility: :public,
909
+ alias_of: nil,
910
+ alias_member: nil
911
+ )
912
+
913
+ method_definition.annotations.replace([])
914
+ end
915
+
765
916
  when nil
766
917
  # Overloading method definition only
767
918
 
@@ -819,6 +970,12 @@ module RBS
819
970
  methods[method.name] = method_definition
820
971
  end
821
972
 
973
+ def special_accessibility(is_instance, method_name)
974
+ if is_instance && [:initialize, :initialize_copy, :initialize_clone, :initialize_dup, :respond_to_missing?].include?(method_name)
975
+ :private
976
+ end
977
+ end
978
+
822
979
  def try_cache(type_name, cache:)
823
980
  cache[type_name] ||= yield
824
981
  end
data/lib/rbs/diff.rb CHANGED
@@ -104,7 +104,13 @@ module RBS
104
104
  detail_to_s = @detail ? "[#{definition_method.defined_in} #{definition_method.accessibility}] " : ""
105
105
  if definition_method.alias_of
106
106
  first_def = definition_method.alias_of.defs.first #: Definition::Method::TypeDef
107
- "#{detail_to_s}alias #{prefix}#{key} #{prefix}#{first_def.member.name}"
107
+ member_name = case first_def.member
108
+ when AST::Members::Base
109
+ first_def.member.name
110
+ else
111
+ raise
112
+ end
113
+ "#{detail_to_s}alias #{prefix}#{key} #{prefix}#{member_name}"
108
114
  else
109
115
  "#{detail_to_s}def #{prefix}#{key}: #{definition_method.method_types.join(" | ")}"
110
116
  end
@@ -0,0 +1,69 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RBS
4
+ class Environment
5
+ class ClassEntry
6
+ attr_reader :name
7
+
8
+ attr_reader :context_decls
9
+
10
+ def initialize(name)
11
+ @name = name
12
+ @context_decls = []
13
+ end
14
+
15
+ def <<(context_decl)
16
+ context_decls << context_decl
17
+ @primary_decl = nil
18
+ self
19
+ end
20
+
21
+ def each_decl(&block)
22
+ if block
23
+ context_decls.each do |_, decl|
24
+ yield decl
25
+ end
26
+ else
27
+ enum_for(__method__ || raise)
28
+ end
29
+ end
30
+
31
+ def empty?
32
+ context_decls.empty?
33
+ end
34
+
35
+ def primary_decl
36
+ @primary_decl ||= nil.tap do
37
+ # @type break: declaration
38
+
39
+ decl = each_decl.find {|decl| decl.super_class }
40
+ break decl if decl
41
+
42
+ decl = each_decl.first
43
+ break decl if decl
44
+ end || raise("Cannot find primary declaration for #{name}")
45
+ end
46
+
47
+ def type_params
48
+ validate_type_params
49
+ primary_decl.type_params
50
+ end
51
+
52
+ def validate_type_params
53
+ unless context_decls.empty?
54
+ first_decl, *rest_decls = each_decl.to_a
55
+ first_decl or raise
56
+
57
+ first_params = first_decl.type_params
58
+ first_names = first_params.map(&:name)
59
+ rest_decls.each do |other_decl|
60
+ other_params = other_decl.type_params
61
+ unless first_names.size == other_params.size && first_params == AST::TypeParam.rename(other_params, new_names: first_names)
62
+ raise GenericParameterMismatchError.new(name: name, decl: other_decl)
63
+ end
64
+ end
65
+ end
66
+ end
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,66 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RBS
4
+ class Environment
5
+ class ModuleEntry
6
+ attr_reader :name
7
+
8
+ attr_reader :context_decls
9
+
10
+ def initialize(name)
11
+ @name = name
12
+ @context_decls = []
13
+ end
14
+
15
+ def <<(context_decl)
16
+ context_decls << context_decl
17
+ self
18
+ end
19
+
20
+ def each_decl(&block)
21
+ if block
22
+ context_decls.each do |_, decl|
23
+ yield decl
24
+ end
25
+ else
26
+ enum_for(__method__ || raise)
27
+ end
28
+ end
29
+
30
+ def empty?
31
+ context_decls.empty?
32
+ end
33
+
34
+ def primary_decl
35
+ each_decl.first or raise
36
+ end
37
+
38
+ def type_params
39
+ validate_type_params
40
+ primary_decl.type_params
41
+ end
42
+
43
+ def self_types
44
+ each_decl.flat_map do |decl|
45
+ decl.self_types
46
+ end.uniq
47
+ end
48
+
49
+ def validate_type_params
50
+ unless context_decls.empty?
51
+ first_decl, *rest_decls = each_decl.to_a
52
+ first_decl or raise
53
+
54
+ first_params = first_decl.type_params
55
+ first_names = first_params.map(&:name)
56
+ rest_decls.each do |other_decl|
57
+ other_params = other_decl.type_params
58
+ unless first_names.size == other_params.size && first_params == AST::TypeParam.rename(other_params, new_names: first_names)
59
+ raise GenericParameterMismatchError.new(name: name, decl: other_decl)
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
65
+ end
66
+ end