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
@@ -124,12 +124,15 @@ module RBS
124
124
  end
125
125
 
126
126
  entry = env.class_decls[type_name] or raise "Unknown name for build_instance: #{type_name}"
127
- args = entry.type_params.map {|param| Types::Variable.new(name: param.name, location: param.location) }
128
127
 
129
- entry.decls.each do |d|
130
- subst_ = subst + Substitution.build(d.decl.type_params.each.map(&:name), args)
128
+ entry.each_decl do |decl|
129
+ if align_params = entry.align_params(decl)
130
+ subst_ = subst + align_params
131
+ else
132
+ subst_ = subst
133
+ end
131
134
 
132
- d.decl.members.each do |member|
135
+ decl.members.each do |member|
133
136
  case member
134
137
  when AST::Members::AttrReader, AST::Members::AttrAccessor, AST::Members::AttrWriter
135
138
  if member.kind == :instance
@@ -151,6 +154,29 @@ module RBS
151
154
  end
152
155
  end
153
156
 
157
+ when AST::Ruby::Members::AttrReaderMember, AST::Ruby::Members::AttrWriterMember, AST::Ruby::Members::AttrAccessorMember
158
+ member.names.each do |name|
159
+ ivar_name = :"@#{name}"
160
+ attr_type = member.type || Types::Bases::Any.new(location: nil)
161
+
162
+ insert_variable(
163
+ type_name,
164
+ definition.instance_variables,
165
+ name: ivar_name,
166
+ type: attr_type,
167
+ source: member
168
+ )
169
+ end
170
+
171
+ when AST::Ruby::Members::InstanceVariableMember
172
+ insert_variable(
173
+ type_name,
174
+ definition.instance_variables,
175
+ name: member.name,
176
+ type: member.type,
177
+ source: member
178
+ )
179
+
154
180
  when AST::Members::InstanceVariable
155
181
  insert_variable(
156
182
  type_name,
@@ -174,7 +200,7 @@ module RBS
174
200
 
175
201
  try_cache(type_name, cache: instance_cache) do
176
202
  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)
203
+ ensure_namespace!(type_name.namespace, location: entry.primary_decl.location)
178
204
 
179
205
  ancestors = ancestor_builder.instance_ancestors(type_name)
180
206
  args = entry.type_params.map {|param| Types::Variable.new(name: param.name, location: param.location) }
@@ -234,7 +260,7 @@ module RBS
234
260
  def build_singleton0(type_name)
235
261
  try_cache type_name, cache: singleton0_cache do
236
262
  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)
263
+ ensure_namespace!(type_name.namespace, location: entry.primary_decl.location)
238
264
 
239
265
  ancestors = ancestor_builder.singleton_ancestors(type_name)
240
266
  self_type = Types::ClassSingleton.new(name: type_name, location: nil)
@@ -272,8 +298,8 @@ module RBS
272
298
  interface_methods = interface_methods(all_interfaces)
273
299
  import_methods(definition, type_name, methods, interface_methods, Substitution.new, nil)
274
300
 
275
- entry.decls.each do |d|
276
- d.decl.members.each do |member|
301
+ entry.each_decl do |decl|
302
+ decl.members.each do |member|
277
303
  case member
278
304
  when AST::Members::AttrReader, AST::Members::AttrAccessor, AST::Members::AttrWriter
279
305
  if member.kind == :singleton
@@ -306,7 +332,7 @@ module RBS
306
332
 
307
333
  try_cache type_name, cache: singleton_cache do
308
334
  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)
335
+ ensure_namespace!(type_name.namespace, location: entry.primary_decl.location)
310
336
 
311
337
  ancestors = ancestor_builder.singleton_ancestors(type_name)
312
338
  self_type = Types::ClassSingleton.new(name: type_name, location: nil)
@@ -375,6 +401,19 @@ module RBS
375
401
  .update(type_params: class_params + method_type.type_params)
376
402
  end
377
403
 
