rbs 3.10.4 → 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 (267) hide show
  1. checksums.yaml +4 -4
  2. data/.github/dependabot.yml +14 -14
  3. data/.github/workflows/bundle-update.yml +60 -0
  4. data/.github/workflows/c-check.yml +7 -5
  5. data/.github/workflows/comments.yml +2 -2
  6. data/.github/workflows/dependabot.yml +2 -2
  7. data/.github/workflows/ruby.yml +16 -26
  8. data/.github/workflows/rust.yml +95 -0
  9. data/.github/workflows/typecheck.yml +1 -1
  10. data/.github/workflows/windows.yml +2 -2
  11. data/.rubocop.yml +2 -2
  12. data/.vscode/extensions.json +5 -0
  13. data/.vscode/settings.json +19 -0
  14. data/CHANGELOG.md +202 -2
  15. data/Rakefile +9 -23
  16. data/Steepfile +2 -0
  17. data/config.yml +457 -13
  18. data/core/array.rbs +218 -188
  19. data/core/basic_object.rbs +9 -8
  20. data/core/binding.rbs +0 -2
  21. data/core/builtin.rbs +2 -2
  22. data/core/class.rbs +6 -5
  23. data/core/comparable.rbs +45 -31
  24. data/core/complex.rbs +66 -55
  25. data/core/dir.rbs +57 -45
  26. data/core/encoding.rbs +6 -6
  27. data/core/enumerable.rbs +105 -91
  28. data/core/enumerator/arithmetic_sequence.rbs +70 -0
  29. data/core/enumerator.rbs +24 -3
  30. data/core/errno.rbs +3 -2
  31. data/core/errors.rbs +31 -29
  32. data/core/exception.rbs +12 -12
  33. data/core/fiber.rbs +47 -36
  34. data/core/file.rbs +242 -169
  35. data/core/file_test.rbs +2 -2
  36. data/core/float.rbs +42 -68
  37. data/core/gc.rbs +78 -70
  38. data/core/hash.rbs +70 -60
  39. data/core/integer.rbs +32 -75
  40. data/core/io/buffer.rbs +36 -36
  41. data/core/io/wait.rbs +7 -7
  42. data/core/io.rbs +192 -146
  43. data/core/kernel.rbs +198 -147
  44. data/core/marshal.rbs +3 -3
  45. data/core/match_data.rbs +14 -12
  46. data/core/math.rbs +69 -67
  47. data/core/method.rbs +6 -8
  48. data/core/module.rbs +148 -88
  49. data/core/nil_class.rbs +4 -3
  50. data/core/numeric.rbs +53 -50
  51. data/core/object.rbs +6 -8
  52. data/core/object_space.rbs +11 -10
  53. data/core/pathname.rbs +131 -81
  54. data/core/proc.rbs +65 -34
  55. data/core/process.rbs +221 -201
  56. data/core/ractor.rbs +15 -11
  57. data/core/random.rbs +21 -3
  58. data/core/range.rbs +152 -49
  59. data/core/rational.rbs +5 -56
  60. data/core/rbs/unnamed/argf.rbs +58 -51
  61. data/core/rbs/unnamed/env_class.rbs +18 -13
  62. data/core/rbs/unnamed/main_class.rbs +123 -0
  63. data/core/rbs/unnamed/random.rbs +7 -116
  64. data/core/regexp.rbs +236 -197
  65. data/core/ruby.rbs +1 -1
  66. data/core/ruby_vm.rbs +32 -30
  67. data/core/rubygems/config_file.rbs +5 -5
  68. data/core/rubygems/errors.rbs +1 -1
  69. data/core/rubygems/requirement.rbs +5 -5
  70. data/core/rubygems/rubygems.rbs +5 -3
  71. data/core/set.rbs +17 -16
  72. data/core/signal.rbs +2 -2
  73. data/core/string.rbs +318 -298
  74. data/core/struct.rbs +26 -25
  75. data/core/symbol.rbs +25 -24
  76. data/core/thread.rbs +40 -41
  77. data/core/time.rbs +47 -42
  78. data/core/trace_point.rbs +34 -31
  79. data/core/true_class.rbs +2 -2
  80. data/core/unbound_method.rbs +10 -10
  81. data/core/warning.rbs +7 -7
  82. data/docs/collection.md +1 -1
  83. data/docs/config.md +171 -0
  84. data/docs/inline.md +576 -0
  85. data/docs/syntax.md +46 -16
  86. data/docs/type_fingerprint.md +21 -0
  87. data/exe/rbs +1 -1
  88. data/ext/rbs_extension/ast_translation.c +595 -98
  89. data/ext/rbs_extension/class_constants.c +30 -0
  90. data/ext/rbs_extension/class_constants.h +15 -0
  91. data/ext/rbs_extension/legacy_location.c +30 -53
  92. data/ext/rbs_extension/legacy_location.h +37 -0
  93. data/ext/rbs_extension/main.c +125 -24
  94. data/include/rbs/ast.h +485 -150
  95. data/include/rbs/lexer.h +11 -4
  96. data/include/rbs/location.h +25 -44
  97. data/include/rbs/parser.h +20 -2
  98. data/include/rbs/util/rbs_constant_pool.h +0 -3
  99. data/include/rbs.h +8 -0
  100. data/lib/rbs/ast/annotation.rb +1 -1
  101. data/lib/rbs/ast/comment.rb +1 -1
  102. data/lib/rbs/ast/declarations.rb +10 -10
  103. data/lib/rbs/ast/members.rb +14 -14
  104. data/lib/rbs/ast/ruby/annotations.rb +409 -0
  105. data/lib/rbs/ast/ruby/comment_block.rb +245 -0
  106. data/lib/rbs/ast/ruby/declarations.rb +281 -0
  107. data/lib/rbs/ast/ruby/helpers/constant_helper.rb +28 -0
  108. data/lib/rbs/ast/ruby/helpers/location_helper.rb +15 -0
  109. data/lib/rbs/ast/ruby/members.rb +723 -0
  110. data/lib/rbs/ast/type_param.rb +24 -4
  111. data/lib/rbs/buffer.rb +105 -20
  112. data/lib/rbs/cli/diff.rb +16 -15
  113. data/lib/rbs/cli/validate.rb +62 -125
  114. data/lib/rbs/cli.rb +55 -23
  115. data/lib/rbs/collection/config/lockfile_generator.rb +8 -4
  116. data/lib/rbs/collection/sources/git.rb +1 -0
  117. data/lib/rbs/collection.rb +0 -1
  118. data/lib/rbs/definition.rb +6 -1
  119. data/lib/rbs/definition_builder/ancestor_builder.rb +119 -63
  120. data/lib/rbs/definition_builder/method_builder.rb +65 -30
  121. data/lib/rbs/definition_builder.rb +177 -20
  122. data/lib/rbs/diff.rb +7 -1
  123. data/lib/rbs/environment/class_entry.rb +69 -0
  124. data/lib/rbs/environment/module_entry.rb +66 -0
  125. data/lib/rbs/environment.rb +338 -155
  126. data/lib/rbs/environment_loader.rb +2 -2
  127. data/lib/rbs/errors.rb +30 -20
  128. data/lib/rbs/inline_parser/comment_association.rb +117 -0
  129. data/lib/rbs/inline_parser.rb +542 -0
  130. data/lib/rbs/location_aux.rb +36 -4
  131. data/lib/rbs/locator.rb +5 -1
  132. data/lib/rbs/method_type.rb +5 -3
  133. data/lib/rbs/namespace.rb +0 -7
  134. data/lib/rbs/parser_aux.rb +31 -8
  135. data/lib/rbs/prototype/helpers.rb +57 -0
  136. data/lib/rbs/prototype/rb.rb +3 -28
  137. data/lib/rbs/prototype/rbi.rb +3 -20
  138. data/lib/rbs/prototype/runtime.rb +10 -2
  139. data/lib/rbs/resolver/type_name_resolver.rb +0 -8
  140. data/lib/rbs/source.rb +99 -0
  141. data/lib/rbs/subtractor.rb +4 -3
  142. data/lib/rbs/test/type_check.rb +5 -2
  143. data/lib/rbs/type_name.rb +1 -8
  144. data/lib/rbs/types.rb +88 -78
  145. data/lib/rbs/unit_test/convertibles.rb +1 -0
  146. data/lib/rbs/unit_test/type_assertions.rb +35 -8
  147. data/lib/rbs/validator.rb +2 -2
  148. data/lib/rbs/version.rb +1 -1
  149. data/lib/rbs.rb +12 -1
  150. data/rbs.gemspec +3 -2
  151. data/rust/.gitignore +1 -0
  152. data/rust/Cargo.lock +378 -0
  153. data/rust/Cargo.toml +7 -0
  154. data/rust/ruby-rbs/Cargo.toml +22 -0
  155. data/rust/ruby-rbs/build.rs +764 -0
  156. data/rust/ruby-rbs/examples/locations.rs +60 -0
  157. data/rust/ruby-rbs/src/lib.rs +1 -0
  158. data/rust/ruby-rbs/src/node/mod.rs +742 -0
  159. data/rust/ruby-rbs/tests/sanity.rs +47 -0
  160. data/rust/ruby-rbs/vendor/rbs/config.yml +1 -0
  161. data/rust/ruby-rbs-sys/Cargo.toml +23 -0
  162. data/rust/ruby-rbs-sys/build.rs +204 -0
  163. data/rust/ruby-rbs-sys/src/lib.rs +50 -0
  164. data/rust/ruby-rbs-sys/vendor/rbs/include +1 -0
  165. data/rust/ruby-rbs-sys/vendor/rbs/src +1 -0
  166. data/rust/ruby-rbs-sys/wrapper.h +1 -0
  167. data/schema/typeParam.json +17 -1
  168. data/sig/ancestor_builder.rbs +1 -1
  169. data/sig/ast/ruby/annotations.rbs +421 -0
  170. data/sig/ast/ruby/comment_block.rbs +127 -0
  171. data/sig/ast/ruby/declarations.rbs +158 -0
  172. data/sig/ast/ruby/helpers/constant_helper.rbs +11 -0
  173. data/sig/ast/ruby/helpers/location_helper.rbs +15 -0
  174. data/sig/ast/ruby/members.rbs +178 -0
  175. data/sig/buffer.rbs +63 -5
  176. data/sig/cli/diff.rbs +5 -11
  177. data/sig/cli/validate.rbs +12 -8
  178. data/sig/cli.rbs +18 -18
  179. data/sig/definition.rbs +6 -0
  180. data/sig/definition_builder.rbs +3 -1
  181. data/sig/environment/class_entry.rbs +50 -0
  182. data/sig/environment/module_entry.rbs +50 -0
  183. data/sig/environment.rbs +37 -81
  184. data/sig/errors.rbs +26 -20
  185. data/sig/inline_parser/comment_association.rbs +71 -0
  186. data/sig/inline_parser.rbs +124 -0
  187. data/sig/location.rbs +32 -7
  188. data/sig/locator.rbs +0 -2
  189. data/sig/method_builder.rbs +9 -4
  190. data/sig/namespace.rbs +0 -5
  191. data/sig/parser.rbs +47 -13
  192. data/sig/prototype/helpers.rbs +2 -0
  193. data/sig/resolver/type_name_resolver.rbs +0 -3
  194. data/sig/source.rbs +48 -0
  195. data/sig/type_param.rbs +13 -8
  196. data/sig/typename.rbs +0 -5
  197. data/sig/types.rbs +6 -7
  198. data/sig/unit_test/spy.rbs +0 -8
  199. data/sig/unit_test/type_assertions.rbs +11 -0
  200. data/src/ast.c +491 -143
  201. data/src/lexer.c +1552 -1314
  202. data/src/lexer.re +7 -0
  203. data/src/lexstate.c +8 -1
  204. data/src/location.c +8 -48
  205. data/src/parser.c +1107 -409
  206. data/src/util/rbs_constant_pool.c +0 -4
  207. data/stdlib/bigdecimal/0/big_decimal.rbs +16 -16
  208. data/stdlib/cgi-escape/0/escape.rbs +4 -4
  209. data/stdlib/coverage/0/coverage.rbs +4 -3
  210. data/stdlib/date/0/date.rbs +33 -28
  211. data/stdlib/date/0/date_time.rbs +24 -23
  212. data/stdlib/did_you_mean/0/did_you_mean.rbs +17 -16
  213. data/stdlib/digest/0/digest.rbs +110 -0
  214. data/stdlib/erb/0/erb.rbs +64 -53
  215. data/stdlib/etc/0/etc.rbs +55 -50
  216. data/stdlib/fileutils/0/fileutils.rbs +140 -126
  217. data/stdlib/forwardable/0/forwardable.rbs +10 -10
  218. data/stdlib/io-console/0/io-console.rbs +2 -2
  219. data/stdlib/json/0/json.rbs +158 -131
  220. data/stdlib/monitor/0/monitor.rbs +3 -3
  221. data/stdlib/net-http/0/net-http.rbs +159 -134
  222. data/stdlib/objspace/0/objspace.rbs +8 -30
  223. data/stdlib/open-uri/0/open-uri.rbs +8 -8
  224. data/stdlib/open3/0/open3.rbs +469 -10
  225. data/stdlib/openssl/0/openssl.rbs +144 -129
  226. data/stdlib/optparse/0/optparse.rbs +23 -14
  227. data/stdlib/pathname/0/pathname.rbs +2 -2
  228. data/stdlib/pp/0/pp.rbs +9 -8
  229. data/stdlib/prettyprint/0/prettyprint.rbs +7 -7
  230. data/stdlib/pstore/0/pstore.rbs +35 -30
  231. data/stdlib/psych/0/psych.rbs +62 -9
  232. data/stdlib/psych/0/store.rbs +2 -4
  233. data/stdlib/pty/0/pty.rbs +9 -6
  234. data/stdlib/random-formatter/0/random-formatter.rbs +277 -0
  235. data/stdlib/rdoc/0/code_object.rbs +2 -1
  236. data/stdlib/rdoc/0/parser.rbs +1 -1
  237. data/stdlib/rdoc/0/store.rbs +1 -1
  238. data/stdlib/ripper/0/ripper.rbs +20 -17
  239. data/stdlib/securerandom/0/manifest.yaml +2 -0
  240. data/stdlib/securerandom/0/securerandom.rbs +7 -20
  241. data/stdlib/shellwords/0/shellwords.rbs +2 -2
  242. data/stdlib/socket/0/addrinfo.rbs +9 -9
  243. data/stdlib/socket/0/basic_socket.rbs +3 -3
  244. data/stdlib/socket/0/ip_socket.rbs +10 -8
  245. data/stdlib/socket/0/socket.rbs +10 -9
  246. data/stdlib/socket/0/tcp_server.rbs +1 -1
  247. data/stdlib/socket/0/tcp_socket.rbs +1 -1
  248. data/stdlib/socket/0/udp_socket.rbs +1 -1
  249. data/stdlib/socket/0/unix_server.rbs +1 -1
  250. data/stdlib/stringio/0/stringio.rbs +55 -54
  251. data/stdlib/strscan/0/string_scanner.rbs +46 -44
  252. data/stdlib/tempfile/0/tempfile.rbs +24 -20
  253. data/stdlib/time/0/time.rbs +7 -5
  254. data/stdlib/tsort/0/tsort.rbs +7 -6
  255. data/stdlib/uri/0/common.rbs +31 -18
  256. data/stdlib/uri/0/file.rbs +2 -2
  257. data/stdlib/uri/0/generic.rbs +9 -2
  258. data/stdlib/uri/0/http.rbs +2 -2
  259. data/stdlib/uri/0/ldap.rbs +2 -2
  260. data/stdlib/uri/0/mailto.rbs +3 -3
  261. data/stdlib/uri/0/rfc2396_parser.rbs +6 -5
  262. data/stdlib/zlib/0/deflate.rbs +4 -3
  263. data/stdlib/zlib/0/gzip_reader.rbs +6 -6
  264. data/stdlib/zlib/0/gzip_writer.rbs +14 -12
  265. data/stdlib/zlib/0/inflate.rbs +1 -1
  266. data/stdlib/zlib/0/need_dict.rbs +1 -1
  267. metadata +66 -3
