rbs 3.8.1 → 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 (90) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/dependabot.yml +1 -1
  3. data/.github/workflows/typecheck.yml +2 -0
  4. data/.github/workflows/windows.yml +15 -0
  5. data/.rubocop.yml +13 -1
  6. data/Rakefile +5 -2
  7. data/config.yml +6 -0
  8. data/core/data.rbs +1 -1
  9. data/core/enumerator.rbs +14 -2
  10. data/core/exception.rbs +1 -1
  11. data/core/gc.rbs +1 -1
  12. data/core/io.rbs +7 -3
  13. data/core/kernel.rbs +2 -2
  14. data/core/method.rbs +2 -2
  15. data/core/module.rbs +3 -3
  16. data/core/proc.rbs +2 -2
  17. data/core/rbs/unnamed/argf.rbs +3 -3
  18. data/core/rubygems/version.rbs +2 -2
  19. data/core/string.rbs +1 -1
  20. data/core/unbound_method.rbs +1 -1
  21. data/docs/syntax.md +10 -5
  22. data/ext/rbs_extension/extconf.rb +2 -1
  23. data/ext/rbs_extension/location.c +32 -10
  24. data/ext/rbs_extension/location.h +4 -3
  25. data/ext/rbs_extension/main.c +22 -1
  26. data/ext/rbs_extension/parser.c +144 -136
  27. data/ext/rbs_extension/parserstate.c +40 -9
  28. data/ext/rbs_extension/parserstate.h +6 -4
  29. data/include/rbs/ruby_objs.h +6 -6
  30. data/include/rbs/util/rbs_constant_pool.h +219 -0
  31. data/lib/rbs/ast/declarations.rb +9 -4
  32. data/lib/rbs/ast/directives.rb +10 -0
  33. data/lib/rbs/ast/members.rb +2 -0
  34. data/lib/rbs/ast/type_param.rb +2 -2
  35. data/lib/rbs/cli/validate.rb +1 -0
  36. data/lib/rbs/cli.rb +3 -3
  37. data/lib/rbs/collection/config/lockfile_generator.rb +28 -7
  38. data/lib/rbs/collection/sources/rubygems.rb +1 -1
  39. data/lib/rbs/definition.rb +46 -31
  40. data/lib/rbs/definition_builder/ancestor_builder.rb +2 -0
  41. data/lib/rbs/definition_builder.rb +86 -30
  42. data/lib/rbs/environment.rb +33 -18
  43. data/lib/rbs/errors.rb +23 -0
  44. data/lib/rbs/locator.rb +2 -0
  45. data/lib/rbs/method_type.rb +2 -0
  46. data/lib/rbs/parser_aux.rb +38 -1
  47. data/lib/rbs/subtractor.rb +3 -3
  48. data/lib/rbs/test/hook.rb +2 -2
  49. data/lib/rbs/test/type_check.rb +7 -5
  50. data/lib/rbs/types.rb +44 -5
  51. data/lib/rbs/unit_test/spy.rb +4 -2
  52. data/lib/rbs/unit_test/type_assertions.rb +17 -11
  53. data/lib/rbs/validator.rb +4 -0
  54. data/lib/rbs/version.rb +1 -1
  55. data/lib/rbs/writer.rb +10 -5
  56. data/lib/rbs.rb +1 -0
  57. data/rbs.gemspec +1 -1
  58. data/sig/collection/config/lockfile_generator.rbs +1 -1
  59. data/sig/declarations.rbs +10 -3
  60. data/sig/definition.rbs +67 -14
  61. data/sig/definition_builder.rbs +17 -3
  62. data/sig/directives.rbs +17 -1
  63. data/sig/environment.rbs +2 -0
  64. data/sig/errors.rbs +16 -0
  65. data/sig/parser.rbs +5 -1
  66. data/sig/subtractor.rbs +1 -1
  67. data/sig/test/type_check.rbs +2 -2
  68. data/sig/type_param.rbs +1 -1
  69. data/sig/types.rbs +3 -0
  70. data/sig/unit_test/spy.rbs +2 -0
  71. data/sig/unit_test/type_assertions.rbs +2 -0
  72. data/sig/validator.rbs +4 -0
  73. data/sig/writer.rbs +1 -1
  74. data/src/ruby_objs.c +12 -6
  75. data/src/util/rbs_constant_pool.c +342 -0
  76. data/stdlib/cgi/0/core.rbs +10 -0
  77. data/stdlib/json/0/json.rbs +52 -50
  78. data/stdlib/net-http/0/net-http.rbs +2 -2
  79. data/stdlib/openssl/0/openssl.rbs +73 -73
  80. data/stdlib/resolv/0/resolv.rbs +8 -8
  81. data/stdlib/socket/0/addrinfo.rbs +1 -1
  82. data/stdlib/socket/0/unix_socket.rbs +4 -2
  83. data/stdlib/stringio/0/stringio.rbs +1 -1
  84. data/stdlib/uri/0/common.rbs +17 -0
  85. metadata +4 -7
  86. data/templates/include/rbs/constants.h.erb +0 -20
  87. data/templates/include/rbs/ruby_objs.h.erb +0 -10
  88. data/templates/src/constants.c.erb +0 -36
  89. data/templates/src/ruby_objs.c.erb +0 -27
  90. data/templates/template.rb +0 -122
