rbs 1.5.1 → 1.7.0.beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (88) hide show
  1. checksums.yaml +4 -4
  2. data/.github/dependabot.yml +10 -0
  3. data/.github/workflows/ruby.yml +0 -4
  4. data/.gitignore +1 -0
  5. data/CHANGELOG.md +51 -0
  6. data/Gemfile +2 -0
  7. data/Rakefile +7 -22
  8. data/Steepfile +9 -1
  9. data/core/enumerator.rbs +1 -0
  10. data/core/io.rbs +3 -1
  11. data/core/kernel.rbs +4 -4
  12. data/core/trace_point.rbs +1 -1
  13. data/docs/collection.md +116 -0
  14. data/ext/rbs/extension/constants.c +140 -0
  15. data/ext/rbs/extension/constants.h +72 -0
  16. data/ext/rbs/extension/extconf.rb +3 -0
  17. data/ext/rbs/extension/lexer.c +1070 -0
  18. data/ext/rbs/extension/lexer.h +145 -0
  19. data/ext/rbs/extension/location.c +295 -0
  20. data/ext/rbs/extension/location.h +59 -0
  21. data/ext/rbs/extension/main.c +9 -0
  22. data/ext/rbs/extension/parser.c +2418 -0
  23. data/ext/rbs/extension/parser.h +23 -0
  24. data/ext/rbs/extension/parserstate.c +313 -0
  25. data/ext/rbs/extension/parserstate.h +141 -0
  26. data/ext/rbs/extension/rbs_extension.h +40 -0
  27. data/ext/rbs/extension/ruby_objs.c +585 -0
  28. data/ext/rbs/extension/ruby_objs.h +46 -0
  29. data/ext/rbs/extension/unescape.c +65 -0
  30. data/goodcheck.yml +1 -1
  31. data/lib/rbs/ast/comment.rb +0 -12
  32. data/lib/rbs/buffer.rb +4 -0
  33. data/lib/rbs/builtin_names.rb +1 -0
  34. data/lib/rbs/cli.rb +98 -10
  35. data/lib/rbs/collection/cleaner.rb +29 -0
  36. data/lib/rbs/collection/config/lockfile_generator.rb +95 -0
  37. data/lib/rbs/collection/config.rb +85 -0
  38. data/lib/rbs/collection/installer.rb +27 -0
  39. data/lib/rbs/collection/sources/git.rb +162 -0
  40. data/lib/rbs/collection/sources/rubygems.rb +40 -0
  41. data/lib/rbs/collection/sources/stdlib.rb +38 -0
  42. data/lib/rbs/collection/sources.rb +22 -0
  43. data/lib/rbs/collection.rb +13 -0
  44. data/lib/rbs/environment_loader.rb +12 -0
  45. data/lib/rbs/errors.rb +16 -1
  46. data/lib/rbs/location.rb +221 -217
  47. data/lib/rbs/location_aux.rb +108 -0
  48. data/lib/rbs/locator.rb +10 -7
  49. data/lib/rbs/parser_aux.rb +24 -0
  50. data/lib/rbs/repository.rb +13 -7
  51. data/lib/rbs/types.rb +2 -3
  52. data/lib/rbs/validator.rb +4 -1
  53. data/lib/rbs/version.rb +1 -1
  54. data/lib/rbs/writer.rb +4 -2
  55. data/lib/rbs.rb +4 -7
  56. data/rbs.gemspec +2 -1
  57. data/sig/ancestor_builder.rbs +2 -2
  58. data/sig/annotation.rbs +2 -2
  59. data/sig/builtin_names.rbs +1 -0
  60. data/sig/cli.rbs +5 -0
  61. data/sig/collection/cleaner.rbs +13 -0
  62. data/sig/collection/collections.rbs +112 -0
  63. data/sig/collection/config.rbs +69 -0
  64. data/sig/collection/installer.rbs +15 -0
  65. data/sig/collection.rbs +4 -0
  66. data/sig/comment.rbs +7 -7
  67. data/sig/constant_table.rbs +1 -1
  68. data/sig/declarations.rbs +9 -9
  69. data/sig/definition.rbs +1 -1
  70. data/sig/definition_builder.rbs +2 -2
  71. data/sig/environment_loader.rbs +3 -0
  72. data/sig/errors.rbs +30 -25
  73. data/sig/location.rbs +42 -79
  74. data/sig/locator.rbs +2 -2
  75. data/sig/members.rbs +7 -7
  76. data/sig/method_types.rbs +3 -3
  77. data/sig/parser.rbs +11 -21
  78. data/sig/polyfill.rbs +12 -3
  79. data/sig/repository.rbs +4 -0
  80. data/sig/types.rbs +45 -27
  81. data/sig/writer.rbs +1 -1
  82. data/stdlib/json/0/json.rbs +3 -3
  83. data/stdlib/objspace/0/objspace.rbs +406 -0
  84. data/stdlib/openssl/0/openssl.rbs +1 -1
  85. data/stdlib/tempfile/0/tempfile.rbs +270 -0
  86. data/steep/Gemfile.lock +10 -10
  87. metadata +43 -7
  88. data/lib/rbs/parser.rb +0 -3614
