rbs 4.0.0.dev.4 → 4.0.0.dev.5

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 (223) 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 +11 -8
  5. data/.github/workflows/comments.yml +3 -3
  6. data/.github/workflows/dependabot.yml +1 -1
  7. data/.github/workflows/ruby.yml +17 -34
  8. data/.github/workflows/typecheck.yml +2 -2
  9. data/.github/workflows/valgrind.yml +42 -0
  10. data/.github/workflows/windows.yml +2 -2
  11. data/.rubocop.yml +1 -1
  12. data/README.md +1 -1
  13. data/Rakefile +32 -5
  14. data/config.yml +46 -0
  15. data/core/array.rbs +96 -46
  16. data/core/binding.rbs +0 -2
  17. data/core/builtin.rbs +2 -2
  18. data/core/comparable.rbs +13 -6
  19. data/core/complex.rbs +55 -41
  20. data/core/dir.rbs +4 -4
  21. data/core/encoding.rbs +7 -10
  22. data/core/enumerable.rbs +90 -3
  23. data/core/enumerator/arithmetic_sequence.rbs +70 -0
  24. data/core/enumerator.rbs +63 -1
  25. data/core/errno.rbs +8 -0
  26. data/core/errors.rbs +28 -1
  27. data/core/exception.rbs +2 -2
  28. data/core/fiber.rbs +40 -20
  29. data/core/file.rbs +108 -78
  30. data/core/file_test.rbs +1 -1
  31. data/core/float.rbs +225 -69
  32. data/core/gc.rbs +417 -281
  33. data/core/hash.rbs +1023 -727
  34. data/core/integer.rbs +104 -110
  35. data/core/io/buffer.rbs +21 -10
  36. data/core/io/wait.rbs +11 -33
  37. data/core/io.rbs +82 -19
  38. data/core/kernel.rbs +70 -59
  39. data/core/marshal.rbs +1 -1
  40. data/core/match_data.rbs +1 -1
  41. data/core/math.rbs +42 -3
  42. data/core/method.rbs +63 -27
  43. data/core/module.rbs +103 -26
  44. data/core/nil_class.rbs +3 -3
  45. data/core/numeric.rbs +43 -35
  46. data/core/object.rbs +3 -3
  47. data/core/object_space.rbs +21 -15
  48. data/core/pathname.rbs +1272 -0
  49. data/core/proc.rbs +30 -25
  50. data/core/process.rbs +4 -2
  51. data/core/ractor.rbs +361 -509
  52. data/core/random.rbs +17 -0
  53. data/core/range.rbs +113 -16
  54. data/core/rational.rbs +56 -85
  55. data/core/rbs/unnamed/argf.rbs +2 -2
  56. data/core/rbs/unnamed/env_class.rbs +1 -1
  57. data/core/rbs/unnamed/random.rbs +4 -113
  58. data/core/regexp.rbs +25 -20
  59. data/core/ruby.rbs +53 -0
  60. data/core/ruby_vm.rbs +6 -4
  61. data/core/rubygems/errors.rbs +3 -70
  62. data/core/rubygems/rubygems.rbs +11 -79
  63. data/core/rubygems/version.rbs +2 -3
  64. data/core/set.rbs +488 -359
  65. data/core/signal.rbs +24 -14
  66. data/core/string.rbs +3171 -1241
  67. data/core/struct.rbs +1 -1
  68. data/core/symbol.rbs +17 -11
  69. data/core/thread.rbs +95 -33
  70. data/core/time.rbs +35 -9
  71. data/core/trace_point.rbs +7 -4
  72. data/core/unbound_method.rbs +14 -6
  73. data/docs/aliases.md +79 -0
  74. data/docs/collection.md +2 -2
  75. data/docs/encoding.md +56 -0
  76. data/docs/gem.md +0 -1
  77. data/docs/inline.md +470 -0
  78. data/docs/sigs.md +3 -3
  79. data/docs/syntax.md +33 -4
  80. data/docs/type_fingerprint.md +21 -0
  81. data/exe/rbs +1 -1
  82. data/ext/rbs_extension/ast_translation.c +77 -3
  83. data/ext/rbs_extension/ast_translation.h +3 -0
  84. data/ext/rbs_extension/class_constants.c +8 -2
  85. data/ext/rbs_extension/class_constants.h +4 -0
  86. data/ext/rbs_extension/extconf.rb +5 -1
  87. data/ext/rbs_extension/legacy_location.c +5 -5
  88. data/ext/rbs_extension/main.c +37 -20
  89. data/include/rbs/ast.h +85 -38
  90. data/include/rbs/defines.h +27 -0
  91. data/include/rbs/lexer.h +30 -11
  92. data/include/rbs/parser.h +6 -6
  93. data/include/rbs/string.h +0 -2
  94. data/include/rbs/util/rbs_allocator.h +34 -13
  95. data/include/rbs/util/rbs_assert.h +12 -1
  96. data/include/rbs/util/rbs_encoding.h +2 -0
  97. data/include/rbs/util/rbs_unescape.h +2 -1
  98. data/lib/rbs/ast/annotation.rb +1 -1
  99. data/lib/rbs/ast/comment.rb +1 -1
  100. data/lib/rbs/ast/declarations.rb +10 -10
  101. data/lib/rbs/ast/members.rb +14 -14
  102. data/lib/rbs/ast/ruby/annotations.rb +137 -0
  103. data/lib/rbs/ast/ruby/comment_block.rb +24 -0
  104. data/lib/rbs/ast/ruby/declarations.rb +198 -3
  105. data/lib/rbs/ast/ruby/helpers/constant_helper.rb +4 -0
  106. data/lib/rbs/ast/ruby/members.rb +159 -1
  107. data/lib/rbs/ast/type_param.rb +24 -4
  108. data/lib/rbs/buffer.rb +20 -15
  109. data/lib/rbs/cli/diff.rb +16 -15
  110. data/lib/rbs/cli/validate.rb +38 -51
  111. data/lib/rbs/cli.rb +52 -19
  112. data/lib/rbs/collection/config/lockfile_generator.rb +8 -0
  113. data/lib/rbs/collection/sources/git.rb +1 -0
  114. data/lib/rbs/definition.rb +1 -1
  115. data/lib/rbs/definition_builder/ancestor_builder.rb +62 -9
  116. data/lib/rbs/definition_builder/method_builder.rb +20 -0
  117. data/lib/rbs/definition_builder.rb +91 -2
  118. data/lib/rbs/diff.rb +7 -1
  119. data/lib/rbs/environment.rb +227 -74
  120. data/lib/rbs/environment_loader.rb +0 -6
  121. data/lib/rbs/errors.rb +27 -7
  122. data/lib/rbs/inline_parser.rb +341 -5
  123. data/lib/rbs/location_aux.rb +1 -1
  124. data/lib/rbs/locator.rb +5 -1
  125. data/lib/rbs/method_type.rb +5 -3
  126. data/lib/rbs/parser_aux.rb +2 -2
  127. data/lib/rbs/prototype/rb.rb +2 -2
  128. data/lib/rbs/prototype/rbi.rb +2 -0
  129. data/lib/rbs/prototype/runtime.rb +8 -0
  130. data/lib/rbs/resolver/constant_resolver.rb +2 -2
  131. data/lib/rbs/resolver/type_name_resolver.rb +116 -38
  132. data/lib/rbs/subtractor.rb +3 -1
  133. data/lib/rbs/test/type_check.rb +16 -2
  134. data/lib/rbs/type_name.rb +1 -1
  135. data/lib/rbs/types.rb +27 -27
  136. data/lib/rbs/validator.rb +2 -2
  137. data/lib/rbs/version.rb +1 -1
  138. data/lib/rbs.rb +1 -1
  139. data/lib/rdoc/discover.rb +1 -1
  140. data/lib/rdoc_plugin/parser.rb +1 -1
  141. data/rbs.gemspec +3 -2
  142. data/schema/typeParam.json +17 -1
  143. data/sig/ast/ruby/annotations.rbs +124 -0
  144. data/sig/ast/ruby/comment_block.rbs +8 -0
  145. data/sig/ast/ruby/declarations.rbs +102 -4
  146. data/sig/ast/ruby/members.rbs +87 -1
  147. data/sig/cli/diff.rbs +5 -11
  148. data/sig/cli/validate.rbs +13 -4
  149. data/sig/cli.rbs +18 -18
  150. data/sig/definition.rbs +6 -1
  151. data/sig/environment.rbs +70 -12
  152. data/sig/errors.rbs +13 -6
  153. data/sig/inline_parser.rbs +39 -2
  154. data/sig/locator.rbs +0 -2
  155. data/sig/manifest.yaml +0 -1
  156. data/sig/method_builder.rbs +3 -1
  157. data/sig/method_types.rbs +1 -1
  158. data/sig/parser.rbs +16 -2
  159. data/sig/resolver/type_name_resolver.rbs +35 -7
  160. data/sig/source.rbs +3 -3
  161. data/sig/type_param.rbs +13 -8
  162. data/sig/types.rbs +4 -4
  163. data/src/ast.c +80 -1
  164. data/src/lexer.c +1392 -1313
  165. data/src/lexer.re +3 -0
  166. data/src/lexstate.c +58 -37
  167. data/src/location.c +4 -4
  168. data/src/parser.c +412 -145
  169. data/src/string.c +0 -48
  170. data/src/util/rbs_allocator.c +89 -71
  171. data/src/util/rbs_assert.c +1 -1
  172. data/src/util/rbs_buffer.c +2 -2
  173. data/src/util/rbs_constant_pool.c +10 -10
  174. data/src/util/rbs_encoding.c +4 -8
  175. data/src/util/rbs_unescape.c +56 -20
  176. data/stdlib/bigdecimal/0/big_decimal.rbs +100 -82
  177. data/stdlib/bigdecimal-math/0/big_math.rbs +169 -8
  178. data/stdlib/cgi/0/core.rbs +9 -393
  179. data/stdlib/cgi/0/manifest.yaml +1 -0
  180. data/stdlib/cgi-escape/0/escape.rbs +171 -0
  181. data/stdlib/coverage/0/coverage.rbs +3 -1
  182. data/stdlib/date/0/date.rbs +67 -59
  183. data/stdlib/date/0/date_time.rbs +1 -1
  184. data/stdlib/delegate/0/delegator.rbs +10 -7
  185. data/stdlib/digest/0/digest.rbs +110 -0
  186. data/stdlib/erb/0/erb.rbs +737 -347
  187. data/stdlib/fileutils/0/fileutils.rbs +20 -14
  188. data/stdlib/forwardable/0/forwardable.rbs +3 -0
  189. data/stdlib/json/0/json.rbs +82 -28
  190. data/stdlib/net-http/0/net-http.rbs +3 -0
  191. data/stdlib/objspace/0/objspace.rbs +9 -27
  192. data/stdlib/open-uri/0/open-uri.rbs +40 -0
  193. data/stdlib/open3/0/open3.rbs +459 -1
  194. data/stdlib/openssl/0/openssl.rbs +331 -228
  195. data/stdlib/optparse/0/optparse.rbs +8 -3
  196. data/stdlib/pathname/0/pathname.rbs +9 -1379
  197. data/stdlib/psych/0/psych.rbs +4 -4
  198. data/stdlib/random-formatter/0/random-formatter.rbs +277 -0
  199. data/stdlib/rdoc/0/code_object.rbs +2 -1
  200. data/stdlib/rdoc/0/parser.rbs +1 -1
  201. data/stdlib/rdoc/0/rdoc.rbs +1 -1
  202. data/stdlib/rdoc/0/store.rbs +1 -1
  203. data/stdlib/resolv/0/resolv.rbs +25 -68
  204. data/stdlib/ripper/0/ripper.rbs +2 -2
  205. data/stdlib/securerandom/0/manifest.yaml +2 -0
  206. data/stdlib/securerandom/0/securerandom.rbs +6 -19
  207. data/stdlib/singleton/0/singleton.rbs +3 -0
  208. data/stdlib/socket/0/socket.rbs +13 -1
  209. data/stdlib/socket/0/tcp_socket.rbs +10 -2
  210. data/stdlib/stringio/0/stringio.rbs +1176 -85
  211. data/stdlib/strscan/0/string_scanner.rbs +31 -31
  212. data/stdlib/tempfile/0/tempfile.rbs +3 -3
  213. data/stdlib/time/0/time.rbs +1 -1
  214. data/stdlib/timeout/0/timeout.rbs +63 -7
  215. data/stdlib/tsort/0/cyclic.rbs +3 -0
  216. data/stdlib/uri/0/common.rbs +16 -2
  217. data/stdlib/uri/0/file.rbs +1 -1
  218. data/stdlib/uri/0/generic.rbs +24 -16
  219. data/stdlib/uri/0/rfc2396_parser.rbs +6 -7
  220. data/stdlib/zlib/0/gzip_reader.rbs +2 -2
  221. data/stdlib/zlib/0/gzip_writer.rbs +1 -1
  222. data/stdlib/zlib/0/zstream.rbs +1 -0
  223. metadata +30 -4