@@ -104,7 +104,9 @@ class UNIXSocket < BasicSocket
104
104
  #
105
105
  # *mode* is the same as the argument passed to IO.for_fd
106
106
  #
107
- def recv_io: (?singleton(BasicSocket), ?String mode) -> BasicSocket
107
+ def recv_io: () -> IO
108
+ | (singleton(Integer)?) -> Integer
109
+ | [T] (IO::_ForFd[T], ?untyped mode) -> T
108
110
 
109
111
  # <!--
110
112
  # rdoc-file=ext/socket/unixsocket.c
@@ -151,7 +153,7 @@ class UNIXSocket < BasicSocket
151
153
  #
152
154
  # *io* may be any kind of IO object or integer file descriptor.
153
155
  #
154
- def send_io: (BasicSocket | Integer) -> void
156
+ def send_io: (IO | Integer) -> void
155
157
 
156
158
  private
157
159
 
@@ -338,7 +338,7 @@ class StringIO
338
338
 
339
339
  def readchar: () -> String
340
340
 
341
- def readline: (?String sep, ?Integer limit) -> String
341
+ def readline: (?String sep, ?Integer limit, ?chomp: boolish) -> String
342
342
 
343
343
  # <!--
344
344
  # rdoc-file=ext/stringio/stringio.c
@@ -115,6 +115,14 @@ end
115
115
  module URI
116
116
  include URI::RFC2396_REGEXP
117
117
 
118
+ # <!--
119
+ # rdoc-file=lib/uri/common.rb
120
+ # - decode_uri_component(str, enc=Encoding::UTF_8)
121
+ # -->
122
+ # Like URI.decode_www_form_component, except that `'+'` is preserved.
123
+ #
124
+ def self.decode_uri_component: (String str, ?encoding enc) -> String
125
+
118
126
  # <!--
119
127
  # rdoc-file=lib/uri/common.rb
120
128
  # - decode_www_form(str, enc=Encoding::UTF_8, separator: '&', use__charset_: false, isindex: false)
@@ -189,6 +197,15 @@ module URI
189
197
  #
190
198
  def self.decode_www_form_component: (String str, ?encoding enc) -> String
191
199
 
200
+ # <!--
201
+ # rdoc-file=lib/uri/common.rb
202
+ # - encode_uri_component(str, enc=nil)
203
+ # -->
204
+ # Like URI.encode_www_form_component, except that `' '` (space) is encoded as
205
+ # `'%20'` (instead of `'+'`).
206
+ #
207
+ def self.encode_uri_component: (String str, ?encoding enc) -> String
208
+
192
209
  # <!--
193
210
  # rdoc-file=lib/uri/common.rb
194
211
  # - encode_www_form(enum, enc=nil)
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rbs
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.8.1
4
+ version: 3.9.0.dev.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Soutaro Matsumoto
8
8
  bindir: exe
9
9
  cert_chain: []
10
- date: 2024-12-27 00:00:00.000000000 Z
10
+ date: 2025-03-06 00:00:00.000000000 Z
11
11
  dependencies:
12
12
  - !ruby/object:Gem::Dependency
13
13
  name: logger
@@ -160,6 +160,7 @@ files:
160
160
  - include/rbs.h
161
161
  - include/rbs/constants.h
162
162
  - include/rbs/ruby_objs.h
163
+ - include/rbs/util/rbs_constant_pool.h
163
164
  - lib/rbs.rb
164
165
  - lib/rbs/ancestor_graph.rb
165
166
  - lib/rbs/annotate.rb
@@ -342,6 +343,7 @@ files:
342
343
  - sig/writer.rbs
343
344
  - src/constants.c
344
345
  - src/ruby_objs.c
346
+ - src/util/rbs_constant_pool.c
345
347
  - stdlib/abbrev/0/abbrev.rbs
346
348
  - stdlib/abbrev/0/array.rbs
347
349
  - stdlib/base64/0/base64.rbs
@@ -513,11 +515,6 @@ files:
513
515
  - stdlib/zlib/0/version_error.rbs
514
516
  - stdlib/zlib/0/zlib.rbs
515
517
  - stdlib/zlib/0/zstream.rbs