data/sig/locator.rbs CHANGED
@@ -37,8 +37,8 @@ module RBS
37
37
 
38
38
  def find_in_type: (Integer pos, type: Types::t, array: Array[component]) -> bool
39
39
 
40
- def find_in_loc: (Integer pos, location: Location::WithChildren[untyped, untyped] | Location | nil, array: Array[component]) -> bool
40
+ def find_in_loc: (Integer pos, location: Location[untyped, untyped]?, array: Array[component]) -> bool
41
41
 
42
- def test_loc: (Integer pos, location: Location?) -> bool
42
+ def test_loc: (Integer pos, location: Location[untyped, untyped]?) -> bool
43
43
  end
44
44
  end
data/sig/members.rbs CHANGED
@@ -25,7 +25,7 @@ module RBS
25
25
  # ^^^ name
26
26
  # ^^^ overload
27
27
  #
28
- type loc = Location::WithChildren[:keyword | :name, :kind | :overload]
28
+ type loc = Location[:keyword | :name, :kind | :overload]
29
29
 
30
30
  attr_reader name: Symbol
31
31
  attr_reader kind: kind
@@ -59,7 +59,7 @@ module RBS
59
59
  # ^^^^ name
60
60
  # ^ colon
61
61
  #
62
- type loc = Location::WithChildren[:name | :colon, :kind]
62
+ type loc = Location[:name | :colon, :kind]
63
63
 
64
64
  attr_reader name: Symbol
65
65
  attr_reader type: Types::t
@@ -97,7 +97,7 @@ module RBS
97
97
  # ^ arg_open
98
98
  # ^ arg_close
99
99
  #
100
- type loc = Location::WithChildren[:name | :keyword, :args]
100
+ type loc = Location[:name | :keyword, :args]
101
101
 
102
102
  attr_reader name: TypeName
103
103
  attr_reader args: Array[Types::t]
@@ -141,7 +141,7 @@ module RBS
141
141
  # ^^^^ ivar_name
142
142
  # ^ colon
143
143
  #
144
- type loc = Location::WithChildren[:keyword | :name | :colon, :kind | :ivar | :ivar_name]
144
+ type loc = Location[:keyword | :name | :colon, :kind | :ivar | :ivar_name]
145
145
 
146
146
  attr_reader name: Symbol
147
147
  attr_reader type: Types::t
@@ -174,9 +174,9 @@ module RBS
174
174
  end
175
175
 
176
176
  module LocationOnly
177
- attr_reader location: Location?
177
+ attr_reader location: Location[bot, bot]?
178
178
 
179
- def initialize: (location: Location?) -> void
179
+ def initialize: (location: Location[bot, bot]?) -> void
180
180
 
181
181
  include _HashEqual
182
182
  end
@@ -206,7 +206,7 @@ module RBS
206
206
  # ^^^^^ old_kind
207
207
  # ^^^ old_name
208
208
  #
209
- type loc = Location::WithChildren[:keyword | :new_name | :old_name, :new_kind | :old_kind]
209
+ type loc = Location[:keyword | :new_name | :old_name, :new_kind | :old_kind]
210
210
 
211
211
  attr_reader new_name: Symbol
212
212
  attr_reader old_name: Symbol
data/sig/method_types.rbs CHANGED
@@ -3,9 +3,9 @@ module RBS
3
3
  attr_reader type_params: Array[Symbol]
4
4
  attr_reader type: Types::Function
5
5
  attr_reader block: Types::Block?
6
- attr_reader location: Location?
6
+ attr_reader location: Location[untyped, untyped]?
7
7
 
8
- def initialize: (type_params: Array[Symbol], type: Types::Function, block: Types::Block?, location: Location?) -> void
8
+ def initialize: (type_params: Array[Symbol], type: Types::Function, block: Types::Block?, location: Location[untyped, untyped]?) -> void
9
9
 
10
10
  def ==: (untyped other) -> bool
11
11
 
@@ -13,7 +13,7 @@ module RBS
13
13
 
14
14
  def sub: (Substitution) -> MethodType
15
15
 
16
- def update: (?type_params: Array[Symbol], ?type: Types::Function, ?block: Types::Block?, ?location: Location?) -> MethodType
16
+ def update: (?type_params: Array[Symbol], ?type: Types::Function, ?block: Types::Block?, ?location: Location[untyped, untyped]?) -> MethodType
17
17
 
18
18
  def free_variables: (?Set[Symbol] set) -> Set[Symbol]
19
19
 
data/sig/parser.rbs CHANGED
@@ -1,32 +1,22 @@
1
1
  module RBS
2
2
  class Parser
3
- class SyntaxError < ParsingError
4
- attr_reader token_str: String
5
- attr_reader error_value: untyped
6
- attr_reader value_stack: untyped?
3
+ def self.parse_method_type: (Buffer | String, ?line: Integer, ?column: Integer, ?variables: Array[Symbol]) -> MethodType
7
4
 