data/sig/environment.rbs CHANGED
@@ -12,10 +12,10 @@ module RBS
12
12
  def initialize: (name: N, decl: D, context: Resolver::context) -> void
13
13
  end
14
14
 
15
- class ModuleAliasEntry < SingleEntry[TypeName, AST::Declarations::ModuleAlias]
15
+ class ModuleAliasEntry < SingleEntry[TypeName, AST::Declarations::ModuleAlias | AST::Ruby::Declarations::ClassModuleAliasDecl]
16
16
  end
17
17
 
18
- class ClassAliasEntry < SingleEntry[TypeName, AST::Declarations::ClassAlias]
18
+ class ClassAliasEntry < SingleEntry[TypeName, AST::Declarations::ClassAlias | AST::Ruby::Declarations::ClassModuleAliasDecl]
19
19
  end
20
20
 
21
21
  class InterfaceEntry < SingleEntry[TypeName, AST::Declarations::Interface]
@@ -24,7 +24,7 @@ module RBS
24
24
  class TypeAliasEntry < SingleEntry[TypeName, AST::Declarations::TypeAlias]
25
25
  end
26
26
 
27
- class ConstantEntry < SingleEntry[TypeName, AST::Declarations::Constant]
27
+ class ConstantEntry < SingleEntry[TypeName, AST::Declarations::Constant | AST::Ruby::Declarations::ConstantDecl]
28
28
  end
