rbs 1.1.0 → 1.3.0

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 (101) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ruby.yml +5 -1
  3. data/.gitignore +2 -0
  4. data/CHANGELOG.md +81 -0
  5. data/README.md +1 -1
  6. data/Rakefile +11 -0
  7. data/Steepfile +1 -0
  8. data/core/array.rbs +2 -2
  9. data/core/basic_object.rbs +1 -1
  10. data/core/enumerable.rbs +1 -1
  11. data/core/hash.rbs +13 -5
  12. data/core/io.rbs +4 -4
  13. data/core/kernel.rbs +2 -2
  14. data/core/marshal.rbs +4 -3
  15. data/core/module.rbs +1 -1
  16. data/core/numeric.rbs +10 -0
  17. data/core/proc.rbs +1 -1
  18. data/core/random.rbs +4 -2
  19. data/core/range.rbs +2 -2
  20. data/core/struct.rbs +3 -2
  21. data/core/thread.rbs +1 -1
  22. data/docs/CONTRIBUTING.md +5 -3
  23. data/docs/rbs_by_example.md +328 -0
  24. data/docs/sigs.md +21 -2
  25. data/docs/stdlib.md +1 -1
  26. data/docs/syntax.md +11 -14
  27. data/lib/rbs.rb +1 -0
  28. data/lib/rbs/ast/annotation.rb +2 -2
  29. data/lib/rbs/ast/comment.rb +2 -2
  30. data/lib/rbs/ast/declarations.rb +37 -22
  31. data/lib/rbs/ast/members.rb +26 -26
  32. data/lib/rbs/cli.rb +3 -0
  33. data/lib/rbs/constant_table.rb +4 -1
  34. data/lib/rbs/definition.rb +1 -1
  35. data/lib/rbs/definition_builder.rb +16 -18
  36. data/lib/rbs/definition_builder/ancestor_builder.rb +10 -2
  37. data/lib/rbs/definition_builder/method_builder.rb +4 -2
  38. data/lib/rbs/errors.rb +36 -0
  39. data/lib/rbs/location.rb +106 -2
  40. data/lib/rbs/locator.rb +205 -0
  41. data/lib/rbs/method_type.rb +2 -2
  42. data/lib/rbs/parser.rb +1315 -962
  43. data/lib/rbs/parser.y +411 -75
  44. data/lib/rbs/prototype/rb.rb +7 -3
  45. data/lib/rbs/prototype/runtime.rb +118 -42
  46. data/lib/rbs/test/hook.rb +8 -2
  47. data/lib/rbs/type_name.rb +2 -3
  48. data/lib/rbs/type_name_resolver.rb +1 -1
  49. data/lib/rbs/types.rb +36 -34
  50. data/lib/rbs/version.rb +1 -1
  51. data/lib/rbs/writer.rb +4 -2
  52. data/rbs.gemspec +1 -1
  53. data/sig/ancestor_builder.rbs +2 -0
  54. data/sig/annotation.rbs +1 -1
  55. data/sig/cli.rbs +31 -21
  56. data/sig/comment.rbs +1 -1
  57. data/sig/declarations.rbs +106 -21
  58. data/sig/environment.rbs +2 -2
  59. data/sig/errors.rbs +15 -0
  60. data/sig/location.rbs +84 -3
  61. data/sig/locator.rbs +44 -0
  62. data/sig/members.rbs +76 -12
  63. data/sig/method_builder.rbs +1 -1
  64. data/sig/method_types.rbs +1 -1
  65. data/sig/namespace.rbs +1 -1
  66. data/sig/polyfill.rbs +4 -17
  67. data/sig/rbs.rbs +8 -4
  68. data/sig/typename.rbs +1 -1
  69. data/sig/types.rbs +67 -20
  70. data/sig/util.rbs +0 -4
  71. data/sig/writer.rbs +8 -2
  72. data/stdlib/dbm/0/dbm.rbs +43 -30
  73. data/stdlib/mutex_m/0/mutex_m.rbs +1 -1
  74. data/stdlib/net-http/0/net-http.rbs +1846 -0
  75. data/stdlib/optparse/0/optparse.rbs +1214 -0
  76. data/stdlib/resolv/0/resolv.rbs +1504 -0
  77. data/stdlib/rubygems/0/requirement.rbs +84 -2
  78. data/stdlib/rubygems/0/rubygems.rbs +2 -2
  79. data/stdlib/rubygems/0/version.rbs +2 -1
  80. data/stdlib/shellwords/0/shellwords.rbs +252 -0
  81. data/stdlib/socket/0/addrinfo.rbs +469 -0
  82. data/stdlib/socket/0/basic_socket.rbs +503 -0
  83. data/stdlib/socket/0/ip_socket.rbs +72 -0
  84. data/stdlib/socket/0/socket.rbs +2687 -0
  85. data/stdlib/socket/0/tcp_server.rbs +177 -0
  86. data/stdlib/socket/0/tcp_socket.rbs +35 -0
  87. data/stdlib/socket/0/udp_socket.rbs +111 -0
  88. data/stdlib/socket/0/unix_server.rbs +154 -0
  89. data/stdlib/socket/0/unix_socket.rbs +132 -0
  90. data/stdlib/timeout/0/timeout.rbs +5 -0
  91. data/steep/Gemfile.lock +19 -16
  92. metadata +18 -11
  93. data/bin/annotate-with-rdoc +0 -153
  94. data/bin/console +0 -14
  95. data/bin/query-rdoc +0 -103
  96. data/bin/rbs-prof +0 -9
  97. data/bin/run_in_md.rb +0 -49
  98. data/bin/setup +0 -8
  99. data/bin/sort +0 -89
  100. data/bin/steep +0 -4
  101. data/bin/test_runner.rb +0 -29