8
- def initialize: (token_str: String, error_value: untyped, ?value_stack: untyped?) -> void
9
- end
5
+ def self.parse_type: (Buffer | String, ?line: Integer, ?column: Integer, ?variables: Array[Symbol]) -> Types::t
10
6
 
11
- class LexerError < ParsingError
12
- attr_reader input: String
13
- attr_reader location: Location
7
+ def self.parse_signature: (Buffer | String, ?line: Integer, ?column: Integer) -> Array[AST::Declarations::t]
14
8
 
15
- def initialize: (input: String, location: Location) -> void
16
- end
9
+ private
17
10
 
18
- class SemanticsError < ParsingError
19
- attr_reader subject: untyped
20
- attr_reader location: Location
21
- attr_reader original_message: String
11
+ def self.buffer: (String | Buffer source) -> Buffer
22
12
 
23
- def initialize: (String message, subject: untyped, location: Location) -> void
24
- end
13
+ %a{no-defn}
14
+ def self._parse_type: (Buffer, Integer line, Integer column, Array[Symbol] variables) -> Types::t
25
15
 
26
- def self.parse_method_type: (String | Buffer, ?variables: Array[Symbol], ?eof_re: Regexp?) -> MethodType
16
+ %a{no-defn}
17
+ def self._parse_method_type: (Buffer, Integer line, Integer column, Array[Symbol] variables) -> MethodType
27
18
 
28
- def self.parse_type: (String | Buffer, ?variables: Array[Symbol], ?eof_re: Regexp?) -> Types::t
29
-
30
- def self.parse_signature: (String | Buffer, ?eof_re: Regexp?) -> Array[AST::Declarations::t]
19
+ %a{no-defn}
20
+ def self._parse_signature: (Buffer, Integer line, Integer column) -> Array[AST::Declarations::t]
31
21
  end
32
22
  end
data/sig/polyfill.rbs CHANGED
@@ -1,6 +1,3 @@
1
- module Kernel
2
- end
3
-
4
1
  module Gem
5
2
  class Specification
6
3
  attr_reader version (): Version
@@ -16,3 +13,15 @@ module Enumerable[unchecked out Elem]
16
13
  | [U] () { (Elem) -> U } -> Array[U]
17
14
  | ...
18
15
  end
16
+
17
+ module Bundler
18
+ class LockfileParser
19
+ def initialize: (String) -> void
20
+ def specs: () -> Array[LazySpecification]
21
+ end
22
+
23
+ class LazySpecification
24
+ def name: () -> String
25
+ def version: () -> String
26
+ end
27
+ end
data/sig/repository.rbs CHANGED
@@ -57,6 +57,10 @@ module RBS
57
57
 
58
58
  attr_reader gems: Hash[String, GemRBS]
59
59
 
60
+ def self.default: () -> instance
61
+
62
+ def self.find_best_version: (Gem::Version? version, Array[Gem::Version] candidates) -> Gem::Version
63
+
60
64
  # An optional keyword argument `no_stdlib` is to skip adding directory for stdlib classes.
61
65
  # Passing truthy value will skip loading stdlib. (You can add the stdlib root by yourself.)
62
66
  #
data/sig/types.rbs CHANGED
@@ -13,7 +13,7 @@ module RBS
13
13
  def sub: (Substitution) -> t
14
14
 
15
15
  # Maps type names included in the type and returns new instance of type.
16
- def map_type_name: () { (TypeName, Location?, t) -> TypeName } -> t
16
+ def map_type_name: () { (TypeName, Location[untyped, untyped]?, t) -> TypeName } -> t
17
17
 
18
18
  # Yields all direct sub types included in the type.
19
19
  # It doesn't yield the type itself.
@@ -58,16 +58,16 @@ module RBS
58
58
  end
59
59
 
60
60
  module NoTypeName
61
- def map_type_name: () { (TypeName, Location?, t) -> TypeName } -> self
61
+ def map_type_name: () { (TypeName, Location[untyped, untyped]?, t) -> TypeName } -> self
62
62
  end
63
63
 
64
64
  module Bases
65
65
  class Base
66
66
  include _TypeBase
67
67
 
68
- attr_reader location: Location?
68
+ attr_reader location: Location[bot, bot]?
69
69
 
70
- def initialize: (location: Location?) -> void
70
+ def initialize: (location: Location[bot, bot]?) -> void
71
71
 
72
72
  def ==: (untyped other) -> bool
73
73
 
@@ -111,6 +111,8 @@ module RBS
111
111
  end
112
112
 
113
113
  class Variable
114
+ type loc = Location[bot, bot]
115
+
114
116
  attr_reader name: Symbol
115
117
 
116
118
  @@count: Integer
@@ -119,9 +121,9 @@ module RBS
119
121
  include NoTypeName
120
122
  include EmptyEachType
121
123
 
122
- def initialize: (name: Symbol, location: Location?) -> void
124
+ def initialize: (name: Symbol, location: loc?) -> void
123
125
 
