rbs 3.8.0 → 3.9.0.dev.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 (98) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/comments.yml +3 -3
  3. data/.github/workflows/dependabot.yml +1 -1
  4. data/.github/workflows/ruby.yml +7 -7
  5. data/.github/workflows/typecheck.yml +2 -0
  6. data/.github/workflows/windows.yml +15 -0
  7. data/.rubocop.yml +20 -1
  8. data/CHANGELOG.md +14 -0
  9. data/Rakefile +5 -2
  10. data/config.yml +6 -0
  11. data/core/data.rbs +1 -1
  12. data/core/enumerator.rbs +14 -2
  13. data/core/exception.rbs +148 -39
  14. data/core/gc.rbs +2 -2
  15. data/core/io.rbs +7 -3
  16. data/core/kernel.rbs +58 -16
  17. data/core/method.rbs +2 -2
  18. data/core/module.rbs +3 -3
  19. data/core/proc.rbs +2 -2
  20. data/core/ractor.rbs +4 -1
  21. data/core/rbs/unnamed/argf.rbs +3 -3
  22. data/core/regexp.rbs +4 -2
  23. data/core/ruby_vm.rbs +8 -8
  24. data/core/rubygems/version.rbs +2 -2
  25. data/core/string.rbs +1 -1
  26. data/core/time.rbs +1 -1
  27. data/core/unbound_method.rbs +1 -1
  28. data/docs/syntax.md +10 -5
  29. data/ext/rbs_extension/extconf.rb +2 -1
  30. data/ext/rbs_extension/location.c +32 -10
  31. data/ext/rbs_extension/location.h +4 -3
  32. data/ext/rbs_extension/main.c +22 -1
  33. data/ext/rbs_extension/parser.c +144 -136
  34. data/ext/rbs_extension/parserstate.c +40 -9
  35. data/ext/rbs_extension/parserstate.h +6 -4
  36. data/include/rbs/ruby_objs.h +6 -6
  37. data/include/rbs/util/rbs_constant_pool.h +219 -0
  38. data/lib/rbs/ast/declarations.rb +9 -4
  39. data/lib/rbs/ast/directives.rb +10 -0
  40. data/lib/rbs/ast/members.rb +2 -0
  41. data/lib/rbs/ast/type_param.rb +2 -2
  42. data/lib/rbs/cli/validate.rb +1 -0
  43. data/lib/rbs/cli.rb +3 -3
  44. data/lib/rbs/collection/config/lockfile_generator.rb +28 -7
  45. data/lib/rbs/collection/sources/rubygems.rb +1 -1
  46. data/lib/rbs/definition.rb +46 -31
  47. data/lib/rbs/definition_builder/ancestor_builder.rb +2 -0
  48. data/lib/rbs/definition_builder.rb +86 -30
  49. data/lib/rbs/environment.rb +33 -18
  50. data/lib/rbs/errors.rb +23 -0
  51. data/lib/rbs/locator.rb +2 -0
  52. data/lib/rbs/method_type.rb +2 -0
  53. data/lib/rbs/parser_aux.rb +38 -1
  54. data/lib/rbs/subtractor.rb +3 -3
  55. data/lib/rbs/test/hook.rb +2 -2
  56. data/lib/rbs/test/type_check.rb +7 -5
  57. data/lib/rbs/types.rb +44 -5
  58. data/lib/rbs/unit_test/spy.rb +4 -2
  59. data/lib/rbs/unit_test/type_assertions.rb +17 -11
  60. data/lib/rbs/validator.rb +4 -0
  61. data/lib/rbs/version.rb +1 -1
  62. data/lib/rbs/writer.rb +10 -5
  63. data/lib/rbs.rb +1 -0
  64. data/rbs.gemspec +1 -1
  65. data/sig/collection/config/lockfile_generator.rbs +1 -1
  66. data/sig/declarations.rbs +10 -3
  67. data/sig/definition.rbs +67 -14
  68. data/sig/definition_builder.rbs +17 -3
  69. data/sig/directives.rbs +17 -1
  70. data/sig/environment.rbs +2 -0
  71. data/sig/errors.rbs +16 -0
  72. data/sig/parser.rbs +5 -1
  73. data/sig/subtractor.rbs +1 -1
  74. data/sig/test/type_check.rbs +2 -2
  75. data/sig/type_param.rbs +1 -1
  76. data/sig/types.rbs +3 -0
  77. data/sig/unit_test/spy.rbs +2 -0
  78. data/sig/unit_test/type_assertions.rbs +2 -0
  79. data/sig/validator.rbs +4 -0
  80. data/sig/writer.rbs +1 -1
  81. data/src/ruby_objs.c +12 -6
  82. data/src/util/rbs_constant_pool.c +342 -0
  83. data/stdlib/cgi/0/core.rbs +10 -0
  84. data/stdlib/json/0/json.rbs +52 -50
  85. data/stdlib/monitor/0/monitor.rbs +13 -4
  86. data/stdlib/net-http/0/net-http.rbs +2 -2
  87. data/stdlib/openssl/0/openssl.rbs +73 -73
  88. data/stdlib/resolv/0/resolv.rbs +8 -8
  89. data/stdlib/socket/0/addrinfo.rbs +1 -1
  90. data/stdlib/socket/0/unix_socket.rbs +4 -2
  91. data/stdlib/stringio/0/stringio.rbs +1 -1
  92. data/stdlib/uri/0/common.rbs +17 -0
  93. metadata +4 -7
  94. data/templates/include/rbs/constants.h.erb +0 -20
  95. data/templates/include/rbs/ruby_objs.h.erb +0 -10
  96. data/templates/src/constants.c.erb +0 -36
  97. data/templates/src/ruby_objs.c.erb +0 -27
  98. data/templates/template.rb +0 -122
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1b91cbfc2b983ede8389074430b54b2db70d1afee9c54c92cf8bc875568b7cf8
4
- data.tar.gz: b0306b614ba8d61f78c78e91340615ee5a5b196d562eaac580c5f2fe66a29927
3
+ metadata.gz: 311aed14b7b84b6b21cb187b72c1ddd87a427b6ec02805017f83b5fbcbfaac7b
4
+ data.tar.gz: 4fc2e119368352b2fbded9355834757399cde34f3912c24ae82e91db67042762
5
5
  SHA512:
6
- metadata.gz: 78e9e035fccfc91fcdf4f37812e56c52d8dd9c4fd19211ad8c3ae1e9ddeda0c4deb3178b5b45e27863e93ebe415605bc83fd6d74ff2e13fc1ff266c82ab74059
7
- data.tar.gz: 6e65f935e8e51b9542cfd8b2aab6a367949be17742764dbe0a65532e3a87f9fc1f1ce829eb67783bc7f7c711f8039b59a3e66ef24aeecb698def729908f96139
6
+ metadata.gz: 6c9b1a6188ac4585b3ea5b9dd72432f12ea13ee4c8311a15a86f0cee5595acef46901e04105e40a84703ea51e036efb645a53cacaa1517d213420b2251f3f506
7
+ data.tar.gz: 4061149d53166bbe1a6029cebbacc54117eccf5d414c1859b50c5049d2898245a27ccf8f558b9c11d5edaa0b276ba88c111b8c80505a5b911664e77b5351dc2a
@@ -10,13 +10,13 @@ on:
10
10
  jobs:
11
11
  comments:
12
12
  runs-on: "ubuntu-latest"
13
- env:
14
- RUBY_COMMIT: 1b0c46daed9186b82ab4fef1a4ab225afe582ee6
13
+ # env:
14
+ # RUBY_COMMIT: 1b0c46daed9186b82ab4fef1a4ab225afe582ee6
15
15
  steps:
16
16
  - uses: actions/checkout@v4
17
17
  - uses: ruby/setup-ruby@v1
18
18
  with:
19
- ruby-version: "3.4.0-rc1"
19
+ ruby-version: "3.4.1"
20
20
  bundler: none
21
21
  - name: Install dependencies
22
22
  run: |
@@ -14,7 +14,7 @@ jobs:
14
14
  if: ${{ github.event.pull_request.user.login == 'dependabot[bot]' }}
15
15
  steps:
16
16
  - name: Dependabot metadata
17
- uses: dependabot/fetch-metadata@dbb049abf0d677abbd7f7eee0375145b417fdd34 # v2.2.0
17
+ uses: dependabot/fetch-metadata@d7267f607e9d3fb96fc2fbe83e0af444713e90b7 # v2.3.0
18
18
  id: metadata
19
19
  - name: Checkout repository
20
20
  uses: actions/checkout@v4