@@ -103,37 +103,54 @@ 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
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
140
+ end
141
+ end
142
+ when AST::Ruby::Declarations::Base
143
+ decl.members.each do |member|
144
+ case member
145
+ when AST::Ruby::Members::DefMember
120
146
  build_method(
121
147
  methods,
122
148
  type,
123
- member: member.update(overloads: member.overloads.map {|overload| overload.sub(subst) }),
124
- accessibility: :private
149
+ member: member,
150
+ accessibility: :public
125
151
  )
126
- 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)
152
+ when AST::Ruby::Members::AttrReaderMember, AST::Ruby::Members::AttrWriterMember, AST::Ruby::Members::AttrAccessorMember
153
+ build_ruby_attribute(methods, type, member: member, accessibility: :public)
137
154
  end
138
155
  end
139
156
  end
@@ -149,8 +166,8 @@ module RBS
149
166
  type = Types::ClassSingleton.new(name: type_name, location: nil)
150
167
 
151
168
  Methods.new(type: type).tap do |methods|
152
- entry.decls.each do |d|
153
- d.decl.members.each do |member|
169
+ entry.each_decl do |decl|
170
+ decl.members.each do |member|
154
171
  case member
155
172
  when AST::Members::MethodDefinition
156
173
  if member.singleton?
