rbs 3.9.5 → 3.10.4

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 (194) hide show
  1. checksums.yaml +4 -4
  2. data/.clang-format +74 -0
  3. data/.clangd +2 -0
  4. data/.github/workflows/c-check.yml +56 -0
  5. data/.github/workflows/comments.yml +4 -2
  6. data/.github/workflows/ruby.yml +37 -19
  7. data/.github/workflows/typecheck.yml +1 -1
  8. data/.github/workflows/windows.yml +1 -1
  9. data/.gitignore +4 -0
  10. data/CHANGELOG.md +84 -0
  11. data/README.md +38 -1
  12. data/Rakefile +152 -23
  13. data/config.yml +190 -62
  14. data/core/array.rbs +96 -46
  15. data/core/comparable.rbs +13 -6
  16. data/core/complex.rbs +40 -25
  17. data/core/dir.rbs +4 -4
  18. data/core/encoding.rbs +6 -9
  19. data/core/enumerable.rbs +90 -3
  20. data/core/enumerator.rbs +43 -1
  21. data/core/errno.rbs +8 -0
  22. data/core/errors.rbs +28 -1
  23. data/core/exception.rbs +2 -2
  24. data/core/fiber.rbs +29 -20
  25. data/core/file.rbs +49 -19
  26. data/core/file_test.rbs +1 -1
  27. data/core/float.rbs +224 -33
  28. data/core/gc.rbs +417 -281
  29. data/core/hash.rbs +1023 -727
  30. data/core/integer.rbs +104 -63
  31. data/core/io/buffer.rbs +21 -10
  32. data/core/io/wait.rbs +11 -33
  33. data/core/io.rbs +14 -12
  34. data/core/kernel.rbs +61 -51
  35. data/core/marshal.rbs +1 -1
  36. data/core/match_data.rbs +1 -1
  37. data/core/math.rbs +42 -3
  38. data/core/method.rbs +63 -25
  39. data/core/module.rbs +101 -23
  40. data/core/nil_class.rbs +3 -3
  41. data/core/numeric.rbs +25 -17
  42. data/core/object.rbs +3 -3
  43. data/core/object_space.rbs +21 -15
  44. data/core/pathname.rbs +1272 -0
  45. data/core/proc.rbs +30 -24
  46. data/core/process.rbs +2 -2
  47. data/core/ractor.rbs +361 -509
  48. data/core/range.rbs +7 -8
  49. data/core/rational.rbs +56 -34
  50. data/core/rbs/unnamed/argf.rbs +2 -2
  51. data/core/rbs/unnamed/env_class.rbs +1 -1
  52. data/core/rbs/unnamed/random.rbs +4 -2
  53. data/core/regexp.rbs +25 -20
  54. data/core/ruby.rbs +53 -0
  55. data/core/ruby_vm.rbs +6 -4
  56. data/core/rubygems/errors.rbs +3 -70
  57. data/core/rubygems/rubygems.rbs +11 -79
  58. data/core/rubygems/version.rbs +2 -3
  59. data/core/set.rbs +488 -359
  60. data/core/signal.rbs +24 -14
  61. data/core/string.rbs +3157 -1239
  62. data/core/struct.rbs +1 -1
  63. data/core/symbol.rbs +17 -11
  64. data/core/thread.rbs +95 -33
  65. data/core/time.rbs +35 -9
  66. data/core/trace_point.rbs +7 -4
  67. data/core/unbound_method.rbs +14 -6
  68. data/docs/aliases.md +79 -0
  69. data/docs/collection.md +2 -2
  70. data/docs/encoding.md +56 -0
  71. data/docs/gem.md +0 -1
  72. data/docs/sigs.md +3 -3
  73. data/ext/rbs_extension/ast_translation.c +1016 -0
  74. data/ext/rbs_extension/ast_translation.h +37 -0
  75. data/ext/rbs_extension/class_constants.c +155 -0
  76. data/{include/rbs/constants.h → ext/rbs_extension/class_constants.h} +7 -1
  77. data/ext/rbs_extension/compat.h +10 -0
  78. data/ext/rbs_extension/extconf.rb +25 -1
  79. data/ext/rbs_extension/legacy_location.c +317 -0
  80. data/ext/rbs_extension/legacy_location.h +45 -0
  81. data/ext/rbs_extension/main.c +357 -14
  82. data/ext/rbs_extension/rbs_extension.h +6 -21
  83. data/ext/rbs_extension/rbs_string_bridging.c +9 -0
  84. data/ext/rbs_extension/rbs_string_bridging.h +24 -0
  85. data/include/rbs/ast.h +687 -0
  86. data/include/rbs/defines.h +86 -0
  87. data/include/rbs/lexer.h +199 -0
  88. data/include/rbs/location.h +59 -0
  89. data/include/rbs/parser.h +135 -0
  90. data/include/rbs/string.h +47 -0
  91. data/include/rbs/util/rbs_allocator.h +59 -0
  92. data/include/rbs/util/rbs_assert.h +20 -0
  93. data/include/rbs/util/rbs_buffer.h +83 -0
  94. data/include/rbs/util/rbs_constant_pool.h +6 -67
  95. data/include/rbs/util/rbs_encoding.h +282 -0
  96. data/include/rbs/util/rbs_unescape.h +24 -0
  97. data/include/rbs.h +1 -2
  98. data/lib/rbs/annotate/formatter.rb +3 -13
  99. data/lib/rbs/annotate/rdoc_annotator.rb +3 -1
  100. data/lib/rbs/annotate/rdoc_source.rb +1 -1
  101. data/lib/rbs/cli/validate.rb +2 -2
  102. data/lib/rbs/cli.rb +1 -1
  103. data/lib/rbs/collection/config/lockfile_generator.rb +8 -0
  104. data/lib/rbs/definition_builder/ancestor_builder.rb +5 -5
  105. data/lib/rbs/environment.rb +64 -59
  106. data/lib/rbs/environment_loader.rb +0 -6
  107. data/lib/rbs/errors.rb +1 -1
  108. data/lib/rbs/parser_aux.rb +5 -0
  109. data/lib/rbs/resolver/constant_resolver.rb +2 -2
  110. data/lib/rbs/resolver/type_name_resolver.rb +124 -38
  111. data/lib/rbs/subtractor.rb +3 -1
  112. data/lib/rbs/test/type_check.rb +14 -0
  113. data/lib/rbs/types.rb +3 -1
  114. data/lib/rbs/version.rb +1 -1
  115. data/lib/rbs.rb +1 -1
  116. data/lib/rdoc/discover.rb +1 -1
  117. data/lib/rdoc_plugin/parser.rb +3 -3
  118. data/rbs.gemspec +1 -0
  119. data/sig/annotate/formatter.rbs +2 -2
  120. data/sig/annotate/rdoc_annotater.rbs +1 -1
  121. data/sig/environment.rbs +57 -6
  122. data/sig/manifest.yaml +0 -1
  123. data/sig/parser.rbs +20 -0
  124. data/sig/resolver/type_name_resolver.rbs +38 -7
  125. data/sig/types.rbs +4 -1
  126. data/src/ast.c +1256 -0
  127. data/src/lexer.c +2956 -0
  128. data/src/lexer.re +147 -0
  129. data/src/lexstate.c +205 -0
  130. data/src/location.c +71 -0
  131. data/src/parser.c +3507 -0
  132. data/src/string.c +41 -0
  133. data/src/util/rbs_allocator.c +165 -0
  134. data/src/util/rbs_assert.c +19 -0
  135. data/src/util/rbs_buffer.c +54 -0
  136. data/src/util/rbs_constant_pool.c +18 -88
  137. data/src/util/rbs_encoding.c +21308 -0
  138. data/src/util/rbs_unescape.c +167 -0
  139. data/stdlib/bigdecimal/0/big_decimal.rbs +100 -82
  140. data/stdlib/bigdecimal-math/0/big_math.rbs +169 -8
  141. data/stdlib/cgi/0/core.rbs +9 -393
  142. data/stdlib/cgi/0/manifest.yaml +1 -0
  143. data/stdlib/cgi-escape/0/escape.rbs +171 -0
  144. data/stdlib/coverage/0/coverage.rbs +3 -1
  145. data/stdlib/date/0/date.rbs +67 -59
  146. data/stdlib/date/0/date_time.rbs +1 -1
  147. data/stdlib/delegate/0/delegator.rbs +10 -7
  148. data/stdlib/erb/0/erb.rbs +737 -347
  149. data/stdlib/fileutils/0/fileutils.rbs +18 -13
  150. data/stdlib/forwardable/0/forwardable.rbs +3 -0
  151. data/stdlib/json/0/json.rbs +68 -48
  152. data/stdlib/net-http/0/net-http.rbs +3 -0
  153. data/stdlib/objspace/0/objspace.rbs +9 -4
  154. data/stdlib/open-uri/0/open-uri.rbs +40 -0
  155. data/stdlib/openssl/0/openssl.rbs +331 -228
  156. data/stdlib/optparse/0/optparse.rbs +3 -3
  157. data/stdlib/pathname/0/pathname.rbs +9 -1379
  158. data/stdlib/psych/0/psych.rbs +3 -3
  159. data/stdlib/rdoc/0/code_object.rbs +2 -2
  160. data/stdlib/rdoc/0/comment.rbs +2 -0
  161. data/stdlib/rdoc/0/options.rbs +76 -0
  162. data/stdlib/rdoc/0/rdoc.rbs +7 -5
  163. data/stdlib/rdoc/0/store.rbs +1 -1
  164. data/stdlib/resolv/0/resolv.rbs +25 -68
  165. data/stdlib/ripper/0/ripper.rbs +5 -2
  166. data/stdlib/singleton/0/singleton.rbs +3 -0
  167. data/stdlib/socket/0/socket.rbs +13 -1
  168. data/stdlib/socket/0/tcp_socket.rbs +10 -2
  169. data/stdlib/stringio/0/stringio.rbs +1176 -85
  170. data/stdlib/strscan/0/string_scanner.rbs +31 -31
  171. data/stdlib/tempfile/0/tempfile.rbs +3 -3
  172. data/stdlib/time/0/time.rbs +1 -1
  173. data/stdlib/timeout/0/timeout.rbs +63 -7
  174. data/stdlib/tsort/0/cyclic.rbs +3 -0
  175. data/stdlib/uri/0/common.rbs +11 -2
  176. data/stdlib/uri/0/file.rbs +1 -1
  177. data/stdlib/uri/0/generic.rbs +17 -16
  178. data/stdlib/uri/0/rfc2396_parser.rbs +6 -7
  179. data/stdlib/zlib/0/zstream.rbs +1 -0
  180. metadata +57 -17
  181. data/ext/rbs_extension/lexer.c +0 -2728
  182. data/ext/rbs_extension/lexer.h +0 -179
  183. data/ext/rbs_extension/lexer.re +0 -147
  184. data/ext/rbs_extension/lexstate.c +0 -175
  185. data/ext/rbs_extension/location.c +0 -325
  186. data/ext/rbs_extension/location.h +0 -85
  187. data/ext/rbs_extension/parser.c +0 -2982
  188. data/ext/rbs_extension/parser.h +0 -18
  189. data/ext/rbs_extension/parserstate.c +0 -411
  190. data/ext/rbs_extension/parserstate.h +0 -163
  191. data/ext/rbs_extension/unescape.c +0 -32
  192. data/include/rbs/ruby_objs.h +0 -72
  193. data/src/constants.c +0 -153
  194. data/src/ruby_objs.c +0 -799