124
- attr_reader location: Location?
126
+ attr_reader location: loc?
125
127
 
126
128
  def ==: (untyped other) -> bool
127
129
 
@@ -144,7 +146,7 @@ module RBS
144
146
  class ClassSingleton
145
147
  # singleton(::Foo)
146
148
  # ^^^^^ => name
147
- type loc = Location::WithChildren[:name, bot]
149
+ type loc = Location[:name, bot]
148
150
 
149
151
  def initialize: (name: TypeName, location: loc?) -> void
150
152
 
@@ -189,7 +191,7 @@ module RBS
189
191
  # _Foo[Bar, Baz]
190
192
  # ^^^^ => name
191
193
  # ^^^^^^^^^^ => args
192
- type loc = Location::WithChildren[:name, :args]
194
+ type loc = Location[:name, :args]
193
195
 
194
196
  def initialize: (name: TypeName, args: Array[t], location: loc?) -> void
195
197
 
@@ -214,7 +216,8 @@ module RBS
214
216
  # Foo[Bar, Baz]
215
217
  # ^^^ => name
216
218
  # ^^^^^^^^^^ => args
217
- type loc = Location::WithChildren[:name, :args]
219
+ #
220
+ type loc = Location[:name, :args]
218
221
 
219
222
  def initialize: (name: TypeName, args: Array[t], location: loc?) -> void
220
223
 
@@ -226,54 +229,64 @@ module RBS
226
229
  class Alias
227
230
  attr_reader name: TypeName
228
231
 
229
- def initialize: (name: TypeName, location: Location?) -> void
232
+ type loc = Location[bot, bot]
233
+
234
+ def initialize: (name: TypeName, location: loc?) -> void
230
235
 
231
236
  include _TypeBase
232
237
  include NoFreeVariables
233
238
  include NoSubst
234
239
  include EmptyEachType
235
240
 
236
- attr_reader location: Location?
241
+ attr_reader location: loc?
237
242
  end
238
243
 
239
244
  class Tuple
240
245
  attr_reader types: Array[t]
241
246
 
242
- def initialize: (types: Array[t], location: Location?) -> void
247
+ type loc = Location[bot, bot]
248
+
249
+ def initialize: (types: Array[t], location: loc?) -> void
243
250
 
244
251
  include _TypeBase
245
252
 
246
- attr_reader location: Location?
253
+ attr_reader location: loc?
247
254
  end
248
255
 
249
256
  class Record
250
257
  attr_reader fields: Hash[Symbol, t]
251
258
 
252
- def initialize: (fields: Hash[Symbol, t], location: Location?) -> void
259
+ type loc = Location[bot, bot]
260
+
261
+ def initialize: (fields: Hash[Symbol, t], location: loc?) -> void
253
262
 
254
263
  include _TypeBase
255
264
 
256
- attr_reader location: Location?
265
+ attr_reader location: loc?
257
266
  end
258
267
 
259
268
  class Optional
260
269
  attr_reader type: t
261
270
 
262
- def initialize: (type: t, location: Location?) -> void
271
+ type loc = Location[bot, bot]
272
+
273
+ def initialize: (type: t, location: loc?) -> void
263
274
 
264
275
  include _TypeBase
265
276
 
266
- attr_reader location: Location?
277
+ attr_reader location: loc?
267
278
  end
268
279
 
269
280
  class Union
270
281
  attr_reader types: Array[t]
271
282
 
272
- def initialize: (types: Array[t], location: Location?) -> void
283
+ type loc = Location[bot, bot]
284
+
285
+ def initialize: (types: Array[t], location: loc?) -> void
273
286
 
274
287
  include _TypeBase
275
288
 
276
- attr_reader location: Location?
289
+ attr_reader location: loc?
277
290
 
278
291
  def map_type: () { (t) -> t } -> Union
279
292
  | () -> Enumerator[t, Union]
@@ -282,11 +295,13 @@ module RBS
282
295
  class Intersection
283
296
  attr_reader types: Array[t]
284
297
 
285
- def initialize: (types: Array[t], location: Location?) -> void
298
+ type loc = Location[bot, bot]
299
+
300
+ def initialize: (types: Array[t], location: loc?) -> void
286
301
 
287
302
  include _TypeBase
288
303
 
289
- attr_reader location: Location?
304
+ attr_reader location: loc?
290
305
 
291
306
  def map_type: () { (t) -> t } -> Intersection
292
307
  | () -> Enumerator[t, Intersection]
@@ -294,7 +309,7 @@ module RBS
294
309
 
295
310
  class Function
296
311
  class Param
297
- type loc = Location::WithChildren[bot, :name]
312
+ type loc = Location[bot, :name]
298
313
 
299
314
  attr_reader type: t
300
315
  attr_reader name: Symbol?
@@ -329,7 +344,7 @@ module RBS
329
344
  def map_type: { (t) -> t } -> Function
330
345
  | -> Enumerator[t, Function]
331
346
 
332
- def map_type_name: () { (TypeName, Location?, t) -> TypeName } -> Function
347
+ def map_type_name: () { (TypeName, Location[untyped, untyped]?, t) -> TypeName } -> Function
333
348
 