29
29
 
30
30
  class GlobalEntry < SingleEntry[Symbol, AST::Declarations::Global]
@@ -84,9 +84,15 @@ module RBS
84
84
  # When `only` is given, it skips other _top-level_ declarations not included in the collection.
85
85
  # This helps running resolution faster in the case of _partial updates_.
86
86
  #
87
- def resolve_type_names: (?only: Set[AST::Declarations::t]?) -> Environment
87
+ def resolve_type_names: (?only: Set[AST::Declarations::t | AST::Ruby::Declarations::t]?) -> Environment
88
88
 
89
- def resolve_signature: (Resolver::TypeNameResolver, UseMap::Table, Array[AST::Directives::t], Array[AST::Declarations::t], ?only: Set[AST::Declarations::t]?) -> [Array[AST::Directives::t], Array[AST::Declarations::t]]
89
+ def resolve_signature: (
90
+ Resolver::TypeNameResolver,
91
+ UseMap::Table,
92
+ Array[AST::Directives::t],
93
+ Array[AST::Declarations::t],
94
+ ?only: Set[AST::Declarations::t | AST::Ruby::Declarations::t]?
95
+ ) -> [Array[AST::Directives::t], Array[AST::Declarations::t]]
90
96
 
91
97
  def inspect: () -> String