@@ -13,26 +13,26 @@ jobs:
13
13
  strategy:
14
14
  fail-fast: false
15
15
  matrix:
16
- ruby: ['3.1', '3.2', '3.3', '3.4.0-rc1', head]
16
+ ruby: ['3.1', '3.2', '3.3', '3.4', head]
17
17
  rubyopt: [""]
18
18
  job:
19
19
  - test
20
20
  include:
21
21
  - ruby: head
22
22
  job: stdlib_test rubocop
23
- - ruby: "3.4.0-rc1"
23
+ - ruby: "3.4"
24
24
  job: stdlib_test
25
- - ruby: "3.4.0-rc1"
25
+ - ruby: "3.4"
26
26
  job: test
27
27
  rubyopt: "--enable-frozen-string-literal"
28
- - ruby: "3.4.0-rc1"
28
+ - ruby: "3.4"
29
29
  job: stdlib_test
30
30
  rubyopt: "--enable-frozen-string-literal"
31
- - ruby: "3.4.0-rc1"
31
+ - ruby: "3.4"
32
32
  job: lexer templates compile confirm_lexer confirm_templates
33
- - ruby: "3.4.0-rc1"
33
+ - ruby: "3.4"
34
34
  job: rubocop validate test_doc build test_generate_stdlib raap
35
- - ruby: "3.4.0-rc1"
35
+ - ruby: "3.4"
36
36
  job: typecheck_test
37
37
  env:
38
38
  RANDOMIZE_STDLIB_TEST_ORDER: "true"
@@ -20,6 +20,8 @@ jobs:
20
20
  bundler: none
21
21
  - name: Set working directory as safe
22
22
  run: git config --global --add safe.directory $(pwd)
23
+ - name: Set up permission
24
+ run: chmod -R o-w /opt/hostedtoolcache/Ruby
23
25
  - name: Install dependencies
24
26
  run: |
25
27
  sudo apt-get update
@@ -20,6 +20,21 @@ jobs:
20
20
  uses: ruby/setup-ruby@v1
21
21
  with:
22
22
  ruby-version: ${{ matrix.ruby }}
23
+
24
+ # ucrt and mswin have the dev version Ruby.
25
+ # It introduce checksum mismatches for bundled gems. So remove them before `bundle install`
26
+ - name: Purge gem caches
27
+ run: |
28
+ ruby -e '
29
+ exit if "${{ matrix.ruby }}" != "ucrt" && "${{ matrix.ruby }}" != "mswin"
30
+
31
+ require "open-uri"
32
+ require "json"
33
+
34
+ res = URI.parse("https://stdgems.org/bundled_gems.json").read
35
+ bundled_gems = JSON.parse(res)["gems"].map{_1["gem"]}
36
+ system "gem uninstall #{bundled_gems.join(" ")}", exception: true
37
+ '
23
38
  - name: bundle install
24
39
  run: |
25
40
  bundle config set without profilers libs
data/.rubocop.yml CHANGED
@@ -3,7 +3,7 @@ require:
3
3
  - rubocop-on-rbs
4
4
 
5
5
  AllCops:
6
- TargetRubyVersion: 3.0
6
+ TargetRubyVersion: 3.1
7
7
  DisabledByDefault: true
8
8
  Exclude:
9
9
  - 'vendor/bundle/**/*'
@@ -15,6 +15,7 @@ Rubycw/Rubycw:
15
15
 
16
16
  RBS:
17
17
  Enabled: true
18
+
18
19
  RBS/Layout:
19
20
  Enabled: true
20
21
  Exclude:
@@ -23,6 +24,7 @@ RBS/Layout:
23
24
  RBS/Layout/CommentIndentation:
24
25
  Exclude:
25
26
  - core/string.rbs
27
+
26
28
  RBS/Lint:
27
29
  Enabled: true
28
30
  Exclude:
@@ -32,15 +34,32 @@ RBS/Lint/TopLevelInterface:
32
34
  Enabled: false
33
35
  RBS/Lint/TopLevelTypeAlias:
34
36
  Enabled: false
37
+ RBS/Lint/AmbiguousKeywordArgumentKey:
38
+ Exclude:
39
+ # OpenSSL::KDF.scrypt
40
+ - 'stdlib/openssl/0/openssl.rbs'
41
+
35
42
  RBS/Style:
36
43
  Enabled: false
37
44
  Exclude:
38
45
  - 'sig/**/*'
39
46
  - 'test/**/*'
47
+ RBS/Style/BlockReturnBoolish:
48
+ Enabled: true
49
+ RBS/Style/ClassWithSingleton:
50
+ Enabled: true
51
+ RBS/Style/DuplicatedType:
52
+ Enabled: true
40
53
  RBS/Style/EmptyArgument:
41
54
  Enabled: true
42
55
  RBS/Style/InitializeReturnType:
43
56
  Enabled: true
57
+ RBS/Style/InstanceWithInstance:
58
+ Enabled: true
59
+ RBS/Style/OptionalNil:
60
+ Enabled: true
61
+ RBS/Style/RedundantParentheses:
62
+ Enabled: true
44
63
 
45
64
  Lint/DuplicateMethods:
46
65
  Enabled: true
data/CHANGELOG.md CHANGED
@@ -1,5 +1,19 @@
1
1
  # CHANGELOG
2
2
 
3
+ ## 3.8.1 (2024-12-27)
4
+
5
+ ### Signature updates
6
+
7
+ * `Ractor.store_if_absent` ([#2206](https://github.com/ruby/rbs/pull/2206))
8
+ * `Time#iso860t1` ([#2207](https://github.com/ruby/rbs/pull/2207))
9
+ * `Time#xmlschema` ([#2207](https://github.com/ruby/rbs/pull/2207))
10
+
11
+ ### Miscellaneous
12
+
13
+ * Update rubocop-on-rbs ([#2200](https://github.com/ruby/rbs/pull/2200))
14
+ * Update docs based on Ruby 3.4.1 ([#2208](https://github.com/ruby/rbs/pull/2208))
15
+ * Ruby 3.4.1 ([#2206](https://github.com/ruby/rbs/pull/2206))
16
+
3
17
  ## 3.8.0 (2024-12-24)
4
18
 
5
19
  ### Signature updates
data/Rakefile CHANGED
@@ -112,7 +112,7 @@ end
112
112
 
113
113
  task :stdlib_test => :compile do
114
114
  test_files = FileList["test/stdlib/**/*_test.rb"].reject do |path|
115
- path =~ %r{Ractor} || path =~ %r{Encoding}
115
+ path =~ %r{Ractor} || path =~ %r{Encoding} || path =~ %r{CGI_test}
116
116
  end
117
117
 
118
118
  if ENV["RANDOMIZE_STDLIB_TEST_ORDER"] == "true"
@@ -121,6 +121,7 @@ task :stdlib_test => :compile do
121
121
 
122
122
  sh "#{ruby} -Ilib #{bin}/test_runner.rb #{test_files.join(' ')}"
123
123
  # TODO: Ractor tests need to be run in a separate process
124
+ sh "#{ruby} -Ilib #{bin}/test_runner.rb test/stdlib/CGI_test.rb"
124
125
  sh "#{ruby} -Ilib #{bin}/test_runner.rb test/stdlib/Ractor_test.rb"
125
126
  sh "#{ruby} -Ilib #{bin}/test_runner.rb test/stdlib/Encoding_test.rb"
126
127
  end
@@ -139,7 +140,9 @@ task :typecheck_test => :compile do
139
140
  end
140
141
 
141
142
  task :raap => :compile do
142
- sh %q[ruby test/raap.rb | xargs bundle exec raap -r digest/bubblebabble --library digest --allow-private]
143
+ sh "ruby test/raap/core.rb"
144
+ sh "ruby test/raap/digest.rb"
145
+ sh "ruby test/raap/openssl.rb"
143
146
  end
144
147
 
145
148
  task :rubocop do
data/config.yml CHANGED
@@ -27,18 +27,21 @@ nodes:
27
27
  - name: old_name
28
28
  - name: location
29
29
  - name: comment
30
+ - name: annotations
30
31
  - name: RBS::AST::Declarations::Constant
31
32
  fields:
32
33
  - name: name
33
34
  - name: type
34
35
  - name: location
35
36
  - name: comment
37
+ - name: annotations
36
38
  - name: RBS::AST::Declarations::Global
37
39
  fields:
38
40
  - name: name
39
41
  - name: type
40
42
  - name: location
41
43
  - name: comment
44
+ - name: annotations
42
45
  - name: RBS::AST::Declarations::Interface
43
46
  fields:
44
47
  - name: name
@@ -67,6 +70,7 @@ nodes:
67
70
  - name: old_name
68
71
  - name: location
69
72
  - name: comment
73
+ - name: annotations
70
74
  - name: RBS::AST::Declarations::TypeAlias
71
75
  fields:
72
76
  - name: name
@@ -191,6 +195,7 @@ nodes:
191
195
  - name: variance
192
196
  - name: upper_bound
193
197
  - name: default_type
198
+ - name: unchecked
194
199
  - name: location
195
200
  - name: RBS::MethodType
196
201
  fields:
@@ -213,6 +218,7 @@ nodes:
213
218
  - name: location
214
219
  - name: RBS::Types::Bases::Any
215
220
  fields:
221
+ - name: todo
216
222
  - name: location
217
223
  - name: RBS::Types::Bases::Bool
218
224
  fields:
data/core/data.rbs CHANGED
@@ -411,5 +411,5 @@ class Data
411
411
  # out = origin.with(z: 1) # ArgumentError: unknown keyword: :z
412
412
  # some_point = origin.with(1, 2) # ArgumentError: expected keyword arguments, got positional arguments
413
413
  #
414
- def with: (**untyped) -> instance
414
+ def with: (**untyped) -> self
415
415
  end
data/core/enumerator.rbs CHANGED
@@ -613,7 +613,18 @@ end
613
613
  # This type of objects can be created by Enumerable#chain and Enumerator#+.
614
614
  #
615
615
  class Enumerator::Chain[out Elem] < Enumerator[Elem, void]
616
- include Enumerable[Elem]
616
+ # <!--
617
+ # rdoc-file=enumerator.c
618
+ # - Enumerator::Chain.new(*enums) -> enum
619
+ # -->
620
+ # Generates a new enumerator object that iterates over the elements of given
621
+ # enumerable objects in sequence.
622
+ #
623
+ # e = Enumerator::Chain.new(1..3, [4, 5])
624
+ # e.to_a #=> [1, 2, 3, 4, 5]
625
+ # e.size #=> 5
626
+ #
627
+ def initialize: (*_Each[Elem] enums) -> void
617
628
 
618
629
  # <!--
619
630
  # rdoc-file=enumerator.c
@@ -626,5 +637,6 @@ class Enumerator::Chain[out Elem] < Enumerator[Elem, void]
626
637
  #
627
638
  # If no block is given, returns an enumerator.
628
639
  #
629
- def each: () { (Elem) -> void } -> void
640
+ def each: () { (Elem) -> void } -> self
641
+ | () -> Enumerator[Elem, self]
630
642
  end
data/core/exception.rbs CHANGED
@@ -99,24 +99,31 @@ class Exception
99
99
  # rdoc-file=error.c
100
100
  # - backtrace -> array or nil
101
101
  # -->
102
- # Returns a backtrace value for `self`; the returned value depends on the form
103
- # of the stored backtrace value:
102
+ # Returns the backtrace (the list of code locations that led to the exception),
103
+ # as an array of strings.
104
104
  #
105
- # * Array of Thread::Backtrace::Location objects: returns the array of strings
106
- # given by `Exception#backtrace_locations.map {|loc| loc.to_s }`. This is
107
- # the normal case, where the backtrace value was stored by Kernel#raise.
108
- # * Array of strings: returns that array. This is the unusual case, where the
109
- # backtrace value was explicitly stored as an array of strings.
110
- # * `nil`: returns `nil`.
105
+ # Example (assuming the code is stored in the file named `t.rb`):
111
106
  #
112
- # Example:
107
+ # def division(numerator, denominator)
108
+ # numerator / denominator
109
+ # end
113
110
  #
114
111
  # begin
115
- # 1 / 0
116
- # rescue => x
117
- # x.backtrace.take(2)
112
+ # division(1, 0)
113
+ # rescue => ex
114
+ # p ex.backtrace
115
+ # # ["t.rb:2:in 'Integer#/'", "t.rb:2:in 'Object#division'", "t.rb:6:in '<main>'"]
116
+ # loc = ex.backtrace.first
117
+ # p loc.class
118
+ # # String
118
119
  # end
119
- # # => ["(irb):132:in `/'", "(irb):132:in `<top (required)>'"]
120
+ #
121
+ # The value returned by this method migth be adjusted when raising (see
122
+ # Kernel#raise), or during intermediate handling by #set_backtrace.
123
+ #
124
+ # See also #backtrace_locations that provide the same value, as structured
125
+ # objects. (Note though that two values might not be consistent with each other
126
+ # when backtraces are manually adjusted.)
120
127
  #
121
128
  # see [Backtraces](rdoc-ref:exceptions.md@Backtraces).
122
129
  #
@@ -126,20 +133,37 @@ class Exception
126
133
  # rdoc-file=error.c
127
134
  # - backtrace_locations -> array or nil
128
135
  # -->
129
- # Returns a backtrace value for `self`; the returned value depends on the form
130
- # of the stored backtrace value:
136
+ # Returns the backtrace (the list of code locations that led to the exception),
137
+ # as an array of Thread::Backtrace::Location instances.
131
138
  #
132
- # * Array of Thread::Backtrace::Location objects: returns that array.
133
- # * Array of strings or `nil`: returns `nil`.
139
+ # Example (assuming the code is stored in the file named `t.rb`):
134
140
  #
135
- # Example:
141
+ # def division(numerator, denominator)
142
+ # numerator / denominator
143
+ # end
136
144
  #
137
145
  # begin
138
- # 1 / 0
139
- # rescue => x
140
- # x.backtrace_locations.take(2)
146
+ # division(1, 0)
147
+ # rescue => ex
148
+ # p ex.backtrace_locations
149
+ # # ["t.rb:2:in 'Integer#/'", "t.rb:2:in 'Object#division'", "t.rb:6:in '<main>'"]
150
+ # loc = ex.backtrace_locations.first
151
+ # p loc.class
152
+ # # Thread::Backtrace::Location
153
+ # p loc.path
154
+ # # "t.rb"
155
+ # p loc.lineno
156
+ # # 2
157
+ # p loc.label
158
+ # # "Integer#/"
141
159
  # end
142
- # # => ["(irb):150:in `/'", "(irb):150:in `<top (required)>'"]
160
+ #
161
+ # The value returned by this method might be adjusted when raising (see
162
+ # Kernel#raise), or during intermediate handling by #set_backtrace.
163
+ #
164
+ # See also #backtrace that provide the same value as an array of strings. (Note
165
+ # though that two values might not be consistent with each other when backtraces
166
+ # are manually adjusted.)
143
167
  #
144
168
  # See [Backtraces](rdoc-ref:exceptions.md@Backtraces).
145
169
  #
@@ -246,7 +270,7 @@ class Exception
246
270
  # x0..equal?(x1) # => false
247
271
  #
248
272
  def exception: (?self) -> self
249
- | (string | _ToS message) -> instance
273
+ | (string | _ToS message) -> self
250
274
 
251
275
  # <!--
252
276
  # rdoc-file=error.c
@@ -294,15 +318,100 @@ class Exception
294
318
  # rdoc-file=error.c
295
319
  # - set_backtrace(value) -> value
296
320
  # -->
297
- # Sets the backtrace value for `self`; returns the given +value:
321
+ # Sets the backtrace value for `self`; returns the given `value`.
298
322
  #
299
- # x = RuntimeError.new('Boom')
300
- # x.set_backtrace(%w[foo bar baz]) # => ["foo", "bar", "baz"]
301
- # x.backtrace # => ["foo", "bar", "baz"]
323
+ # The `value` might be:
302
324
  #
303
- # The given `value` must be an array of strings, a single string, or `nil`.
325
+ # * an array of Thread::Backtrace::Location;
326
+ # * an array of String instances;
327
+ # * a single String instance; or
328
+ # * `nil`.
329
+ #
330
+ # Using array of Thread::Backtrace::Location is the most consistent option: it
331
+ # sets both #backtrace and #backtrace_locations. It should be preferred when
332
+ # possible. The suitable array of locations can be obtained from
333
+ # Kernel#caller_locations, copied from another error, or just set to the
334
+ # adjusted result of the current error's #backtrace_locations:
335
+ #
336
+ # require 'json'
337
+ #
338
+ # def parse_payload(text)
339
+ # JSON.parse(text) # test.rb, line 4
340
+ # rescue JSON::ParserError => ex
341
+ # ex.set_backtrace(ex.backtrace_locations[2...])
342
+ # raise
343
+ # end
304
344
  #
305
- # Does not affect the value returned by #backtrace_locations.
345
+ # parse_payload('{"wrong: "json"')
346
+ # # test.rb:4:in 'Object#parse_payload': unexpected token at '{"wrong: "json"' (JSON::ParserError)
347
+ # #
348
+ # # An error points to the body of parse_payload method,
349
+ # # hiding the parts of the backtrace related to the internals
350
+ # # of the "json" library
351
+ #
352
+ # # The error has both #backtace and #backtrace_locations set
353
+ # # consistently:
354
+ # begin
355
+ # parse_payload('{"wrong: "json"')
356
+ # rescue => ex
357
+ # p ex.backtrace
358
+ # # ["test.rb:4:in 'Object#parse_payload'", "test.rb:20:in '<main>'"]
359
+ # p ex.backtrace_locations
360
+ # # ["test.rb:4:in 'Object#parse_payload'", "test.rb:20:in '<main>'"]
361
+ # end
362
+ #
363
+ # When the desired stack of locations is not available and should be constructed
364
+ # from scratch, an array of strings or a singular string can be used. In this
365
+ # case, only #backtrace is affected:
366
+ #
367
+ # def parse_payload(text)
368
+ # JSON.parse(text)
369
+ # rescue JSON::ParserError => ex
370
+ # ex.set_backtrace(["dsl.rb:34", "framework.rb:1"])
371
+ # # The error have the new value in #backtrace:
372
+ # p ex.backtrace
373
+ # # ["dsl.rb:34", "framework.rb:1"]
374
+ #
375
+ # # but the original one in #backtrace_locations
376
+ # p ex.backtrace_locations
377
+ # # [".../json/common.rb:221:in 'JSON::Ext::Parser.parse'", ...]
378
+ # end
379
+ #
380
+ # parse_payload('{"wrong: "json"')
381
+ #
382
+ # Calling #set_backtrace with `nil` clears up #backtrace but doesn't affect
383
+ # #backtrace_locations:
384
+ #
385
+ # def parse_payload(text)
386
+ # JSON.parse(text)
387
+ # rescue JSON::ParserError => ex
388
+ # ex.set_backtrace(nil)
389
+ # p ex.backtrace
390
+ # # nil
391
+ # p ex.backtrace_locations
392
+ # # [".../json/common.rb:221:in 'JSON::Ext::Parser.parse'", ...]
393
+ # end
394
+ #
395
+ # parse_payload('{"wrong: "json"')
396
+ #
397
+ # On reraising of such an exception, both #backtrace and #backtrace_locations is
398
+ # set to the place of reraising:
399
+ #
400
+ # def parse_payload(text)
401
+ # JSON.parse(text)
402
+ # rescue JSON::ParserError => ex
403
+ # ex.set_backtrace(nil)
404
+ # raise # test.rb, line 7
405
+ # end
406
+ #
407
+ # begin
408
+ # parse_payload('{"wrong: "json"')
409
+ # rescue => ex
410
+ # p ex.backtrace
411
+ # # ["test.rb:7:in 'Object#parse_payload'", "test.rb:11:in '<main>'"]
412
+ # p ex.backtrace_locations
413
+ # # ["test.rb:7:in 'Object#parse_payload'", "test.rb:11:in '<main>'"]
414
+ # end
306
415
  #
307
416
  # See [Backtraces](rdoc-ref:exceptions.md@Backtraces).
308
417
  #
@@ -358,16 +467,16 @@ class Exception
358
467
  # Output:
359
468
  #
360
469
  # "divided by 0"
361
- # ["t.rb:3:in `/': divided by 0 (ZeroDivisionError)",
362
- # "\tfrom t.rb:3:in `baz'",
363
- # "\tfrom t.rb:10:in `bar'",
364
- # "\tfrom t.rb:11:in `foo'",
365
- # "\tfrom t.rb:12:in `<main>'"]
366
- # ["t.rb:3:in `/': \e[1mdivided by 0 (\e[1;4mZeroDivisionError\e[m\e[1m)\e[m",
367
- # "\tfrom t.rb:3:in `baz'",
368
- # "\tfrom t.rb:10:in `bar'",
369
- # "\tfrom t.rb:11:in `foo'",
370
- # "\tfrom t.rb:12:in `<main>'"]
470
+ # ["t.rb:3:in 'Integer#/': divided by 0 (ZeroDivisionError)",
471
+ # "\tfrom t.rb:3:in 'Object#baz'",
472
+ # "\tfrom t.rb:10:in 'Object#bar'",
473
+ # "\tfrom t.rb:11:in 'Object#foo'",
474
+ # "\tfrom t.rb:12:in '<main>'"]
475
+ # ["t.rb:3:in 'Integer#/': \e[1mdivided by 0 (\e[1;4mZeroDivisionError\e[m\e[1m)\e[m",
476
+ # "\tfrom t.rb:3:in 'Object#baz'",
477
+ # "\tfrom t.rb:10:in 'Object#bar'",
478
+ # "\tfrom t.rb:11:in 'Object#foo'",
479
+ # "\tfrom t.rb:12:in '<main>'"]
371
480
  #
372
481
  # An overriding method should be careful with ANSI code enhancements; see
373
482
  # [Messages](rdoc-ref:exceptions.md@Messages).
data/core/gc.rbs CHANGED
@@ -111,7 +111,7 @@ module GC
111
111
  # `:HAVE_FINALIZE`
112
112
  # :
113
113
  #
114
- def self.raw_data: () -> Array[Hash[Symbol, untyped]]
114
+ def self.raw_data: () -> Array[Hash[Symbol, untyped]]?
115
115
 
116
116
  # <!--
117
117
  # rdoc-file=gc.c
@@ -587,7 +587,7 @@ module GC
587
587
 
588
588
  # The type that `GC.compact` and related functions can return.
589
589
  #
590
- type compact_info = Hash[:considered | :moved |:moved_up | :moved_down, Hash[Symbol, Integer]]
590
+ type compact_info = Hash[:considered | :moved | :moved_up | :moved_down, Hash[Symbol, Integer]]
591
591
 
592
592
  # <!--
593
593
  # rdoc-file=gc.rb
data/core/io.rbs CHANGED
@@ -2278,7 +2278,7 @@ class IO < Object
2278
2278
  # potential security vulnerabilities if called with untrusted input; see
2279
2279
  # [Command Injection](rdoc-ref:command_injection.rdoc).
2280
2280
  #
2281
- def self.binread: (String name, ?Integer length, ?Integer offset) -> String
2281
+ def self.binread: (String name, ?Integer? length, ?Integer offset) -> String
2282
2282
 
2283
2283
  # <!--
2284
2284
  # rdoc-file=io.c
@@ -2343,7 +2343,7 @@ class IO < Object
2343
2343
  # IO.copy_stream('t.txt', 't.tmp', 11, 11) # => 11
2344
2344
  # IO.read('t.tmp') # => "Second line"
2345
2345
  #
2346
- def self.copy_stream: (String | _Reader | _ReaderPartial src, String | _Writer dst, ?Integer copy_length, ?Integer src_offset) -> Integer
2346
+ def self.copy_stream: (String | _Reader | _ReaderPartial src, String | _Writer dst, ?Integer? copy_length, ?Integer src_offset) -> Integer
2347
2347
 
2348
2348
  # <!--
2349
2349
  # rdoc-file=io.c
@@ -2716,7 +2716,7 @@ class IO < Object
2716
2716
  # * [Open Options](rdoc-ref:IO@Open+Options).
2717
2717
  # * [Encoding options](rdoc-ref:encodings.rdoc@Encoding+Options).
2718
2718
  #
2719
- def self.read: (String name, ?Integer length, ?Integer offset, ?external_encoding: String | Encoding | nil, ?internal_encoding: String | Encoding | nil, ?encoding: String | Encoding | nil, ?textmode: boolish, ?binmode: boolish, ?autoclose: boolish, ?mode: String) -> String
2719
+ def self.read: (String name, ?Integer? length, ?Integer offset, ?external_encoding: String | Encoding | nil, ?internal_encoding: String | Encoding | nil, ?encoding: String | Encoding | nil, ?textmode: boolish, ?binmode: boolish, ?autoclose: boolish, ?mode: String) -> String
2720
2720
 
2721
2721
  # <!--
2722
2722
  # rdoc-file=io.c
@@ -3251,6 +3251,10 @@ class IO < Object
3251
3251
  # f.close
3252
3252
  #
3253
3253
  alias to_i fileno
3254
+
3255
+ interface _ForFd[RET]
3256
+ def for_fd: (?) -> RET
3257
+ end
3254
3258
  end
3255
3259
 
3256
3260
  IO::APPEND: Integer