@@ -212,6 +229,24 @@ module RBS
212
229
  end
213
230
  end
214
231
 
232
+ def build_ruby_attribute(methods, type, member:, accessibility:)
233
+ member.names.each do |name|
234
+ if member.is_a?(AST::Ruby::Members::AttrReaderMember) || member.is_a?(AST::Ruby::Members::AttrAccessorMember)
235
+ defn = methods.methods[name] ||= Methods::Definition.empty(type: type, name: name)
236
+
237
+ defn.accessibilities << accessibility
238
+ defn.originals << member
239
+ end
240
+
241
+ if member.is_a?(AST::Ruby::Members::AttrWriterMember) || member.is_a?(AST::Ruby::Members::AttrAccessorMember)
242
+ defn = methods.methods[:"#{name}="] ||= Methods::Definition.empty(type: type, name: :"#{name}=")
243
+
244
+ defn.accessibilities << accessibility
245
+ defn.originals << member
246
+ end
247
+ end
248
+ end
249
+
215
250
  def build_method(methods, type, member:, accessibility:)
216
251
  defn = methods.methods[member.name] ||= Methods::Definition.empty(type: type, name: member.name)
217
252
 
@@ -223,7 +258,7 @@ module RBS
223
258
  end
224
259
  end
225
260
 
226
- def each_member_with_accessibility(members, accessibility: :public)
261
+ def each_rbs_member_with_accessibility(members, accessibility: :public)
227
262
  members.each do |member|
228
263
  case member
229
264
  when AST::Members::Public
@@ -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