data/Rakefile CHANGED
@@ -11,12 +11,26 @@ bin = File.join(__dir__, "bin")
11
11
 
12
12
  Rake::ExtensionTask.new("rbs_extension")
13
13
 
14
+ compile_task = Rake::Task[:compile]
15
+
16
+ task :setup_extconf_compile_commands_json do
17
+ ENV["COMPILE_COMMANDS_JSON"] = "1"
18
+ end
19
+
20
+ compile_task.prerequisites.unshift(:setup_extconf_compile_commands_json)
21
+
14
22
  test_config = lambda do |t|
15
23
  t.libs << "test"
16
24
  t.libs << "lib"
17
25
  t.test_files = FileList["test/**/*_test.rb"].reject do |path|
18
26
  path =~ %r{test/stdlib/}
19
27
  end
28
+ if defined?(RubyMemcheck)
29
+ if t.is_a?(RubyMemcheck::TestTask)
30
+ t.verbose = true
31
+ t.options = '-v'
32
+ end
33
+ end
20
34
  end
21
35
 
22
36
  Rake::TestTask.new(test: :compile, &test_config)
@@ -36,12 +50,13 @@ end
36
50
  multitask :default => [:test, :stdlib_test, :typecheck_test, :rubocop, :validate, :test_doc]
37
51
 