334
349
  def each_type: () { (t) -> void } -> void
335
350
  | -> Enumerator[t, void]
@@ -384,19 +399,22 @@ module RBS
384
399
  attr_reader type: Function
385
400
  attr_reader block: Block?
386
401
 
387
- def initialize: (location: Location?, type: Function, block: Block?) -> void
402
+ type loc = Location[bot, bot]
403
+
404
+ def initialize: (location: loc?, type: Function, block: Block?) -> void
388
405
 
389
406
  include _TypeBase
390
407
 
391
- attr_reader location: Location?
408
+ attr_reader location: loc?
392
409
  end
393
410
 
394
411
  class Literal
395
412
  type literal = String | Integer | Symbol | TrueClass | FalseClass
413
+ type loc = Location[bot, bot]
396
414
 
397
415
  attr_reader literal: literal
398
416
 
399
- def initialize: (literal: literal, location: Location?) -> void
417
+ def initialize: (literal: literal, location: loc?) -> void
400
418
 
401
419
  include _TypeBase
402
420
  include NoFreeVariables
@@ -404,7 +422,7 @@ module RBS
404
422
  include EmptyEachType
405
423
  include NoTypeName
406
424
 
407
- attr_reader location: Location?
425
+ attr_reader location: loc?
408
426
  end
409
427
  end
410
428
  end
data/sig/writer.rbs CHANGED
@@ -38,7 +38,7 @@ module RBS
38
38
  def attribute: (:reader | :writer | :accessor, AST::Members::Attribute) -> void
39
39
 
40
40
  interface _Located
41
- def location: () -> Location?
41
+ def location: () -> Location[untyped, untyped]?
42
42
  end
43
43
 
44
44
  def preserve_empty_line: (_Located?, _Located) -> void
@@ -512,7 +512,7 @@ class Range[out Elem]
512
512
  # Deserializes JSON string by constructing new Range object with arguments `a`
513
513
  # serialized by `to_json`.
514
514
  #
515
- def self.json_create: (Hash[String, String | [Elem, Elem, bool]] object) -> instance
515
+ def self.json_create: [A] (Hash[String, String | [A, A, bool]] object) -> Range[A]
516
516
 
517
517
  # Returns a hash, that will be turned into a JSON object and represent this
518
518
  # object.
@@ -565,7 +565,7 @@ class Set[A]
565
565
  #
566
566
  # method used for JSON marshalling support.
567
567
  #
568
- def self.json_create: (Hash[String, String | Array[A]] object) -> instance
568
+ def self.json_create: [A] (Hash[String, String | Array[A]] object) -> Set[A]
569
569
 
570
570
  # Marshal the object to JSON.
571
571
  #
@@ -582,7 +582,7 @@ class Struct[Elem]
582
582
  # Deserializes JSON string by constructing new Struct object with values `v`
583
583
  # serialized by `to_json`.
584
584
  #
585
- def self.json_create: (Hash[String, String | Array[Elem]] object) -> instance
585
+ def self.json_create: [Elem] (Hash[String, String | Array[Elem]] object) -> Struct[Elem]
586
586
 
587
587
  # Returns a hash, that will be turned into a JSON object and represent this
588
588
  # object.