92
98
 
@@ -94,7 +100,8 @@ module RBS
94
100
 
95
101
  # Remove declarations and directives that are loaded from `buffers`
96
102
  #
97
- def unload: (Set[Buffer] buffers) -> Environment
103
+ def unload: (Set[Pathname] paths) -> Environment
104
+ | %a{deprecated: Use pathname version} (Set[Buffer] buffers) -> Environment
98
105
 
99
106
  # Returns true if an interface with the type name is defined
100
107
  #
@@ -135,22 +142,58 @@ module RBS
135
142
  # Returns true if the type name is a class alias
136
143
  def class_alias?: (TypeName) -> bool
137
144
 
138
- def class_entry: (TypeName) -> (ClassEntry | ClassAliasEntry | nil)
145
+ # Returns the entry for the class name
146
+ #
147
+ # Returns `nil` when:
148
+ #
149
+ # * The type name is not found
150
+ # * The type name is not a class
151
+ #
152
+ # It normalizes when `normalized: true` is given -- returns `ClassEntry` or `nil`.
153
+ #
154
+ def class_entry: (TypeName, normalized: true) -> ClassEntry?
155
+ | (TypeName, ?normalized: bool) -> (ClassEntry | ClassAliasEntry | nil)
139
156
 
140
157
  # Returns ClassEntry if the class definition is found, normalized in case of alias
141
158
  #
159
+ %a{deprecated: Use `class_entry(type_name, normalized: true)` instead. }
142
160
  def normalized_class_entry: (TypeName) -> ClassEntry?
143
161
 
144
- def module_entry: (TypeName) -> (ModuleEntry | ModuleAliasEntry | nil)
162
+ # Returns the entry for the module name
163
+ #
164
+ # Returns `nil` when:
165
+ #
166
+ # * The type name is not found
167
+ # * The type name is not a module
168
+ #
169
+ # It normalizes when `normalized: true` is given -- returns `ModuleEntry` or `nil`.
170
+ #
171
+ def module_entry: (TypeName, normalized: true) -> ModuleEntry?
172
+ | (TypeName, ?normalized: bool) -> (ModuleEntry | ModuleAliasEntry | nil)
145
173
 
146
174
  # Returns ModuleEntry if the module definition is found, normalized in case of alias
147
175
  #
176
+ %a{deprecated: Use `module_entry(type_name, normalized: true)` instead. }
148
177
  def normalized_module_entry: (TypeName) -> ModuleEntry?
149
178
 
150
- def constant_entry: (TypeName) -> (ClassEntry | ClassAliasEntry | ModuleEntry | ModuleAliasEntry | ConstantEntry | nil)
179
+ # Returns the entry for the type name
180
+ #
181
+ # The entry is one of ClassEntry, ModuleEntry, ConstantEntry, ClassAliasEntry, or ModuleAliasEntry.
182
+ # When `normalized: true` is given, it returns normalized entry -- one of ClassEntry, ModuleEntry, or ConstantEntry.
183
+ #
184
+ # Returns `nil` if not found.
185
+ #
186
+ def constant_entry: (TypeName, normalized: true) -> (ClassEntry | ModuleEntry | ConstantEntry | nil)
187
+ | (TypeName, ?normalized: bool) -> (ClassEntry | ClassAliasEntry | ModuleEntry | ModuleAliasEntry | ConstantEntry | nil)
151
188
 
152
- def module_class_entry: (TypeName) -> (ClassEntry | ClassAliasEntry | ModuleEntry | ModuleAliasEntry | nil)
189
+ # Returns ClassEntry or ModuleEntry if the class/module definition is found
190
+ #
191
+ # Normalizes when `normalized: true` is given.
192
+ #
193
+ def module_class_entry: (TypeName, normalized: true) -> (ClassEntry | ModuleEntry | nil)
194
+ | (TypeName, ?normalized: bool) -> (ClassEntry | ClassAliasEntry | ModuleEntry | ModuleAliasEntry | nil)
153
195
 