38
52
  task :lexer do
39
- sh "re2c -W --no-generation-date -o ext/rbs_extension/lexer.c ext/rbs_extension/lexer.re"
53
+ sh "re2c -W --no-generation-date -o src/lexer.c src/lexer.re"
54
+ sh "clang-format -i -style=file src/lexer.c"
40
55
  end
41
56
 
42
57
  task :confirm_lexer => :lexer do
43
58
  puts "Testing if lexer.c is updated with respect to lexer.re"
44
- sh "git diff --exit-code ext/rbs_extension/lexer.c"
59
+ sh "git diff --exit-code src/lexer.c"
45
60
  end
46
61
 
47
62
  task :confirm_templates => :templates do
@@ -49,6 +64,84 @@ task :confirm_templates => :templates do
49
64
  sh "git diff --exit-code -- include src"
50
65
  end
51
66
 
67
+ # Task to format C code using clang-format
68
+ namespace :format do
69
+ dirs = ["src", "ext", "include"]
70
+
71
+ # Find all C source and header files
72
+ files = `find #{dirs.join(" ")} -type f \\( -name "*.c" -o -name "*.h" \\)`.split("\n")
73
+
74
+ desc "Format C source files using clang-format"
75
+ task :c do
76
+ puts "Formatting C files..."
77
+
78
+ # Check if clang-format is installed
79
+ unless system("which clang-format > /dev/null 2>&1")
80
+ abort "Error: clang-format not found. Please install clang-format first."
81
+ end
82
+
83
+ if files.empty?
84
+ puts "No C files found to format"
85
+ next
86
+ end
87
+
88
+ puts "Found #{files.length} files to format (excluding generated files)"
89
+
90
+ exit_status = 0
91
+ files.each do |file|
92
+ puts "Formatting #{file}"
93
+ unless system("clang-format -i -style=file #{file}")
94
+ puts "❌ Error formatting #{file}"
95
+ exit_status = 1
96
+ end
97
+ end
98
+
99
+ exit exit_status unless exit_status == 0
100
+ puts "✅ All files formatted successfully"
101
+ end
102
+
103
+ desc "Check if C source files are properly formatted"
104
+ task :c_check do
105
+ puts "Checking C file formatting..."
106
+
107
+ # Check if clang-format is installed
108
+ unless system("which clang-format > /dev/null 2>&1")
109
+ abort "Error: clang-format not found. Please install clang-format first."
110
+ end
111
+
112
+ if files.empty?
113
+ puts "No C files found to check"
114
+ next
115
+ end
116
+
117
+ puts "Found #{files.length} files to check (excluding generated files)"
118
+
119
+ needs_format = false
120
+ files.each do |file|
121
+ formatted = `clang-format -style=file #{file}`
122
+ original = File.read(file)
123
+
124
+ if formatted != original
125
+ puts "❌ #{file} needs formatting"
126
+ puts "Diff:"
127
+ # Save formatted version to temp file and run diff
128
+ temp_file = "#{file}.formatted"
129
+ File.write(temp_file, formatted)
130
+ system("diff -u #{file} #{temp_file}")
131
+ File.unlink(temp_file)
132
+ needs_format = true
133
+ end
134
+ end
135
+
136
+ if needs_format
137
+ warn "Some files need formatting. Run 'rake format:c' to format them."
138
+ exit 1
139
+ else
140
+ puts "✅ All files are properly formatted"
141
+ end
142
+ end
143
+ end
144
+
52
145
  rule ".c" => ".re" do |t|