404
+ method_type = method_type.map_type do |type|
405
+ case type
406
+ when Types::Bases::Self
407
+ Types::ClassInstance.new(
408
+ name: type_name,
409
+ args: entry.type_params.map {|param| Types::Variable.new(name: param.name, location: param.location) },
410
+ location: nil
411
+ )
412
+ else
413
+ type
414
+ end
415
+ end
416
+
378
417
  method_type = method_type.update(
379
418
  type: method_type.type.with_return_type(
380
419
  Types::ClassInstance.new(
@@ -452,6 +491,10 @@ module RBS
452
491
  case decl
453
492
  when AST::Declarations::Class
454
493
  decl.super_class&.location
494
+ when AST::Ruby::Declarations::ClassDecl
495
+ nil
496
+ else
497
+ raise "Unexpected `:super` source location with #{decl.class}"
455
498
  end
456
499
  else
457
500
  source.location
@@ -471,7 +514,7 @@ module RBS
471
514
  validate_params_with(type_params, result: result) do |param|
472
515
  decl = case entry = definition.entry
473
516
  when Environment::ModuleEntry, Environment::ClassEntry
474
- entry.primary.decl
517
+ entry.primary_decl
475
518
  when Environment::SingleEntry
476
519
  entry.decl
477
520
  end
@@ -547,6 +590,7 @@ module RBS
547
590
  declared_in: type_name,
548
591
  source: source
549
592
  )
593
+
550
594
  validate_variable(variables[name])
551
595
  end
552
596
 
@@ -557,7 +601,15 @@ module RBS
557
601
  variables = [] #: Array[Definition::Variable]
558
602
  tmp_var = var
559
603
  while tmp_var
560
- variables << tmp_var if tmp_var.source.is_a?(AST::Members::Var)
604
+ case tmp_var.source
605
+ when AST::Members::AttrReader, AST::Members::AttrWriter, AST::Members::AttrAccessor
606
+ # nop
607
+ when AST::Ruby::Members::AttrReaderMember, AST::Ruby::Members::AttrWriterMember, AST::Ruby::Members::AttrAccessorMember
608
+ # nop
609
+ else
610
+ variables << tmp_var
611
+ end
612
+
561
613
  tmp_var = tmp_var.parent_variable
562
614
  end
563
615
 
@@ -575,6 +627,10 @@ module RBS
575
627
  if r.source.instance_of?(AST::Members::ClassInstanceVariable) && l.declared_in == r.declared_in
576
628
  raise ClassInstanceVariableDuplicationError.new(type_name: l.declared_in, variable_name: l.source.name, location: l.source.location)
577
629
  end
630
+ when AST::Ruby::Members::InstanceVariableMember
631
+ if l.declared_in == r.declared_in
632
+ raise InstanceVariableDuplicationError.new(type_name: l.declared_in, variable_name: l.source.name, location: l.source.location)
633
+ end
578
634
  end
579
635
  end
580
636
 
@@ -602,7 +658,7 @@ module RBS
602
658
 
603
659
  methods.each do |method|
604
660
  if interface_method_duplicates.include?(method.name)
605
- member.is_a?(AST::Members::Include) || member.is_a?(AST::Members::Extend) or raise
661
+ (member.is_a?(AST::Members::Include) || member.is_a?(AST::Members::Extend)) or raise
606
662
 
607
663
  raise DuplicatedInterfaceMethodDefinitionError.new(
608
664
  type: definition.self_type,
@@ -655,12 +711,14 @@ module RBS
655
711
  )
656
712
  end
657
713
 
714
+ accessibility = special_accessibility(original.instance?, original.new_name) || original_method.accessibility
715
+
658
716
  method_definition = Definition::Method.new(
659
717
  super_method: existing_method,
660
718
  defs: original_method.defs.map do |defn|
661
719
  defn.update(defined_in: defined_in, implemented_in: implemented_in)
662
720
  end,
663
- accessibility: original_method.accessibility,
721
+ accessibility: accessibility,
664
722
  alias_of: original_method,
665
723
  alias_member: original
666
724
  )
@@ -687,13 +745,9 @@ module RBS
687
745
  end
688
746
  end
689
747
 
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
748
+ # Respect the visibility of the original method definition.
749
+ accessibility = original.visibility || special_accessibility(original.instance?, method.name) || method.accessibility
750
+
697
751
  # Skip setting up `super_method` if `implemented_in` is `nil`, that means the type doesn't have implementation.
698
752
  # This typically happens if the type is an interface.
699
753
  if implemented_in
@@ -746,6 +800,9 @@ module RBS
746
800
  super_method = existing_method
747
801
  end
748
802
 
803
+ # Respect the visibility of the original method definition.
804
+ accessibility = original.visibility || special_accessibility(original.kind == :instance, method.name) || method.accessibility
805
+
749
806
  method_definition = Definition::Method.new(
750
807
  super_method: super_method,
751
808
  defs: [
@@ -756,12 +813,109 @@ module RBS
756
813
  implemented_in: implemented_in
757
814
  )
758
815
  ],
759
- accessibility: method.accessibility,
816
+ accessibility: accessibility,
760
817
  alias_of: nil,
761
818
  alias_member: nil
762
819
  )
763
820
 
764
821
  method_definition.annotations.replace(original.annotations)
822
+ when AST::Ruby::Members::AttrReaderMember, AST::Ruby::Members::AttrWriterMember, AST::Ruby::Members::AttrAccessorMember
823
+ if duplicated_method = methods[method.name]
824
+ raise DuplicatedMethodDefinitionError.new(
825
+ type: definition.self_type,
826
+ method_name: method.name,
827
+ members: [*duplicated_method.members, original]
828
+ )
829
+ end
830
+
831
+ attr_type = original.type || Types::Bases::Any.new(location: nil)
832
+ method_type =
833
+ if method.name.to_s.end_with?("=")
834
+ # setter
835
+ MethodType.new(
836
+ type_params: [],
837
+ type: Types::Function.empty(attr_type).update(
838
+ required_positionals: [
839
+ Types::Function::Param.new(type: attr_type, name: method.name.to_s.chomp("=").to_sym)
840
+ ]
841
+ ),
842
+ block: nil,
843
+ location: original.location
844
+ )
845
+ else
846
+ # getter
847
+ MethodType.new(
848
+ type_params: [],
849
+ type: Types::Function.empty(attr_type),
850
+ block: nil,
851
+ location: original.location
852
+ )
853
+ end
854
+
855
+ if implemented_in
856
+ super_method = existing_method
857
+ end
858
+
859
+ method_definition = Definition::Method.new(
860
+ super_method: super_method,
861
+ defs: [
862
+ Definition::Method::TypeDef.new(
863
+ type: method_type,
864
+ member: original,
865
+ defined_in: defined_in,
866
+ implemented_in: implemented_in
867
+ )
868
+ ],
869
+ accessibility: method.accessibility,
870
+ alias_of: nil,
871
+ alias_member: nil
872
+ )
873
+
874
+ method_definition.annotations.replace([])
875
+ when AST::Ruby::Members::DefMember
876
+ if duplicated_method = methods[method.name]
877
+ raise DuplicatedMethodDefinitionError.new(
878
+ type: definition.self_type,
879
+ method_name: method.name,
880
+ members: [original, *duplicated_method.members]
881
+ )
882
+ end
883
+
884
+ if original.method_type.empty? && existing_method
885
+ # Unannotated method with a parent definition → inherit from the parent, like @rbs ...
886
+ method_definition = Definition::Method.new(
887
+ super_method: existing_method,
888
+ defs: existing_method.defs.map { |defn| defn.update(implemented_in: implemented_in) },
889
+ accessibility: :public,
890
+ alias_of: existing_method.alias_of,
891
+ alias_member: nil
892
+ )
893
+
894
+ method_definition.annotations.replace(existing_method.annotations)
895
+ else
896
+ defs = original.overloads.map do |overload|
897
+ Definition::Method::TypeDef.new(
898
+ type: subst.empty? ? overload.method_type : overload.method_type.sub(subst),
899
+ member: original,
900
+ defined_in: defined_in,
901
+ implemented_in: implemented_in
902
+ ).tap do |type_def|
903
+ # Keep the original annotations given to overloads.
904
+ type_def.overload_annotations.replace(overload.annotations)
905
+ end
906
+ end
907
+
908
+ method_definition = Definition::Method.new(
909
+ super_method: existing_method,
910
+ defs: defs,
911
+ accessibility: :public,
912
+ alias_of: nil,
913
+ alias_member: nil
914
+ )
915
+
916
+ method_definition.annotations.replace([])
917
+ end
918
+
765
919
  when nil
766
920
  # Overloading method definition only
767
921
 
@@ -819,6 +973,12 @@ module RBS
819
973
  methods[method.name] = method_definition
820
974
  end
821
975
 
976
+ def special_accessibility(is_instance, method_name)
977
+ if is_instance && [:initialize, :initialize_copy, :initialize_clone, :initialize_dup, :respond_to_missing?].include?(method_name)
978
+ :private
979
+ end
980
+ end
981
+
822
982
  def try_cache(type_name, cache:)
823
983
  cache[type_name] ||= yield
824
984
  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,81 @@
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
+
68
+ def align_params(decl)
69
+ entry_params = type_params
70
+ decl_param_names = decl.type_params.map(&:name)
71
+
72
+ return nil if decl_param_names == entry_params.map(&:name)
73
+
74
+ Substitution.build(
75
+ decl_param_names,
76
+ entry_params.map {|param| Types::Variable.new(name: param.name, location: param.location) }
77
+ )
78
+ end
79
+ end
80
+ end
81
+ end
@@ -0,0 +1,91 @@
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
+ self_types = decl.self_types
46
+ subst = align_params(decl)
47
+
48
+ if self_types.empty? || subst.nil?
49
+ self_types
50
+ else
51
+ self_types.map do |self_type|
52
+ AST::Declarations::Module::Self.new(
53
+ name: self_type.name,
54
+ args: self_type.args.map {|type| type.sub(subst) },
55
+ location: self_type.location
56
+ )
57
+ end
58
+ end
59
+ end.uniq
60
+ end
61
+
62
+ def align_params(decl)
63
+ entry_params = type_params
64
+ decl_param_names = decl.type_params.map(&:name)
65
+
66
+ return nil if decl_param_names == entry_params.map(&:name)
67
+
68
+ Substitution.build(
69
+ decl_param_names,
70
+ entry_params.map {|param| Types::Variable.new(name: param.name, location: param.location) }
71
+ )
72
+ end
73
+
74
+ def validate_type_params
75
+ unless context_decls.empty?
76
+ first_decl, *rest_decls = each_decl.to_a
77
+ first_decl or raise
78
+
79
+ first_params = first_decl.type_params
80
+ first_names = first_params.map(&:name)
81
+ rest_decls.each do |other_decl|
82
+ other_params = other_decl.type_params
83
+ unless first_names.size == other_params.size && first_params == AST::TypeParam.rename(other_params, new_names: first_names)
84
+ raise GenericParameterMismatchError.new(name: name, decl: other_decl)
85
+ end
86
+ end
87
+ end
88
+ end
89
+ end
90
+ end
91
+ end