196
+ %a{deprecated: Use `module_class_entry(type_name, normalized: true)` instead. }
154
197
  def normalized_module_class_entry: (TypeName) -> (ClassEntry | ModuleEntry | nil)
155
198
 
156
199
  @normalize_module_name_cache: Hash[TypeName, TypeName | false | nil]
@@ -161,26 +204,39 @@ module RBS
161
204
  # * Returns `nil` if the rhs name cannot be found
162
205
  # * Returns `false` if the name is cyclic
163
206
  #
207
+ # Note that this method assumes the declarations have resolved type names.
208
+ #
164
209
  def normalize_module_name?: (TypeName) -> (TypeName | nil | false)
165
210
 
166
- # Returns the original module name that is defined with `module` declaration
211
+ # Returns the original module name that is defined with `module`/`class` declaration
167
212
  #
168
- # * Raises an error if given type name is not module
213
+ # * Raises an error if given type name is not module/class
169
214
  # * Calls `#absolute!` for relative module names
170
215
  # * Returns the name itself if the name cannot be normalized to a class/module
171
216
  #
217
+ # Note that this method assumes the declarations have resolved type names.
218
+ #
172
219
  def normalize_module_name: (TypeName) -> TypeName
173
220
 
221
+ # Returns the original module name that is defined with `module`/`class` declaration
222
+ #
223
+ # * Raises an error if given type name is not a module/class
224
+ def normalize_module_name!: (TypeName) -> TypeName
225
+
174
226
  # Returns a normalized module/class name or a type name with a normalized namespace
175
227
  #
176
228
  # * Calls `#absolute!` for relative module names
177
229
  # * Returns `nil` if the typename cannot be found
178
230
  # * Returns `false` if the name is cyclic
179
231
  #
232
+ # Note that this method assumes the declarations have resolved type names.
233
+ #
180
234
  def normalize_type_name?: (TypeName) -> (TypeName | nil | false)
181
235
 
182
236
  # Normalize the type name or raises an error
183
237
  #
238
+ # Note that this method assumes the declarations have resolved type names.
239
+ #
184
240
  def normalize_type_name!: (TypeName) -> TypeName
185
241
 
186
242
  # Returns a normalized module/class name or a type name with a normalized namespace
@@ -188,6 +244,8 @@ module RBS
188
244
  # * Calls `#absolute!` for relative module names
189
245
  # * Returns the typename itself if the name cannot be normalized
190
246
  #
247
+ # Note that this method assumes the declarations have resolved type names.
248
+ #
191
249
  def normalize_type_name: (TypeName) -> TypeName
192
250
 
193
251
  # Returns `true` if given type name is normalized
data/sig/errors.rbs CHANGED
@@ -115,14 +115,16 @@ module RBS
115
115
  class NoMixinFoundError < DefinitionError
116
116
  include DetailedMessageable
117
117
 
118
+ type member = AST::Members::t | AST::Ruby::Members::IncludeMember | AST::Ruby::Members::ExtendMember | AST::Ruby::Members::PrependMember
119
+
118
120
  attr_reader type_name: TypeName
119
- attr_reader member: AST::Members::t
121
+ attr_reader member: member
120
122
 
121
- def initialize: (type_name: TypeName, member: AST::Members::t) -> void
123
+ def initialize: (type_name: TypeName, member: member) -> void
122
124
 
123
125
  def location: () -> Location[untyped, untyped]?
124
126
 
125
- def self.check!: (TypeName, env: Environment, member: AST::Members::t) -> void
127
+ def self.check!: (TypeName, env: Environment, member: member) -> void
126
128
  end
127
129
 
128
130
  class DuplicatedMethodDefinitionError < DefinitionError
@@ -287,6 +289,7 @@ module RBS
287
289
  include DetailedMessageable
288
290
 
289
291
  type member = AST::Members::Include | AST::Members::Prepend | AST::Members::Extend
292
+ | AST::Ruby::Members::IncludeMember | AST::Ruby::Members::PrependMember | AST::Ruby::Members::ExtendMember
290
293
 
291
294
  attr_reader type_name: TypeName
292
295
  attr_reader member: member
@@ -297,17 +300,21 @@ module RBS
297
300
 
298
301
  def self.check!: (type_name: TypeName, env: Environment, member: member) -> void
299
302
 
303
+ def member_name: (member) -> TypeName
304
+
300
305
  def mixin_name: () -> String
301
306
  end
302
307
 
303
308
  # InheritModuleError is raised if a class definition inherits a module (not a class)
304
309
  #
305
310
  class InheritModuleError < DefinitionError
311
+ type super_class = AST::Declarations::Class::Super | AST::Ruby::Declarations::ClassDecl::SuperClass
312
+
306
313
  include DetailedMessageable
307
314
 
308
- attr_reader super_decl: AST::Declarations::Class::Super
315
+ attr_reader super_decl: super_class
309
316
 
310
- def initialize: (AST::Declarations::Class::Super) -> void
317
+ def initialize: (super_class) -> void
311
318
 
312
319
  def location: () -> Location[untyped, untyped]?
313
320
 