53
146
  puts "⚠️⚠️⚠️ #{t.name} is older than #{t.source}. You may need to run `rake lexer` ⚠️⚠️⚠️"
54
147
  end
@@ -70,17 +163,22 @@ task :confirm_annotation do
70
163
  end
71
164
 
72
165
  task :templates do
73
- sh "#{ruby} templates/template.rb include/rbs/constants.h"
74
- sh "#{ruby} templates/template.rb include/rbs/ruby_objs.h"
75
- sh "#{ruby} templates/template.rb src/constants.c"
76
- sh "#{ruby} templates/template.rb src/ruby_objs.c"
166
+ sh "#{ruby} templates/template.rb ext/rbs_extension/ast_translation.h"
167
+ sh "#{ruby} templates/template.rb ext/rbs_extension/ast_translation.c"
168
+
169
+ sh "#{ruby} templates/template.rb ext/rbs_extension/class_constants.h"
170
+ sh "#{ruby} templates/template.rb ext/rbs_extension/class_constants.c"
171
+
172
+ sh "#{ruby} templates/template.rb include/rbs/ast.h"
173
+ sh "#{ruby} templates/template.rb src/ast.c"
174
+
175
+ # Format the generated files
176
+ Rake::Task["format:c"].invoke
77
177
  end
78
178
 
79
- task :compile => "ext/rbs_extension/lexer.c"
80
- task :compile => "include/rbs/constants.h"
81
- task :compile => "include/rbs/ruby_objs.h"
82
- task :compile => "src/constants.c"
83
- task :compile => "src/ruby_objs.c"
179
+ task :compile => "ext/rbs_extension/class_constants.h"
180
+ task :compile => "ext/rbs_extension/class_constants.c"
181
+ task :compile => "src/lexer.c"
84
182
 
85
183
  task :test_doc do
86
184
  files = Dir.chdir(File.expand_path('..', __FILE__)) do