516
- - templates/include/rbs/constants.h.erb
517
- - templates/include/rbs/ruby_objs.h.erb
518
- - templates/src/constants.c.erb
519
- - templates/src/ruby_objs.c.erb
520
- - templates/template.rb
521
518
  homepage: https://github.com/ruby/rbs
522
519
  licenses:
523
520
  - BSD-2-Clause
@@ -1,20 +0,0 @@
1
- #ifndef RBS__CONSTANTS_H
2
- #define RBS__CONSTANTS_H
3
-
4
- extern VALUE RBS;
5
-
6
- extern VALUE RBS_AST;
7
- extern VALUE RBS_AST_Declarations;
8
- extern VALUE RBS_AST_Directives;
9
- extern VALUE RBS_AST_Members;
10
- extern VALUE RBS_Types;
11
- extern VALUE RBS_Types_Bases;
12
- extern VALUE RBS_ParsingError;
13
-
14
- <%- nodes.each do |node| -%>
15
- extern VALUE <%= node.c_constant_name %>;
16
- <%- end -%>
17
-
18
- void rbs__init_constants();
19
-
20
- #endif
@@ -1,10 +0,0 @@
1
- #ifndef RBS__RUBY_OBJS_H
2
- #define RBS__RUBY_OBJS_H
3
-
4
- #include "ruby.h"
5
-
6
- <%- nodes.each do |node| -%>
7
- VALUE <%= node.c_function_name %>(<%= node.fields.map { |field| "#{field.c_type} #{field.name}" }.join(", ") %>);
8
- <%- end -%>
9
-
10
- #endif
@@ -1,36 +0,0 @@
1
- #include "rbs_extension.h"
2
-
3
- VALUE RBS_Parser;
4
-
5
- VALUE RBS;
6
- VALUE RBS_AST;
7
- VALUE RBS_AST_Declarations;
8
- VALUE RBS_AST_Directives;
9
- VALUE RBS_AST_Members;
10
- VALUE RBS_Parser;
11
- VALUE RBS_Types;
12
- VALUE RBS_Types_Bases;
13
-
14
- <%- nodes.each do |node| -%>
15
- VALUE <%= node.c_constant_name %>;
16
- <%- end -%>
17
-
18
- VALUE RBS_ParsingError;
19
-
20
- #define IMPORT_CONSTANT(var, parent, name) { var = rb_const_get(parent, rb_intern(name)); rb_gc_register_mark_object(var); }
21
-
22
- void rbs__init_constants(void) {
23
- IMPORT_CONSTANT(RBS, rb_cObject, "RBS");
24
- IMPORT_CONSTANT(RBS_ParsingError, RBS, "ParsingError");
25
-
26
- IMPORT_CONSTANT(RBS_AST, RBS, "AST");
27
- IMPORT_CONSTANT(RBS_AST_Declarations, RBS_AST, "Declarations");
28
- IMPORT_CONSTANT(RBS_AST_Directives, RBS_AST, "Directives");
29
- IMPORT_CONSTANT(RBS_AST_Members, RBS_AST, "Members");
30
- IMPORT_CONSTANT(RBS_Types, RBS, "Types");
31
- IMPORT_CONSTANT(RBS_Types_Bases, RBS_Types, "Bases");
32
-
33
- <%- nodes.each do |node| -%>
34
- IMPORT_CONSTANT(<%= node.c_constant_name %>, <%= node.c_parent_constant_name %>, "<%= node.ruby_class_name %>");
35
- <%- end -%>
36
- }
@@ -1,27 +0,0 @@
1
- #include "rbs_extension.h"
2
-
3
- #ifdef RB_PASS_KEYWORDS
4
- // Ruby 2.7 or later
5
- #define CLASS_NEW_INSTANCE(klass, argc, argv)\
6
- rb_class_new_instance_kw(argc, argv, klass, RB_PASS_KEYWORDS)
7
- #else
8
- // Ruby 2.6
9
- #define CLASS_NEW_INSTANCE(receiver, argc, argv)\
10
- rb_class_new_instance(argc, argv, receiver)
11
- #endif
12
-
13
- <%- nodes.each do |node| -%>
14
- VALUE <%= node.c_function_name %>(<%= node.fields.map { |field| "#{field.c_type} #{field.name}" }.join(", ") %>) {
15
- VALUE _init_kwargs = rb_hash_new();
16
- <%- node.fields.each do |field| -%>
17
- rb_hash_aset(_init_kwargs, ID2SYM(rb_intern("<%= field.name %>")), <%= field.name %>);
18
- <%- end -%>
19
-
20
- return CLASS_NEW_INSTANCE(
21
- <%= node.c_constant_name %>,
22
- 1,
23
- &_init_kwargs
24
- );
25
- }
26
-
27
- <%- end -%>
@@ -1,122 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "erb"
4
- require "fileutils"
5
- require "yaml"
6
-
7
- module RBS
8
- class Template
9
- class Field
10
- attr_reader :name
11
- attr_reader :c_type
12
-
13
- def initialize(yaml)
14
- @name = yaml["name"]
15
- @c_type = "VALUE"
16
- end
17
- end
18
-
19
- class Type
20
- # The fully-qualified name of the auto-generated Ruby class for this type,
21
- # e.g. `RBS::AST::Declarations::TypeAlias`
22
- attr_reader :ruby_full_name #: String
23
-
24
- # The name of the name of the auto-generated Ruby class for this type,
25
- # e.g. `TypeAlias`
26
- attr_reader :ruby_class_name #: String
27
-
28
- # The name of the auto-generated C struct for this type,
29
- # e.g. `rbs_ast_declarations_typealias_t`
30
- attr_reader :c_type_name #: String
31
-
32
- # The name of the pre-existing C function which constructs new Ruby objects of this type.
33
- # e.g. `rbs_ast_declarations_typealias_new`
34
- attr_reader :c_function_name #: String
35
-
36
- # The name of the C constant which stores the Ruby VALUE pointing to the generated class.
37
- # e.g. `RBS_AST_Declarations_TypeAlias`
38
- attr_reader :c_constant_name #: String
39
-
40
- # The name of the C constant in which the `c_constant_name` is nested.
41
- # e.g. `RBS_AST_Declarations`
42
- attr_reader :c_parent_constant_name #: String
43
-
44
- attr_reader :fields #: Array[RBS::Template::Field]
45
-
46
- def initialize(yaml)
47
- @ruby_full_name = yaml["name"]
48
- @ruby_class_name = @ruby_full_name[/[^:]+\z/] # demodulize-like
49
- name = @ruby_full_name.gsub("::", "_")
50
- @c_function_name = name.gsub(/(^)?(_)?([A-Z](?:[A-Z]*(?=[A-Z_])|[a-z0-9]*))/) { ($1 || $2 || "_") + $3.downcase } # underscore-like
51
- @c_function_name.gsub!(/^rbs_types_/, 'rbs_')
52
- @c_function_name.gsub!(/^rbs_ast_declarations_/, 'rbs_ast_decl_')
53
- @c_constant_name = @ruby_full_name.gsub("::", "_")
54
- @c_parent_constant_name = @ruby_full_name.split("::")[0..-2].join("::").gsub("::", "_")
55
-
56
- @fields = yaml.fetch("fields", []).map { |field| Field.new(field) }.freeze
57
- end
58
- end
59
-
60
- class << self
61
- def render(out_file)
62
- filepath = "templates/#{out_file}.erb"
63
- template = File.expand_path("../#{filepath}", __dir__)
64
-
65
- erb = read_template(template)
66
- extension = File.extname(filepath.gsub(".erb", ""))
67
-
68
- heading = <<~HEADING
69
- /*----------------------------------------------------------------------------*/
70
- /* This file is generated by the templates/template.rb script and should not */
71
- /* be modified manually. */
72
- /* To change the template see */
73
- /* #{filepath + " " * (74 - filepath.size) } */
74
- /*----------------------------------------------------------------------------*/
75
- HEADING
76
-
77
- write_to = File.expand_path("../#{out_file}", __dir__)
78
- contents = heading + "\n" + erb.result_with_hash(locals)
79
-
80
- if (extension == ".c" || extension == ".h") && !contents.ascii_only?
81
- # Enforce that we only have ASCII characters here. This is necessary
82
- # for non-UTF-8 locales that only allow ASCII characters in C source
83
- # files.
84
- contents.each_line.with_index(1) do |line, line_number|
85
- raise "Non-ASCII character on line #{line_number} of #{write_to}" unless line.ascii_only?
86
- end
87
- end
88
-
89
- FileUtils.mkdir_p(File.dirname(write_to))
90
- File.write(write_to, contents)
91
- end
92
-
93
- private
94
-
95
- def read_template(filepath)
96
- template = File.read(filepath, encoding: Encoding::UTF_8)
97
- erb = erb(template)
98
- erb.filename = filepath
99
- erb
100
- end
101
-
102
- def erb(template)
103
- ERB.new(template, trim_mode: "-")
104
- end
105
-
106
- def locals
107
- config = YAML.load_file(File.expand_path("../config.yml", __dir__))
108
- {
109
- nodes: config.fetch("nodes").map { |node| Type.new(node) }.sort_by(&:ruby_full_name),
110
- }
111
- end
112
- end
113
- end
114
- end
115
-
116
- unless ARGV.size == 1
117
- $stderr.puts "Usage: ruby template.rb <out_file>"
118
- exit 1
119
- end
120
-
121
- out_file = ARGV.first
122
- RBS::Template.render(out_file)