@@ -315,7 +322,7 @@ module RBS
315
322
  #
316
323
  # Automatically normalize the name of super.
317
324
  #
318
- def self.check!: (AST::Declarations::Class::Super, env: Environment) -> void
325
+ def self.check!: (super_class, env: Environment) -> void
319
326
  end
320
327
 
321
328
  class RecursiveTypeAliasError < BaseError
@@ -9,6 +9,8 @@ module RBS
9
9
  attr_reader diagnostics: Array[Diagnostic::t]
10
10
 
11
11
  def initialize: (Buffer, Prism::ParseResult) -> void
12
+
13
+ def type_fingerprint: () -> untyped
12
14
  end
13
15
 
14
16
  module Diagnostic
@@ -29,19 +31,44 @@ module RBS
29
31
  class NonConstantModuleName < Base
30
32
  end
31
33
 
34
+ class NonConstantSuperClassName < Base
35
+ end
36
+
32
37
  class TopLevelMethodDefinition < Base
33
38
  end
34
39
 
40
+ class TopLevelAttributeDefinition < Base
41
+ end
42
+
35
43
  class UnusedInlineAnnotation < Base
36
44
  end
37
45
 
38
46
  class AnnotationSyntaxError < Base
39
47
  end
40
48
 
49
+ class MixinMultipleArguments < Base
50
+ end
51
+
52
+ class MixinNonConstantModule < Base
53
+ end
54
+
55
+ class AttributeNonSymbolName < Base
56
+ end
57
+
58
+ class NonConstantConstantDeclaration < Base
59
+ end
60
+
61
+ class ClassModuleAliasDeclarationMissingTypeName < Base
62
+ end
63
+
41
64
  type t = NotImplementedYet
42
- | NonConstantClassName | NonConstantModuleName
43
- | TopLevelMethodDefinition
65
+ | NonConstantClassName | NonConstantModuleName | NonConstantSuperClassName
66
+ | TopLevelMethodDefinition | TopLevelAttributeDefinition
44
67
  | UnusedInlineAnnotation | AnnotationSyntaxError
68
+ | MixinMultipleArguments | MixinNonConstantModule
69
+ | AttributeNonSymbolName
70
+ | NonConstantConstantDeclaration
71
+ | ClassModuleAliasDeclarationMissingTypeName
45
72
  end
46
73
 
47
74
  def self.parse: (Buffer, Prism::ParseResult) -> Result
@@ -82,6 +109,16 @@ module RBS
82
109
  def report_unused_annotation: (*AST::Ruby::Annotations::t | nil | AST::Ruby::CommentBlock::AnnotationSyntaxError) -> void
83
110
 
84
111
  def report_unused_block: (AST::Ruby::CommentBlock) -> void
112
+
113
+ private
114
+
115
+ def parse_mixin_call: (Prism::CallNode) -> void
116
+
117
+ def parse_attribute_call: (Prism::CallNode) -> void
118
+
119
+ def parse_constant_declaration: (Prism::ConstantWriteNode | Prism::ConstantPathWriteNode) -> void
120
+
121
+ def parse_super_class: (Prism::node, Prism::Location) -> Declarations::ClassDecl::SuperClass?
85
122
  end
86
123
  end
87
124
  end
data/sig/locator.rbs CHANGED
@@ -37,8 +37,6 @@ module RBS
37
37
  #
38
38
  def find2: (line: Integer, column: Integer) -> [Symbol?, Array[component]]?
39
39
 
40
- private
41
-
42
40
  def find_in_directive: (Integer pos, AST::Directives::t, Array[component]) -> bool
43
41
 
44
42
  def find_in_decl: (Integer pos, decl: AST::Declarations::t, array: Array[component]) -> bool
data/sig/manifest.yaml CHANGED
@@ -1,6 +1,5 @@
1
1
  dependencies:
2
2
  - name: logger
3
- - name: pathname
4
3
  - name: json
5
4
  - name: optparse
6
5
  - name: tsort
@@ -16,7 +16,7 @@ module RBS
16
16
  #
17
17
  class Definition
18
18
  type original = AST::Members::MethodDefinition | AST::Members::Alias | AST::Members::AttrAccessor | AST::Members::AttrWriter | AST::Members::AttrReader
19
- | AST::Ruby::Members::DefMember
19
+ | AST::Ruby::Members::DefMember | AST::Ruby::Members::AttrReaderMember | AST::Ruby::Members::AttrWriterMember | AST::Ruby::Members::AttrAccessorMember
20
20
 
21
21
  type overloading_definition = AST::Members::MethodDefinition | AST::Ruby::Members::DefMember
22
22
 
@@ -77,6 +77,8 @@ module RBS
77
77
 
78
78
  def build_attribute: (Methods, Methods::instance_type, member: AST::Members::AttrAccessor | AST::Members::AttrReader | AST::Members::AttrWriter, accessibility: Definition::accessibility) -> void
79
79
 