@@ -746,6 +746,20 @@ module RBS
746
746
  end
747
747
  )
748
748
  end
749
+
750
+ defs = method.defs.map do |defn|
751
+ defn.update(
752
+ type: sub.empty? ? defn.type : defn.type.sub(sub),
753
+ implemented_in: case implemented_in
754
+ when :keep
755
+ defn.implemented_in
756
+ when nil
757
+ nil
758
+ else
759
+ implemented_in
760
+ end
761
+ )
762
+ end
749
763
  end
750
764
 
751
765
  super_method = methods[name]
@@ -760,26 +774,10 @@ module RBS
760
774
  end
761
775
 
762
776
  def try_cache(type_name, cache:, key: type_name)
763
- # @type var cc: Hash[untyped, Definition | false | nil]
777
+ # @type var cc: Hash[untyped, Definition | nil]
764
778
  cc = _ = cache
765
- cached = cc[key]
766
779
 
767
- case cached
768
- when Definition
769
- cached
770
- when false
771
- raise
772
- when nil
773
- cc[key] = false
774
- begin
775
- cc[key] = yield
776
- rescue => ex
777
- cc.delete(key)
778
- raise ex
779
- end
780
- else
781
- raise
782
- end
780
+ cc[key] ||= yield
783
781
  end
784
782
 
785
783
  def expand_alias(type_name)
@@ -237,6 +237,7 @@ module RBS
237
237
  end
238
238
 