@@ -114,7 +212,14 @@ task :validate => :compile do
114
212
  end
115
213
 
116
214
  libs.each do |lib|
117
- sh "#{ruby} #{rbs} -r #{lib} validate --exit-error-on-syntax-error"
215
+ args = ["-r", lib]
216
+
217
+ if lib == "rbs"
218
+ args << "-r"
219
+ args << "prism"
220
+ end
221
+
222
+ sh "#{ruby} #{rbs} #{args.join(' ')} validate --exit-error-on-syntax-error"
118
223
  end
119
224
  end
120
225
 
@@ -126,7 +231,7 @@ end
126
231
 
127
232
  task :stdlib_test => :compile do
128
233
  test_files = FileList["test/stdlib/**/*_test.rb"].reject do |path|
129
- path =~ %r{Ractor} || path =~ %r{Encoding} || path =~ %r{CGI_test}
234
+ path =~ %r{Ractor} || path =~ %r{Encoding} || path =~ %r{CGI-escape_test}
130
235
  end
131
236
 
132
237
  if ENV["RANDOMIZE_STDLIB_TEST_ORDER"] == "true"
@@ -135,19 +240,21 @@ task :stdlib_test => :compile do
135
240
 
136
241
  sh "#{ruby} -Ilib #{bin}/test_runner.rb #{test_files.join(' ')}"
137
242
  # TODO: Ractor tests need to be run in a separate process
138
- sh "#{ruby} -Ilib #{bin}/test_runner.rb test/stdlib/CGI_test.rb"
243
+ sh "#{ruby} -Ilib #{bin}/test_runner.rb test/stdlib/CGI-escape_test.rb"
139
244
  sh "#{ruby} -Ilib #{bin}/test_runner.rb test/stdlib/Ractor_test.rb"
140
245
  sh "#{ruby} -Ilib #{bin}/test_runner.rb test/stdlib/Encoding_test.rb"
141
246
  end
142
247
 
143
248
  task :typecheck_test => :compile do
144
- FileList["test/typecheck/*"].each do |test|
145
- Dir.chdir(test) do
146
- expectations = File.join(test, "steep_expectations.yml")
147
- if File.exist?(expectations)
148
- sh "steep check --with_expectations"
149
- else
150
- sh "steep check"
249
+ Bundler.with_unbundled_env do
250
+ FileList["test/typecheck/*"].each do |test|
251
+ Dir.chdir(test) do
252
+ expectations = File.join(test, "steep_expectations.yml")
253
+ if File.exist?(expectations)
254
+ sh "#{__dir__}/bin/steep check --with_expectations"
255
+ else
256
+ sh "#{__dir__}/bin/steep check"
257
+ end
151
258
  end
152
259
  end
153
260
  end
@@ -228,7 +335,7 @@ namespace :generate do
228
335
  class <%= target %>SingletonTest < Test::Unit::TestCase
229
336
  include TestHelper
230
337
 
231
- # library "pathname", "securerandom" # Declare library signatures to load
338
+ # library "logger", "securerandom" # Declare library signatures to load
232
339
  testing "singleton(::<%= target %>)"
233
340
 
234
341
  <%- class_methods.each do |method_name, definition| -%>
@@ -247,7 +354,7 @@ namespace :generate do
247
354
  class <%= target %>Test < Test::Unit::TestCase
248
355
  include TestHelper
249
356
 
250
- # library "pathname", "securerandom" # Declare library signatures to load
357
+ # library "logger", "securerandom" # Declare library signatures to load
251
358
  testing "::<%= target %>"
252
359
 
253
360
  <%- instance_methods.each do |method_name, definition| -%>
@@ -430,3 +537,25 @@ task :changelog do
430
537
  puts " (🤑 There is no *unreleased* pull request associated to the milestone.)"
431
538
  end
432
539
  end
540
+
541
+ desc "Compile extension without C23 extensions"
542
+ task :compile_c99 do
543
+ ENV["TEST_NO_C23"] = "true"
544
+ Rake::Task[:"compile"].invoke
545
+ ensure
546
+ ENV.delete("TEST_NO_C23")
547
+ end
548
+
549
+ task :prepare_bench do
550
+ ENV.delete("DEBUG")
551
+ Rake::Task[:"clobber"].invoke
552
+ Rake::Task[:"templates"].invoke
553
+ Rake::Task[:"compile"].invoke
554
+ end
555
+
556
+ task :prepare_profiling do
557
+ ENV["DEBUG"] = "1"
558
+ Rake::Task[:"clobber"].invoke
559
+ Rake::Task[:"templates"].invoke
560
+ Rake::Task[:"compile"].invoke
561
+ end