80
+ def build_ruby_attribute: (Methods, Methods::instance_type, member: AST::Ruby::Members::AttrReaderMember | AST::Ruby::Members::AttrWriterMember | AST::Ruby::Members::AttrAccessorMember, accessibility: Definition::accessibility) -> void
81
+
80
82
  def build_method: (Methods, Methods::instance_type, member: AST::Members::MethodDefinition | AST::Ruby::Members::DefMember, accessibility: Definition::accessibility) -> void
81
83
 
82
84
  def each_rbs_member_with_accessibility: (Array[AST::Members::t | AST::Declarations::t], ?accessibility: Definition::accessibility) { (AST::Members::t | AST::Declarations::t, Definition::accessibility) -> void } -> void
data/sig/method_types.rbs CHANGED
@@ -53,6 +53,6 @@ module RBS
53
53
 
54
54
  def has_classish_type?: () -> bool
55
55
 
56
- def with_nonreturn_void?: () -> bool
56
+ %a{deprecated} def with_nonreturn_void?: () -> bool
57
57
  end
58
58
  end
data/sig/parser.rbs CHANGED
@@ -62,7 +62,21 @@ module RBS
62
62
  # RBS::Parser.parse_type("", require_eof: true) # => nil
63
63
  # ```
64
64
  #
65
- def self.parse_type: (Buffer | String, ?range: Range[Integer?], ?variables: Array[Symbol], ?require_eof: bool) -> Types::t?
65
+ # The `void_allowed` keyword controls whether `void` is allowed as a type.
66
+ #
67
+ # ```ruby
68
+ # RBS::Parser.parse_type("void", void_allowed: true) # => `void`
69
+ # RBS::Parser.parse_type("void", void_allowed: false) # => Raises an syntax error
70
+ # ```
71
+ #
72
+ # The `self_allowed` keyword controls whether `self` is allowed as a type.
73
+ #
74
+ # ```ruby
75
+ # RBS::Parser.parse_type("self", self_allowed: true) # => `self`
76
+ # RBS::Parser.parse_type("self", self_allowed: false) # => Raises an syntax error
77
+ # ```
78
+ #
79
+ def self.parse_type: (Buffer | String, ?range: Range[Integer?], ?variables: Array[Symbol], ?require_eof: bool, ?void_allowed: bool, ?self_allowed: bool) -> Types::t?
66
80
 
67
81
  # Parse whole RBS file and return an array of declarations
68
82
  #
@@ -116,7 +130,7 @@ module RBS
116
130
 
117
131
  def self.buffer: (String | Buffer source) -> Buffer
118
132
 
119
- def self._parse_type: (Buffer, Integer start_pos, Integer end_pos, Array[Symbol] variables, bool require_eof) -> Types::t?
133
+ def self._parse_type: (Buffer, Integer start_pos, Integer end_pos, Array[Symbol] variables, bool require_eof, bool void_allowed, bool self_allowed) -> Types::t?
120
134
 
121
135
  def self._parse_method_type: (Buffer, Integer start_pos, Integer end_pos, Array[Symbol] variables, bool require_eof) -> MethodType?
122
136
 
@@ -8,28 +8,56 @@ module RBS
8
8
  class TypeNameResolver
9
9
  type query = [TypeName, context]
10
10
 
11
- def initialize: (Environment) -> void
11
+ def initialize: (Set[TypeName] all_names, Hash[TypeName, [TypeName, context]] aliases) -> void
12
12
 
13
- # Translates given type name to absolute type name.
13
+ def self.build: (Environment) -> instance
14
+
15
+ # Translates given type name to absolute type name
16
+ #
14
17
  # Returns `nil` if cannot find associated type name.
18
+ # Module names in the type name are normalized.
15
19
  #
16
20
  def resolve: (TypeName, context: context) -> TypeName?
17
21
 
18
- private
22
+ # Translates given type name to absolute type name
23
+ #
24
+ # Returns `false` if a cycle is detected while resolving aliases.
25
+ # Returns `nil` if the type name cannot be resolved.
26
+ #
27
+ def resolve_namespace: (TypeName, context: context) -> (TypeName | false | nil)
19
28
 
20
- attr_reader env: Environment
29
+ private
21
30
 
22
31
  attr_reader all_names: Set[TypeName]
23
32
 
33
+ attr_reader aliases: Hash[TypeName, [TypeName, context]]
34
+
24
35
  attr_reader cache: Hash[query, TypeName?]
25
36
 
26
- def has_name?: (TypeName) -> TypeName?
37
+ # Returns the type name if it exists in `all_names` (normalized)
38
+ #
39
+ def has_type_name?: (TypeName) -> TypeName?
40
+
41
+ # Returns the type name if it is an alias (not normalized)
42
+ #
43
+ def aliased_name?: (TypeName) -> TypeName?
27
44
 
28
45
  def try_cache: (query) { () -> TypeName? } -> TypeName?
29
46
 