239
239
  mixin_ancestors(entry,
240
+ type_name,
240
241
  included_modules: ancestors.included_modules,
241
242
  included_interfaces: ancestors.included_interfaces,
242
243
  prepended_modules: ancestors.prepended_modules,
@@ -284,6 +285,7 @@ module RBS
284
285
  end
285
286
 
286
287
  mixin_ancestors(entry,
288
+ type_name,
287
289
  included_modules: nil,
288
290
  included_interfaces: nil,
289
291
  prepended_modules: nil,
@@ -301,6 +303,7 @@ module RBS
301
303
 
302
304
  OneAncestors.interface(type_name: type_name, params: params).tap do |ancestors|
303
305
  mixin_ancestors0(entry.decl,
306
+ type_name,
304
307
  align_params: nil,
305
308
  included_modules: nil,
306
309
  included_interfaces: ancestors.included_interfaces,
@@ -311,7 +314,7 @@ module RBS
311
314
  end
312
315
  end
313
316
 
314
- def mixin_ancestors0(decl, align_params:, included_modules:, included_interfaces:, extended_modules:, prepended_modules:, extended_interfaces:)
317
+ def mixin_ancestors0(decl, type_name, align_params:, included_modules:, included_interfaces:, extended_modules:, prepended_modules:, extended_interfaces:)
315
318
  decl.each_mixin do |member|
316
319
  case member
317
320
  when AST::Members::Include
@@ -321,6 +324,7 @@ module RBS
321
324
 
322
325
  case
323
326
  when member.name.class? && included_modules
327
+ MixinClassError.check!(type_name: type_name, env: env, member: member)
324
328
  NoMixinFoundError.check!(member.name, env: env, member: member)
325
329
  included_modules << ancestor
326
330
  when member.name.interface? && included_interfaces
@@ -330,6 +334,7 @@ module RBS
330
334
 
331
335
  when AST::Members::Prepend
332
336
  if prepended_modules
337
+ MixinClassError.check!(type_name: type_name, env: env, member: member)
333
338
  NoMixinFoundError.check!(member.name, env: env, member: member)
334
339
 
335
340
  module_name = member.name
@@ -345,6 +350,7 @@ module RBS
345
350
 
346
351
  case
347
352
  when member.name.class? && extended_modules
353
+ MixinClassError.check!(type_name: type_name, env: env, member: member)
348
354
  NoMixinFoundError.check!(member.name, env: env, member: member)
349
355
  extended_modules << ancestor
350
356
  when member.name.interface? && extended_interfaces
@@ -355,7 +361,7 @@ module RBS
355
361
  end
356
362
  end
357
363
 
358
- def mixin_ancestors(entry, included_modules:, included_interfaces:, extended_modules:, prepended_modules:, extended_interfaces:)
364
+ def mixin_ancestors(entry, type_name, included_modules:, included_interfaces:, extended_modules:, prepended_modules:, extended_interfaces:)
359
365
  entry.decls.each do |d|
360
366
  decl = d.decl
361
367
 
@@ -365,6 +371,7 @@ module RBS
365
371
  )
366
372
 
367
373
  mixin_ancestors0(decl,
374
+ type_name,
368
375
  align_params: align_params,
369
376
  included_modules: included_modules,
370
377
  included_interfaces: included_interfaces,
@@ -508,6 +515,7 @@ module RBS
508
515
  included_interfaces = one_ancestors.included_interfaces or raise
509
516
  included_interfaces.each do |a|
510
517
  included_ancestors = interface_ancestors(a.name, building_ancestors: building_ancestors)
518
+
511
519
  ancestors.unshift(*included_ancestors.apply(a.args, location: entry.decl.location))
512
520
  end
513
521
 
@@ -2,9 +2,11 @@ module RBS
2
2
  class DefinitionBuilder
3
3
  class MethodBuilder
4
4
  class Methods
5
- Definition = Struct.new(:name, :type, :originals, :overloads, :accessibilities, keyword_init: true) do
5
+ Definition = _ = Struct.new(:name, :type, :originals, :overloads, :accessibilities, keyword_init: true) do
6
+ # @implements Definition
7
+
6
8
  def original
7
- originals[0]
9
+ originals.first
8
10
  end
9
11
 
10
12
  def accessibility
data/lib/rbs/errors.rb CHANGED
@@ -350,4 +350,40 @@ module RBS
350
350
  original.location
351
351
  end
352
352
  end
353
+
354
+ class MixinClassError < DefinitionError
355
+ attr_reader :type_name
356
+ attr_reader :member
357
+
358
+ def initialize(type_name:, member:)
359
+ @type_name = type_name
360
+ @member = member
361
+
362
+ super "#{Location.to_string member.location}: Cannot #{mixin_name} a class `#{member.name}` in the definition of `#{type_name}`"
363
+ end
364
+
365
+ def location
366
+ member.location
367
+ end
368
+
369
+ def self.check!(type_name:, env:, member:)
370
+ case env.class_decls[member.name]
371
+ when Environment::ClassEntry
372
+ raise new(type_name: type_name, member: member)
373
+ end
374
+ end
375
+
376
+ private
377
+
378
+ def mixin_name
379
+ case member
380
+ when AST::Members::Prepend
381
+ "prepend"
382
+ when AST::Members::Include
383
+ "include"
384
+ when AST::Members::Extend
385
+ "extend"
386
+ end
387
+ end
388
+ end
353
389
  end
data/lib/rbs/location.rb CHANGED
@@ -42,6 +42,10 @@ module RBS
42
42
  @end_loc ||= buffer.pos_to_loc(end_pos)
43
43
  end
44
44
 
45
+ def range
46
+ start_pos...end_pos
47
+ end
48
+
45
49
  def source
46
50
  @source ||= buffer.content[start_pos...end_pos] or raise
47
51
  end
@@ -94,7 +98,7 @@ module RBS
94
98
  loc.start_pos == end_pos
95
99
  end
96
100
 
97
- def to_json(*args)
101
+ def to_json(state = _ = nil)
98
102
  {
99
103
  start: {
100
104
  line: start_line,
@@ -107,7 +111,107 @@ module RBS
107
111
  buffer: {
108
112
  name: name&.to_s
109
113
  }
110
- }.to_json(*args)
114
+ }.to_json(state)
115
+ end
116
+
117
+ def with_children(required: {}, optional: {})
118
+ # @type var required: Hash[Symbol, Range[Integer] | Location]
119
+ # @type var optional: Hash[Symbol, Range[Integer] | Location | nil]
120
+
121
+ this = WithChildren.new(buffer: buffer, start_pos: start_pos, end_pos: end_pos)
122
+
123
+ req = required.transform_values do |value|
124
+ case value
125
+ when Location
126
+ value.range
127
+ else
128
+ value
129
+ end
130
+ end
131
+
132
+ opt = optional.transform_values do |value|
133
+ case value
134
+ when Location
135
+ value.range
136
+ else
137
+ value
138
+ end
139
+ end
140
+
141
+ this.required_children.merge!(req)
142
+ this.optional_children.merge!(opt)
143
+
144
+ this
145
+ end
146
+
147
+ class WithChildren < Location
148
+ attr_reader :required_children, :optional_children
149
+
150
+ def initialize(buffer:, start_pos:, end_pos:)
151
+ super(buffer: buffer, start_pos: start_pos, end_pos: end_pos)
152
+
153
+ @optional_children = {}
154
+ @required_children = {}
155
+ end
156
+
157
+ def initialize_copy(from)
158
+ required_children.merge!(from.required_children)
159
+ optional_children.merge!(from.optional_children)
160
+ self
161
+ end
162
+
163
+ def [](key)
164
+ case
165
+ when required_children.key?(_ = key)
166
+ range = required_children[_ = key]
167
+ Location.new(buffer: buffer, start_pos: range.begin, end_pos: range.end)
168
+ when optional_children.key?(_ = key)
169
+ range = required_children[_ = key] || optional_children[_ = key]
170
+ if range
171
+ Location.new(buffer: buffer, start_pos: range.begin, end_pos: range.end)
172
+ end
173
+ else
174
+ raise "Unknown key given: `#{key}`"
175
+ end
176
+ end
177
+
178
+ def merge_required(hash)
179
+ this = dup
180
+
181
+ h = hash.transform_values do |value|
182
+ case value
183
+ when Range
184
+ value
185
+ when Location
186
+ value.range
187
+ else
188
+ raise
189
+ end
190
+ end
191
+
192
+ this.required_children.merge!(h)
193
+
194
+ this
195
+ end
196
+
197
+ def merge_optional(hash)
198
+ this = dup
199
+
200
+ h = hash.transform_values do |value|
201
+ case value
202
+ when Range
203
+ value
204
+ when Location
205
+ value.range
206
+ else
207
+ nil
208
+ end
209
+ end
210
+
211
+ this.optional_children.merge!(h)
212
+
213
+ this
214
+ end
111
215
  end
112
216
  end
113
217
  end
@@ -0,0 +1,205 @@
1
+ module RBS
2
+ class Locator
3
+ attr_reader :decls
4
+
5
+ def initialize(decls:)
6
+ @decls = decls
7
+ end
8
+
9
+ def buffer
10
+ decls[0].location&.buffer or raise
11
+ end
12
+
13
+ def find(line:, column:)
14
+ pos = buffer.loc_to_pos([line, column])
15
+
16
+ decls.each do |decl|
17
+ array = []
18
+ find_in_decl(pos, decl: decl, array: array) and return array
19
+ end
20
+
21
+ []
22
+ end
23
+
24
+ def find2(line:, column:)
25
+ path = find(line: line, column: column)
26
+
27
+ return if path.empty?
28
+
29
+ hd, *tl = path
30
+ if hd.is_a?(Symbol)
31
+ [hd, tl]
32
+ else
33
+ [nil, path]
34
+ end
35
+ end
36
+
37
+ def find_in_decl(pos, decl:, array:)
38
+ if test_loc(pos, location: decl.location)
39
+ array.unshift(decl)
40
+
41
+ case decl
42
+ when AST::Declarations::Class
43
+ decl.type_params.each do |param|
44
+ if test_loc(pos, location: param.location)
45
+ array.unshift(param)
46
+ find_in_loc(pos, array: array, location: param.location)
47
+ return true
48
+ end
49
+ end
50
+
51
+ if super_class = decl.super_class
52
+ if test_loc(pos, location: super_class.location)
53
+ array.unshift(super_class)
54
+ find_in_loc(pos, array: array, location: super_class.location)
55
+ return true
56
+ end
57
+ end
58
+
59
+ decl.each_decl do |decl_|
60
+ find_in_decl(pos, decl: decl_, array: array) and return true
61
+ end
62
+
63
+ decl.each_member do |member|
64
+ find_in_member(pos, array: array, member: member) and return true
65
+ end
66
+
67
+ when AST::Declarations::Module
68
+ decl.type_params.each do |param|
69
+ if test_loc(pos, location: param.location)
70
+ array.unshift(param)
71
+ find_in_loc(pos, array: array, location: param.location)
72
+ return true
73
+ end
74
+ end
75
+
76
+ decl.self_types.each do |self_type|
77
+ if test_loc(pos, location: self_type.location)
78
+ array.unshift(self_type)
79
+ find_in_loc(pos, array: array, location: self_type.location)
80
+ return true
81
+ end
82
+ end
83
+
84
+ decl.each_decl do |decl_|
85
+ find_in_decl(pos, decl: decl_, array: array) and return true
86
+ end
87
+
88
+ decl.each_member do |member|
89
+ find_in_member(pos, array: array, member: member) and return true
90
+ end
91
+
92
+ when AST::Declarations::Interface
93
+ decl.type_params.each do |param|
94
+ if test_loc(pos, location: param.location)
95
+ array.unshift(param)
96
+ find_in_loc(pos, array: array, location: param.location)
97
+ return true
98
+ end
99
+ end
100
+
101
+ decl.members.each do |member|
102
+ find_in_member(pos, array: array, member: member) and return true
103
+ end
104
+
105
+ when AST::Declarations::Constant, AST::Declarations::Global
106
+ find_in_type(pos, array: array, type: decl.type) and return true
107
+
108
+ when AST::Declarations::Alias
109
+ find_in_type(pos, array: array, type: decl.type) and return true
110
+ end
111
+
112
+ find_in_loc(pos, location: decl.location, array: array)
113
+
114
+ true
115
+ else
116
+ false
117
+ end
118
+ end
119
+
120
+ def find_in_member(pos, member:, array:)
121
+ if test_loc(pos, location: member.location)
122
+ array.unshift(member)
123
+
124
+ case member
125
+ when AST::Members::MethodDefinition
126
+ member.types.each do |method_type|
127
+ find_in_method_type(pos, array: array, method_type: method_type) and return true
128
+ end
129
+ when AST::Members::InstanceVariable, AST::Members::ClassInstanceVariable, AST::Members::ClassVariable
130
+ find_in_type(pos, array: array, type: member.type) and return true
131
+ when AST::Members::AttrReader, AST::Members::AttrWriter, AST::Members::AttrAccessor
132
+ find_in_type(pos, array: array, type: member.type) and return true
133
+ end
134
+
135
+ find_in_loc(pos, location: member.location, array: array)
136
+
137
+ true
138
+ else
139
+ false
140
+ end
141
+ end
142
+
143
+ def find_in_method_type(pos, method_type:, array:)
144
+ if test_loc(pos, location: method_type.location)
145
+ array.unshift(method_type)
146
+
147
+ method_type.each_type do |type|
148
+ find_in_type(pos, array: array, type: type) and break
149
+ end
150
+
151
+ true
152
+ else
153
+ false
154
+ end
155
+ end
156
+
157
+ def find_in_type(pos, type:, array:)
158
+ if test_loc(pos, location: type.location)
159
+ array.unshift(type)
160
+
161
+ type.each_type do |type_|
162
+ find_in_type(pos, array: array, type: type_) and return true
163
+ end
164
+
165
+ find_in_loc(pos, array: array, location: type.location)
166
+
167
+ true
168
+ else
169
+ false
170
+ end
171
+ end
172
+
173
+ def find_in_loc(pos, location:, array:)
174
+ if test_loc(pos, location: location)
175
+ if location.is_a?(Location::WithChildren)
176
+ location.optional_children.each do |key, range|
177
+ if range === pos
178
+ array.unshift(key)
179
+ return true
180
+ end
181
+ end
182
+
183
+ location.required_children.each do |key, range|
184
+ if range === pos
185
+ array.unshift(key)
186
+ return true
187
+ end
188
+ end
189
+ end
190
+
191
+ true
192
+ else
193
+ false
194
+ end
195
+ end
196
+
197
+ def test_loc(pos, location:)
198
+ if location
199
+ location.range === pos
200
+ else
201
+ false
202
+ end
203
+ end
204
+ end
205
+ end