@@ -0,0 +1,406 @@
1
+ # The objspace library extends the ObjectSpace module and adds several methods
2
+ # to get internal statistic information about object/memory management.
3
+ #
4
+ # You need to `require 'objspace'` to use this extension module.
5
+ #
6
+ # Generally, you *SHOULD NOT* use this library if you do not know about the MRI
7
+ # implementation. Mainly, this library is for (memory) profiler developers and
8
+ # MRI developers who need to know about MRI memory usage.
9
+ # The ObjectSpace module contains a number of routines that interact with the
10
+ # garbage collection facility and allow you to traverse all living objects with
11
+ # an iterator.
12
+ #
13
+ # ObjectSpace also provides support for object finalizers, procs that will be
14
+ # called when a specific object is about to be destroyed by garbage collection.
15
+ # See the documentation for `ObjectSpace.define_finalizer` for important
16
+ # information on how to use this method correctly.
17
+ #
18
+ # a = "A"
19
+ # b = "B"
20
+ #
21
+ # ObjectSpace.define_finalizer(a, proc {|id| puts "Finalizer one on #{id}" })
22
+ # ObjectSpace.define_finalizer(b, proc {|id| puts "Finalizer two on #{id}" })
23
+ #
24
+ # a = nil
25
+ # b = nil
26
+ #
27
+ # *produces:*
28
+ #
29
+ # Finalizer two on 537763470
30
+ # Finalizer one on 537763480
31
+ module ObjectSpace
32
+ # Returns the class for the given `object`.
33
+ #
34
+ # class A
35
+ # def foo
36
+ # ObjectSpace::trace_object_allocations do
37
+ # obj = Object.new
38
+ # p "#{ObjectSpace::allocation_class_path(obj)}"
39
+ # end
40
+ # end
41
+ # end
42
+ #
43
+ # A.new.foo #=> "Class"
44
+ #
45
+ # See ::trace_object_allocations for more information and examples.
46
+ #
47
+ def self.allocation_class_path: (untyped) -> String
48
+
49
+ # Returns garbage collector generation for the given `object`.
50
+ #
51
+ # class B
52
+ # include ObjectSpace
53
+ #
54
+ # def foo
55
+ # trace_object_allocations do
56
+ # obj = Object.new
57
+ # p "Generation is #{allocation_generation(obj)}"
58
+ # end
59
+ # end
60
+ # end
61
+ #
62
+ # B.new.foo #=> "Generation is 3"
63
+ #
64
+ # See ::trace_object_allocations for more information and examples.
65
+ #
66
+ def self.allocation_generation: (untyped) -> (Integer | nil)
67
+
68
+ # Returns the method identifier for the given `object`.
69
+ #
70
+ # class A
71
+ # include ObjectSpace
72
+ #
73
+ # def foo
74
+ # trace_object_allocations do
75
+ # obj = Object.new
76
+ # p "#{allocation_class_path(obj)}##{allocation_method_id(obj)}"
77
+ # end
78
+ # end
79
+ # end
80
+ #
81
+ # A.new.foo #=> "Class#new"
82
+ #
83
+ # See ::trace_object_allocations for more information and examples.
84
+ #
85
+ def self.allocation_method_id: (untyped) -> Symbol
86
+
87
+ # Returns the source file origin from the given `object`.
88
+ #
89
+ # See ::trace_object_allocations for more information and examples.
90
+ #
91
+ def self.allocation_sourcefile: (untyped) -> String
92
+
93
+ # Returns the original line from source for from the given `object`.
94
+ #
95
+ # See ::trace_object_allocations for more information and examples.
96
+ #
97
+ def self.allocation_sourceline: (untyped) -> Integer
98
+
99
+ # Counts objects for each `T_IMEMO` type.
100
+ #
101
+ # This method is only for MRI developers interested in performance and memory
102
+ # usage of Ruby programs.
103
+ #
104
+ # It returns a hash as:
105
+ #
106
+ # {:imemo_ifunc=>8,
107
+ # :imemo_svar=>7,
108
+ # :imemo_cref=>509,
109
+ # :imemo_memo=>1,
110
+ # :imemo_throw_data=>1}
111
+ #
112
+ # If the optional argument, result_hash, is given, it is overwritten and
113
+ # returned. This is intended to avoid probe effect.
114
+ #
115
+ # The contents of the returned hash is implementation specific and may change in
116
+ # the future.
117
+ #
118
+ # In this version, keys are symbol objects.
119
+ #
120
+ # This method is only expected to work with C Ruby.
121
+ #
122
+ def self.count_imemo_objects: (?Hash[Symbol, Integer] result_hash) -> Hash[Symbol, Integer]
123
+
124
+ # Counts nodes for each node type.
125
+ #
126
+ # This method is only for MRI developers interested in performance and memory
127
+ # usage of Ruby programs.
128
+ #
129
+ # It returns a hash as:
130
+ #
131
+ # {:NODE_METHOD=>2027, :NODE_FBODY=>1927, :NODE_CFUNC=>1798, ...}
132
+ #
133
+ # If the optional argument, result_hash, is given, it is overwritten and
134
+ # returned. This is intended to avoid probe effect.
135
+ #
136
+ # Note: The contents of the returned hash is implementation defined. It may be
137
+ # changed in future.
138
+ #
139
+ # This method is only expected to work with C Ruby.
140
+ #
141
+ def self.count_nodes: (?Hash[Symbol, Integer] result_hash) -> Hash[Symbol, Integer]
142
+
143
+ # Counts objects size (in bytes) for each type.
144
+ #
145
+ # Note that this information is incomplete. You need to deal with this
146
+ # information as only a **HINT**. Especially, total size of T_DATA may be
147
+ # wrong.
148
+ #
149
+ # It returns a hash as:
150
+ # {:TOTAL=>1461154, :T_CLASS=>158280, :T_MODULE=>20672, :T_STRING=>527249, ...}
151
+ #
152
+ # If the optional argument, result_hash, is given, it is overwritten and
153
+ # returned. This is intended to avoid probe effect.
154
+ #
155
+ # The contents of the returned hash is implementation defined. It may be changed
156
+ # in future.
157
+ #
158
+ # This method is only expected to work with C Ruby.
159
+ #
160
+ def self.count_objects_size: (?Hash[Symbol, Integer] result_hash) -> Hash[Symbol, Integer]
161
+
162
+ # Counts symbols for each Symbol type.
163
+ #
164
+ # This method is only for MRI developers interested in performance and memory
165
+ # usage of Ruby programs.
166
+ #
167
+ # If the optional argument, result_hash, is given, it is overwritten and
168
+ # returned. This is intended to avoid probe effect.
169
+ #
170
+ # Note: The contents of the returned hash is implementation defined. It may be
171
+ # changed in future.
172
+ #
173
+ # This method is only expected to work with C Ruby.
174
+ #
175
+ # On this version of MRI, they have 3 types of Symbols (and 1 total counts).
176
+ #
177
+ # * mortal_dynamic_symbol: GC target symbols (collected by GC)
178
+ # * immortal_dynamic_symbol: Immortal symbols promoted from dynamic symbols (do not collected by GC)
179
+ # * immortal_static_symbol: Immortal symbols (do not collected by GC)
180
+ # * immortal_symbol: total immortal symbols (immortal_dynamic_symbol+immortal_static_symbol)
181
+ #
182
+ def self.count_symbols: (?Hash[Symbol, Integer] result_hash) -> Hash[Symbol, Integer]
183
+
184
+ # Counts objects for each `T_DATA` type.
185
+ #
186
+ # This method is only for MRI developers interested in performance and memory
187
+ # usage of Ruby programs.
188
+ #
189
+ # It returns a hash as:
190
+ #
191
+ # {RubyVM::InstructionSequence=>504, :parser=>5, :barrier=>6,
192
+ # :mutex=>6, Proc=>60, RubyVM::Env=>57, Mutex=>1, Encoding=>99,
193
+ # ThreadGroup=>1, Binding=>1, Thread=>1, RubyVM=>1, :iseq=>1,
194
+ # Random=>1, ARGF.class=>1, Data=>1, :autoload=>3, Time=>2}
195
+ # # T_DATA objects existing at startup on r32276.
196
+ #
197
+ # If the optional argument, result_hash, is given, it is overwritten and
198
+ # returned. This is intended to avoid probe effect.
199
+ #
200
+ # The contents of the returned hash is implementation specific and may change in
201
+ # the future.
202
+ #
203
+ # In this version, keys are Class object or Symbol object.
204
+ #
205
+ # If object is kind of normal (accessible) object, the key is Class object. If
206
+ # object is not a kind of normal (internal) object, the key is symbol name,
207
+ # registered by rb_data_type_struct.
208
+ #
209
+ # This method is only expected to work with C Ruby.
210
+ #
211
+ def self.count_tdata_objects: (?Hash[untyped, Integer] result_hash) -> Hash[untyped, Integer]
212
+
213
+ def self.dump: (untyped obj, ?output: Symbol) -> (String | File | nil)
214
+
215
+ def self.dump_all: (?since: (Integer|nil), ?full: boolish, ?output: Symbol) -> (String | File | nil)
216
+
217
+ # MRI specific feature
218
+ # : Return internal class of obj.
219
+ #
220
+ # obj can be an instance of InternalObjectWrapper.
221
+ #
222
+ # Note that you should not use this method in your application.
223
+ #
224
+ def self.internal_class_of: (untyped) -> Class
225
+
226
+ # MRI specific feature
227
+ # : Return internal super class of cls (Class or Module).
228
+ #
229
+ # obj can be an instance of InternalObjectWrapper.
230
+ #
231
+ # Note that you should not use this method in your application.
232
+ #
233
+ def self.internal_super_of: (untyped) -> untyped
234
+
235
+ # Return consuming memory size of obj in bytes.
236
+ #
237
+ # Note that the return size is incomplete. You need to deal with this
238
+ # information as only a **HINT**. Especially, the size of `T_DATA` may not be
239
+ # correct.
240
+ #
241
+ # This method is only expected to work with C Ruby.
242
+ #
243
+ # From Ruby 2.2, memsize_of(obj) returns a memory size includes sizeof(RVALUE).
244
+ #
245
+ def self.memsize_of: (untyped) -> Integer
246
+
247
+ # Return consuming memory size of all living objects in bytes.
248
+ #
249
+ # If `klass` (should be Class object) is given, return the total memory size of
250
+ # instances of the given class.
251
+ #
252
+ # Note that the returned size is incomplete. You need to deal with this
253
+ # information as only a **HINT**. Especially, the size of `T_DATA` may not be
254
+ # correct.
255
+ #
256
+ # Note that this method does **NOT** return total malloc'ed memory size.
257
+ #
258
+ # This method can be defined by the following Ruby code:
259
+ #
260
+ # def memsize_of_all klass = false
261
+ # total = 0
262
+ # ObjectSpace.each_object{|e|
263
+ # total += ObjectSpace.memsize_of(e) if klass == false || e.kind_of?(klass)
264
+ # }
265
+ # total
266
+ # end
267
+ #
268
+ # This method is only expected to work with C Ruby.
269
+ #
270
+ def self.memsize_of_all: (?Class) -> Integer
271
+
272
+ # MRI specific feature
273
+ # : Return all reachable objects from `obj'.
274
+ #
275
+ #
276
+ # This method returns all reachable objects from `obj'.
277
+ #
278
+ # If `obj' has two or more references to the same object `x', then returned
279
+ # array only includes one `x' object.
280
+ #
281
+ # If `obj' is a non-markable (non-heap management) object such as true, false,
282
+ # nil, symbols and Fixnums (and Flonum) then it simply returns nil.
283
+ #
284
+ # If `obj' has references to an internal object, then it returns instances of
285
+ # ObjectSpace::InternalObjectWrapper class. This object contains a reference to
286
+ # an internal object and you can check the type of internal object with `type'
287
+ # method.
288
+ #
289
+ # If `obj' is instance of ObjectSpace::InternalObjectWrapper class, then this
290
+ # method returns all reachable object from an internal object, which is pointed
291
+ # by `obj'.
292
+ #
293
+ # With this method, you can find memory leaks.
294
+ #
295
+ # This method is only expected to work except with C Ruby.
296
+ #
297
+ # Example:
298
+ # ObjectSpace.reachable_objects_from(['a', 'b', 'c'])
299
+ # #=> [Array, 'a', 'b', 'c']
300
+ #
301
+ # ObjectSpace.reachable_objects_from(['a', 'a', 'a'])
302
+ # #=> [Array, 'a', 'a', 'a'] # all 'a' strings have different object id
303
+ #
304
+ # ObjectSpace.reachable_objects_from([v = 'a', v, v])
305
+ # #=> [Array, 'a']
306
+ #
307
+ # ObjectSpace.reachable_objects_from(1)
308
+ # #=> nil # 1 is not markable (heap managed) object
309
+ #
310
+ def self.reachable_objects_from: (untyped) -> ([ untyped ] | nil)
311
+
312
+ # MRI specific feature
313
+ # : Return all reachable objects from root.
314
+ #
315
+ #
316
+ def self.reachable_objects_from_root: () -> Hash[String, untyped]
317
+
318
+ # Starts tracing object allocations from the ObjectSpace extension module.
319
+ #
320
+ # For example:
321
+ #
322
+ # require 'objspace'
323
+ #
324
+ # class C
325
+ # include ObjectSpace
326
+ #
327
+ # def foo
328
+ # trace_object_allocations do
329
+ # obj = Object.new
330
+ # p "#{allocation_sourcefile(obj)}:#{allocation_sourceline(obj)}"
331
+ # end
332
+ # end
333
+ # end
334
+ #
335
+ # C.new.foo #=> "objtrace.rb:8"
336
+ #
337
+ # This example has included the ObjectSpace module to make it easier to read,
338
+ # but you can also use the ::trace_object_allocations notation (recommended).
339
+ #
340
+ # Note that this feature introduces a huge performance decrease and huge memory
341
+ # consumption.
342
+ #
343
+ def self.trace_object_allocations: () { (untyped) -> untyped } -> untyped
344
+
345
+ # Clear recorded tracing information.
346
+ #
347
+ def self.trace_object_allocations_clear: () -> void
348
+
349
+ def self.trace_object_allocations_debug_start: () -> void
350
+
351
+ # Starts tracing object allocations.
352
+ #
353
+ def self.trace_object_allocations_start: () -> void
354
+
355
+ # Stop tracing object allocations.
356
+ #
357
+ # Note that if ::trace_object_allocations_start is called n-times, then tracing
358
+ # will stop after calling ::trace_object_allocations_stop n-times.
359
+ #
360
+ def self.trace_object_allocations_stop: () -> void
361
+
362
+ private
363
+
364
+ # Dump the contents of a ruby object as JSON.
365
+ #
366
+ # This method is only expected to work with C Ruby. This is an experimental
367
+ # method and is subject to change. In particular, the function signature and
368
+ # output format are not guaranteed to be compatible in future versions of ruby.
369
+ #
370
+ def dump: (untyped obj, ?output: Symbol) -> (String|File|nil)
371
+
372
+ # Dump the contents of the ruby heap as JSON.
373
+ #
374
+ # *since* must be a non-negative integer or `nil`.
375
+ #
376
+ # If *since* is a positive integer, only objects of that generation and newer
377
+ # generations are dumped. The current generation can be accessed using
378
+ # GC::count.
379
+ #
380
+ # Objects that were allocated without object allocation tracing enabled are
381
+ # ignored. See ::trace_object_allocations for more information and examples.
382
+ #
383
+ # If *since* is omitted or is `nil`, all objects are dumped.
384
+ #
385
+ # This method is only expected to work with C Ruby. This is an experimental
386
+ # method and is subject to change. In particular, the function signature and
387
+ # output format are not guaranteed to be compatible in future versions of ruby.
388
+ #
389
+ def dump_all: (?since: (Integer|nil), ?full: boolish, ?output: Symbol) -> (String|File|nil)
390
+
391
+ def memsize_of: (untyped) -> Integer
392
+
393
+ def memsize_of_all: (?class) -> Integer
394
+
395
+ def reachable_objects_from: (untyped) -> ([ untyped ] | nil)
396
+
397
+ def reachable_objects_from_root: () -> Hash[String, untyped]
398
+
399
+ def trace_object_allocations_clear: () -> void
400
+
401
+ def trace_object_allocations_debug_start: () -> void
402
+
403
+ def trace_object_allocations_start: () -> void
404
+
405
+ def trace_object_allocations_stop: () -> void
406
+ end