30
- def resolve_in: (Symbol, context) -> TypeName?
47
+ # Translates the head module name in the context and returns an absolute type name
48
+ #
49
+ # Returns `nil` if cannot find associated type name.
50
+ # The returned namespace may be an alias
51
+ #
52
+ def resolve_head_namespace: (Symbol, context) -> TypeName?
53
+
54
+ # Resolves the type name in the given context
55
+ #
56
+ def resolve_type_name: (Symbol, context) -> TypeName?
57
+
58
+ def resolve_namespace0: (TypeName, context, Set[TypeName]) -> (TypeName | false | nil)
31
59
 
32
- def partition: (TypeName) -> [Symbol, TypeName?]
60
+ def normalize_namespace: (TypeName, TypeName rhs, context, Set[TypeName]) -> (TypeName | false | nil)
33
61
  end
34
62
  end
35
63
  end
data/sig/source.rbs CHANGED
@@ -1,7 +1,7 @@
1
1
  module RBS
2
2
  module Source
3
3
  type t = RBS | Ruby
4
-
4
+
5
5
  class RBS
6
6
  attr_reader buffer: Buffer
7
7
 
@@ -28,9 +28,9 @@ module RBS
28
28
 
29
29
  attr_reader declarations: Array[AST::Ruby::Declarations::t]
30
30
 
31
- attr_reader diagnostics: Array[untyped]
31
+ attr_reader diagnostics: Array[InlineParser::Diagnostic::t]
32
32
 
33
- def initialize: (Buffer, Prism::ParseResult, Array[AST::Ruby::Declarations::t], Array[untyped]) -> void
33
+ def initialize: (Buffer, Prism::ParseResult, Array[AST::Ruby::Declarations::t], Array[InlineParser::Diagnostic::t]) -> void
34
34
 
35
35
  def each_type_name: () { (TypeName) -> void } -> void
36
36
  | () -> Enumerator[TypeName]
data/sig/type_param.rbs CHANGED
@@ -4,13 +4,14 @@ module RBS
4
4
  # Key
5
5
  # ^^^ name
6
6
  #
7
- # unchecked out Elem < _ToJson = untyped
8
- # ^^^^^^^^^ unchecked
9
- # ^^^ variance
10
- # ^^^^ name
11
- # ^^^^^^^^^ upper_bound
12
- # ^^^^^^^^^ default
13
- type loc = Location[:name, :variance | :unchecked | :upper_bound | :default]
7
+ # unchecked out Elem < _ToJson > bot = untyped
8
+ # ^^^^^^^^^ unchecked
9
+ # ^^^ variance
10
+ # ^^^^ name
11
+ # ^^^^^^^^^ upper_bound
12
+ # ^^^^^ lower_bound
13
+ # ^^^^^^^^ default
14
+ type loc = Location[:name, :variance | :unchecked | :upper_bound | :lower_bound | :default]
14
15
 
15
16
  type variance = :invariant | :covariant | :contravariant
16
17
 
@@ -24,9 +25,13 @@ module RBS
24
25
 
25
26
  attr_reader upper_bound_type: Types::t?
26
27
 
28
+ %a{pure} def lower_bound: () -> bound?
29
+
30
+ attr_reader lower_bound_type: Types::t?
31
+
27
32
  attr_reader default_type: Types::t?
28
33
 
29
- def initialize: (name: Symbol, variance: variance, upper_bound: Types::t?, location: loc?, ?default_type: Types::t?, ?unchecked: bool) -> void
34
+ def initialize: (name: Symbol, variance: variance, upper_bound: Types::t?, lower_bound: Types::t?, location: loc?, ?default_type: Types::t?, ?unchecked: bool) -> void
30
35
 
31
36
  include _ToJson
32
37
 
data/sig/types.rbs CHANGED
@@ -54,7 +54,7 @@ module RBS
54
54
  # * The function return type is a return position (`() -> void`)
55
55
  # * Generic parameter is a return position (`Enumerator[Integer, void]`)
56
56
  #
57
- def with_nonreturn_void?: () -> bool
57
+ %a{deprecated} def with_nonreturn_void?: () -> bool
58
58
  end
59
59
 
60
60
  # t represents union of all possible types.
@@ -213,7 +213,7 @@ module RBS
213
213
 
214
214
  def has_classish_type?: () -> bool
215
215
 
216
- def with_nonreturn_void?: () -> bool
216
+ %a{deprecated} def with_nonreturn_void?: () -> bool
217
217
  end
218
218
 
219
219
  class Interface
@@ -452,7 +452,7 @@ module RBS
452
452
 
453
453
  def has_classish_type?: () -> bool
454
454
 
455
- def with_nonreturn_void?: () -> bool
455
+ %a{deprecated} def with_nonreturn_void?: () -> bool
456
456
 
457
457
  def ==: (untyped) -> bool
458
458
 
@@ -495,7 +495,7 @@ module RBS
495
495
 
496
496
  def has_classish_type?: () -> bool
497
497
 
498
- def with_nonreturn_void?: () -> bool
498
+ %a{deprecated} def with_nonreturn_void?: () -> bool
499
499
 
500
500
  # Returns `?`
501
501
  def param_to_s: () -> String