rbs 2.1.0 → 2.2.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.
@@ -10,7 +10,11 @@ module RBS
10
10
  end
11
11
 
12
12
  def accessibility
13
- accessibilities[0]
13
+ if original.is_a?(AST::Members::Alias)
14
+ raise "alias member doesn't have accessibility"
15
+ else
16
+ accessibilities[0] or raise
17
+ end
14
18
  end
15
19
 
16
20
  def self.empty(name:, type:)
@@ -102,22 +106,32 @@ module RBS
102
106
  each_member_with_accessibility(d.decl.members) do |member, accessibility|
103
107
  case member
104
108
  when AST::Members::MethodDefinition
105
- if member.instance?
106
- build_method(methods,
107
- type,
108
- member: member.update(types: member.types.map {|type| type.sub(subst) }),
109
- accessibility: accessibility)
109
+ case member.kind
110
+ when :instance
111
+ build_method(
112
+ methods,
113
+ type,
114
+ member: member.update(types: member.types.map {|type| type.sub(subst) }),
115
+ accessibility: member.visibility || accessibility
116
+ )
117
+ when :singleton_instance
118
+ build_method(
119
+ methods,
120
+ type,
121
+ member: member.update(types: member.types.map {|type| type.sub(subst) }),
122
+ accessibility: :private
123
+ )
110
124
  end
111
125
  when AST::Members::AttrReader, AST::Members::AttrWriter, AST::Members::AttrAccessor
112
126
  if member.kind == :instance
113
127
  build_attribute(methods,
114
128
  type,
115
129
  member: member.update(type: member.type.sub(subst)),
116
- accessibility: accessibility)
130
+ accessibility: member.visibility || accessibility)
117
131
  end
118
132
  when AST::Members::Alias
119
133
  if member.kind == :instance
120
- build_alias(methods, type, member: member, accessibility: accessibility)
134
+ build_alias(methods, type, member: member)
121
135
  end
122
136
  end
123
137
  end
@@ -134,19 +148,19 @@ module RBS
134
148
 
135
149
  Methods.new(type: type).tap do |methods|
136
150
  entry.decls.each do |d|
137
- each_member_with_accessibility(d.decl.members) do |member, accessibility|
151
+ d.decl.members.each do |member|
138
152
  case member
139
153
  when AST::Members::MethodDefinition
140
154
  if member.singleton?
141
- build_method(methods, type, member: member, accessibility: accessibility)
155
+ build_method(methods, type, member: member, accessibility: member.visibility || :public)
142
156
  end
143
157
  when AST::Members::AttrReader, AST::Members::AttrWriter, AST::Members::AttrAccessor
144
158
  if member.kind == :singleton
145
- build_attribute(methods, type, member: member, accessibility: accessibility)
159
+ build_attribute(methods, type, member: member, accessibility: member.visibility || :public)
146
160
  end
147
161
  when AST::Members::Alias
148
162
  if member.kind == :singleton
149
- build_alias(methods, type, member: member, accessibility: accessibility)
163
+ build_alias(methods, type, member: member)
150
164
  end
151
165
  end
152
166
  end
@@ -168,18 +182,16 @@ module RBS
168
182
  when AST::Members::MethodDefinition
169
183
  build_method(methods, type, member: member, accessibility: :public)
170
184
  when AST::Members::Alias
171
- build_alias(methods, type, member: member, accessibility: :public)
185
+ build_alias(methods, type, member: member)
172
186
  end
173
187
  end
174
188
  end.validate!
175
189
  end
176
190
  end
177
191
 
178
- def build_alias(methods, type, member:, accessibility:)
192
+ def build_alias(methods, type, member:)
179
193
  defn = methods.methods[member.new_name] ||= Methods::Definition.empty(type: type, name: member.new_name)
180
-
181
194
  defn.originals << member
182
- defn.accessibilities << accessibility
183
195
  end
184
196
 
185
197
  def build_attribute(methods, type, member:, accessibility:)
@@ -587,7 +587,7 @@ module RBS
587
587
  defs: original_method.defs.map do |defn|
588
588
  defn.update(defined_in: definition.type_name, implemented_in: definition.type_name)
589
589
  end,
590
- accessibility: method_def.accessibility,
590
+ accessibility: original_method.accessibility,
591
591
  alias_of: original_method
592
592
  )
593
593
  else
@@ -357,7 +357,8 @@ module RBS
357
357
  comment: member.comment,
358
358
  overload: member.overload?,
359
359
  annotations: member.annotations,
360
- location: member.location
360
+ location: member.location,
361
+ visibility: member.visibility
361
362
  )
362
363
  when AST::Members::AttrAccessor
363
364
  AST::Members::AttrAccessor.new(
@@ -367,7 +368,8 @@ module RBS
367
368
  annotations: member.annotations,
368
369
  comment: member.comment,
369
370
  location: member.location,
370
- ivar_name: member.ivar_name
371
+ ivar_name: member.ivar_name,
372
+ visibility: member.visibility
371
373
  )
372
374
  when AST::Members::AttrReader
373
375
  AST::Members::AttrReader.new(
@@ -377,7 +379,8 @@ module RBS
377
379
  annotations: member.annotations,
378
380
  comment: member.comment,
379
381
  location: member.location,
380
- ivar_name: member.ivar_name
382
+ ivar_name: member.ivar_name,
383
+ visibility: member.visibility
381
384
  )
382
385
  when AST::Members::AttrWriter
383
386
  AST::Members::AttrWriter.new(
@@ -387,7 +390,8 @@ module RBS
387
390
  annotations: member.annotations,
388
391
  comment: member.comment,
389
392
  location: member.location,
390
- ivar_name: member.ivar_name
393
+ ivar_name: member.ivar_name,
394
+ visibility: member.visibility
391
395
  )
392
396
  when AST::Members::InstanceVariable
393
397
  AST::Members::InstanceVariable.new(
data/lib/rbs/namespace.rb CHANGED
@@ -59,7 +59,7 @@ module RBS
59
59
  alias eql? ==
60
60
 
61
61
  def hash
62
- self.class.hash ^ path.hash ^ absolute?.hash
62
+ path.hash ^ absolute?.hash
63
63
  end
64
64
 
65
65
  def split
data/lib/rbs/type_name.rb CHANGED
@@ -27,7 +27,7 @@ module RBS
27
27
  alias eql? ==
28
28
 
29
29
  def hash
30
- self.class.hash ^ namespace.hash ^ name.hash
30
+ namespace.hash ^ name.hash
31
31
  end
32
32
 
33
33
  def to_s
data/lib/rbs/types.rb CHANGED
@@ -213,7 +213,7 @@ module RBS
213
213
  alias eql? ==
214
214
 
215
215
  def hash
216
- self.class.hash ^ name.hash ^ args.hash
216
+ name.hash ^ args.hash
217
217
  end
218
218
 
219
219
  def free_variables(set = Set.new)
data/lib/rbs/validator.rb CHANGED
@@ -73,6 +73,8 @@ module RBS
73
73
  if set = result.incompatible?(entry.decl.type_params)
74
74
  set.each do |param_name|
75
75
  param = entry.decl.type_params.find {|param| param.name == param_name } or raise
76
+ next if param.unchecked?
77
+
76
78
  raise InvalidVarianceAnnotationError.new(
77
79
  type_name: type_name,
78
80
  param: param,
data/lib/rbs/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module RBS
2
- VERSION = "2.1.0"
2
+ VERSION = "2.2.0"
3
3
  end
data/lib/rbs/writer.rb CHANGED
@@ -6,6 +6,16 @@ module RBS
6
6
  def initialize(out:)
7
7
  @out = out
8
8
  @indentation = []
9
+ @preserve = false
10
+ end
11
+
12
+ def preserve?
13
+ @preserve
14
+ end
15
+
16
+ def preserve!(preserve: true)
17
+ @preserve = preserve
18
+ self
9
19
  end
10
20
 
11
21
  def indent(size = 2)
@@ -119,7 +129,9 @@ module RBS
119
129
  when AST::Declarations::Alias
120
130
  write_comment decl.comment
121
131
  write_annotation decl.annotations
122
- puts "type #{name_and_params(decl.name, decl.type_params)} = #{decl.type}"
132
+ write_loc_source(decl) {
133
+ puts "type #{name_and_params(decl.name, decl.type_params)} = #{decl.type}"
134
+ }
123
135
 
124
136
  when AST::Declarations::Interface
125
137
  write_comment decl.comment
@@ -163,6 +175,16 @@ module RBS
163
175
  end
164
176
  end
165
177
 
178
+ def put_lines(lines, leading_spaces:)
179
+ lines.each_line.with_index do |line, index|
180
+ line.chomp!
181
+ line.rstrip!
182
+ line.sub!(/\A( {,#{leading_spaces}})/, '') if index > 0
183
+
184
+ puts line
185
+ end
186
+ end
187
+
166
188
  def write_member(member)
167
189
  case member
168
190
  when AST::Members::Include
@@ -211,7 +233,7 @@ module RBS
211
233
  when AST::Members::MethodDefinition
212
234
  write_comment member.comment
213
235
  write_annotation member.annotations
214
- write_def member
236
+ write_loc_source(member) { write_def member }
215
237
  else
216
238
  write_decl member
217
239
  end
@@ -230,7 +252,25 @@ module RBS
230
252
  end
231
253
  end
232
254
 
255
+ def write_loc_source(located)
256
+ if preserve? && loc = located.location
257
+ put_lines(loc.source, leading_spaces: loc.start_column)
258
+ else
259
+ yield
260
+ end
261
+ end
262
+
233
263
  def write_def(member)
264
+ visibility =
265
+ case member.visibility
266
+ when :public
267
+ "public "
268
+ when :private
269
+ "private "
270
+ else
271
+ ""
272
+ end
273
+
234
274
  name = case member.kind
235
275
  when :instance
236
276
  "#{method_name(member.name)}"
@@ -242,7 +282,7 @@ module RBS
242
282
 
243
283
  string = ""
244
284
 
245
- prefix = "def #{name}:"
285
+ prefix = "#{visibility}def #{name}:"
246
286
  padding = " " * (prefix.size-1)
247
287
 
248
288
  string << prefix
@@ -270,6 +310,16 @@ module RBS
270
310
  end
271
311
 
272
312
  def attribute(kind, attr)
313
+ visibility =
314
+ case attr.visibility
315
+ when :public
316
+ "public "
317
+ when :private
318
+ "private "
319
+ else
320
+ ""
321
+ end
322
+
273
323
  var = case attr.ivar_name
274
324
  when nil
275
325
  ""
@@ -286,7 +336,7 @@ module RBS
286
336
  ""
287
337
  end
288
338
 
289
- "attr_#{kind} #{receiver}#{attr.name}#{var}: #{attr.type}"
339
+ "#{visibility}attr_#{kind} #{receiver}#{attr.name}#{var}: #{attr.type}"
290
340
  end
291
341
 
292
342
  def preserve_empty_line(prev, decl)
data/lib/rbs.rb CHANGED
@@ -7,9 +7,7 @@ require "pp"
7
7
  require "ripper"
8
8
  require "logger"
9
9
  require "tsort"
10
- require "strscan"
11
10
 
12
- require "rbs/char_scanner"
13
11
  require "rbs/errors"
14
12
  require "rbs/buffer"
15
13
  require "rbs/namespace"
@@ -15,13 +15,13 @@
15
15
  "upper_bound": {
16
16
  "oneOf": [
17
17
  {
18
- "$ref": "types.json#definitions/classInstance"
18
+ "$ref": "types.json#/definitions/classInstance"
19
19
  },
20
20
  {
21
- "$ref": "types.json#definitions/classSingleton"
21
+ "$ref": "types.json#/definitions/classSingleton"
22
22
  },
23
23
  {
24
- "$ref": "types.json#definitions/interface"
24
+ "$ref": "types.json#/definitions/interface"
25
25
  },
26
26
  {
27
27
  "type": "null"
@@ -8,7 +8,7 @@ module RBS
8
8
 
9
9
  def initialize: (source: RDocSource) -> void
10
10
 
11
- def annotate_file: (Pathname) -> void
11
+ def annotate_file: (Pathname, preserve: bool) -> void
12
12
 
13
13
  def annotate_decls: (Array[AST::Declarations::t], ?outer: Array[Namespace]) -> void
14
14
 
data/sig/buffer.rbs CHANGED
@@ -11,12 +11,16 @@ module RBS
11
11
  # The content of the buffer.
12
12
  attr_reader content: String
13
13
 
14
- attr_reader lines: Array[String]
14
+ @lines: Array[String]
15
15
 
16
- attr_reader ranges: Array[Range[Integer]]
16
+ @ranges: Array[Range[Integer]]
17
17
 
18
18
  def initialize: (name: untyped name, content: String content) -> void
19
19
 
20
+ def lines: () -> Array[String]
21
+
22
+ def ranges: () -> Array[Range[Integer]]
23
+
20
24
  # Translate position to location.
21
25
  def pos_to_loc: (Integer pos) -> loc
22
26
 
data/sig/members.rbs CHANGED
@@ -12,6 +12,8 @@ module RBS
12
12
  class Base
13
13
  end
14
14
 
15
+ type visibility = :public | :private
16
+
15
17
  class MethodDefinition < Base
16
18
  type kind = :instance | :singleton | :singleton_instance
17
19
 
@@ -19,13 +21,14 @@ module RBS
19
21
  # ^^^ keyword
20
22
  # ^^^ name
21
23
  #
22
- # def self.bar: () -> void | ...
23
- # ^^^ keyword
24
- # ^^^^^ kind
25
- # ^^^ name
26
- # ^^^ overload
24
+ # private def self.bar: () -> void | ...
25
+ # ^^^^^^^ visibility
26
+ # ^^^ keyword
27
+ # ^^^^^ kind
28
+ # ^^^ name
29
+ # ^^^ overload
27
30
  #
28
- type loc = Location[:keyword | :name, :kind | :overload]
31
+ type loc = Location[:keyword | :name, :kind | :overload | :visibility]
29
32
 
30
33
  attr_reader name: Symbol
31
34
  attr_reader kind: kind
@@ -34,8 +37,9 @@ module RBS
34
37
  attr_reader location: loc?
35
38
  attr_reader comment: Comment?
36
39
  attr_reader overload: bool
40
+ attr_reader visibility: visibility?
37
41
 
38
- def initialize: (name: Symbol, kind: kind, types: Array[MethodType], annotations: Array[Annotation], location: loc?, comment: Comment?, overload: boolish) -> void
42
+ def initialize: (name: Symbol, kind: kind, types: Array[MethodType], annotations: Array[Annotation], location: loc?, comment: Comment?, overload: boolish, ?visibility: visibility?) -> void
39
43
 
40
44
  include _HashEqual
41
45
  include _ToJson
@@ -46,7 +50,7 @@ module RBS
46
50
 
47
51
  def overload?: () -> bool
48
52
 
49
- def update: (?name: Symbol, ?kind: kind, ?types: Array[MethodType], ?annotations: Array[Annotation], ?location: loc?, ?comment: Comment?, ?overload: boolish) -> MethodDefinition
53
+ def update: (?name: Symbol, ?kind: kind, ?types: Array[MethodType], ?annotations: Array[Annotation], ?location: loc?, ?comment: Comment?, ?overload: boolish, ?visibility: visibility?) -> MethodDefinition
50
54
  end
51
55
 
52
56
  module Var
@@ -133,15 +137,16 @@ module RBS
133
137
  # ^^^^ name
134
138
  # ^ colon
135
139
  #
136
- # attr_accessor self.name (@foo) : String
137
- # ^^^^^^^^^^^^^ keyword
138
- # ^^^^^ kind
139
- # ^^^^ name
140
- # ^^^^^^ ivar
141
- # ^^^^ ivar_name
142
- # ^ colon
140
+ # public attr_accessor self.name (@foo) : String
141
+ # ^^^^^^ visibility
142
+ # ^^^^^^^^^^^^^ keyword
143
+ # ^^^^^ kind
144
+ # ^^^^ name
145
+ # ^^^^^^ ivar
146
+ # ^^^^ ivar_name
147
+ # ^ colon
143
148
  #
144
- type loc = Location[:keyword | :name | :colon, :kind | :ivar | :ivar_name]
149
+ type loc = Location[:keyword | :name | :colon, :kind | :ivar | :ivar_name | :visibility]
145
150
 
146
151
  attr_reader name: Symbol
147
152
  attr_reader type: Types::t
@@ -150,12 +155,13 @@ module RBS
150
155
  attr_reader annotations: Array[Annotation]
151
156
  attr_reader location: loc?
152
157
  attr_reader comment: Comment?
158
+ attr_reader visibility: visibility?
153
159
 
154
- def initialize: (name: Symbol, type: Types::t, ivar_name: Symbol | false | nil, kind: kind, annotations: Array[Annotation], location: loc?, comment: Comment?) -> void
160
+ def initialize: (name: Symbol, type: Types::t, ivar_name: Symbol | false | nil, kind: kind, annotations: Array[Annotation], location: loc?, comment: Comment?, ?visibility: visibility?) -> void
155
161
 
156
162
  include _HashEqual
157
163
 
158
- def update: (?name: Symbol, ?type: Types::t, ?ivar_name: Symbol | false | nil, ?kind: kind, ?annotations: Array[Annotation], ?location: loc?, ?comment: Comment?) -> instance
164
+ def update: (?name: Symbol, ?type: Types::t, ?ivar_name: Symbol | false | nil, ?kind: kind, ?annotations: Array[Annotation], ?location: loc?, ?comment: Comment?, ?visibility: visibility) -> instance
159
165
  end
160
166
 
161
167
  class AttrReader < Base
@@ -6,7 +6,8 @@ module RBS
6
6
 
7
7
  class Definition
8
8
  type original = AST::Members::MethodDefinition | AST::Members::Alias | AST::Members::AttrAccessor | AST::Members::AttrWriter | AST::Members::AttrReader
9
- type accessibility = :public | :private
9
+
10
+ type accessibility = RBS::Definition::accessibility
10
11
 
11
12
  attr_reader name: Symbol
12
13
  attr_reader type: instance_type
@@ -59,11 +60,11 @@ module RBS
59
60
 
60
61
  def build_interface: (TypeName) -> Methods
61
62
 
62
- def build_alias: (Methods, Methods::instance_type, member: AST::Members::Alias, accessibility: Methods::Definition::accessibility) -> void
63
+ def build_alias: (Methods, Methods::instance_type, member: AST::Members::Alias) -> void
63
64
 
64
- def build_attribute: (Methods, Methods::instance_type, member: AST::Members::AttrAccessor | AST::Members::AttrReader | AST::Members::AttrWriter, accessibility: Methods::Definition::accessibility) -> void
65
+ def build_attribute: (Methods, Methods::instance_type, member: AST::Members::AttrAccessor | AST::Members::AttrReader | AST::Members::AttrWriter, accessibility: Definition::accessibility) -> void
65
66
 
66
- def build_method: (Methods, Methods::instance_type, member: AST::Members::MethodDefinition, accessibility: Methods::Definition::accessibility) -> void
67
+ def build_method: (Methods, Methods::instance_type, member: AST::Members::MethodDefinition, accessibility: Definition::accessibility) -> void
67
68
 
68
69
  def each_member_with_accessibility: (Array[AST::Members::t | AST::Declarations::t], ?accessibility: Definition::accessibility) { (AST::Members::t | AST::Declarations::t, Definition::accessibility) -> void } -> void
69
70
 
data/sig/writer.rbs CHANGED
@@ -1,4 +1,6 @@
1
1
  module RBS
2
+ # Writer prints RBS AST to String.
3
+ #
2
4
  class Writer
3
5
  interface _IO
4
6
  def puts: (*untyped) -> void
@@ -6,23 +8,96 @@ module RBS
6
8
  def flush: () -> void
7
9
  end
8
10
 
11
+ # Channel to output the result.
12
+ #
9
13
  attr_reader out: _IO
14
+
15
+ # Array of indentations.
16
+ #
10
17
  attr_reader indentation: Array[String]
11
18
 
12
19
  def initialize: (out: _IO) -> void
13
20
 
21
+ # Output the array of declarations.
22
+ # It automatically inserts empty lines between the declarations.
23
+ #
24
+ def write: (Array[AST::Declarations::t]) -> void
25
+
26
+ def preserve?: () -> bool
27
+
28
+ def preserve!: (?preserve: bool) -> self
29
+
30
+ private
31
+
32
+ @preserve: bool
33
+
34
+ # Increases the indentation and yields the block.
35
+ #
14
36
  def indent: (?Integer size) { () -> void } -> void
15
37
 
38
+ # Returns the current indentation of lines.
39
+ #
16
40
  def prefix: () -> String
17
41
 
42
+ # Prints a string.
43
+ # Automatically appends the `#prefix` and newline at the end.
44
+ #
18
45
  def puts: (?String) -> void
19
46
 
47
+ # Prints a (possibly) multi-line string.
48
+ #
49
+ # Drops `leading_spaces` of spaces at the beginning of each line.
50
+ #
51
+ # ```ruby
52
+ # put_lines(<<TEXT, leading_spaces: 0)
53
+ # Hello
54
+ # world!
55
+ # TEXT
56
+ #
57
+ # # Outputs
58
+ # # Hello
59
+ # # world!
60
+ #
61
+ # put_lines(<<TEXT, leading_spaces: 2)
62
+ # Hello
63
+ # world!
64
+ # TEXT
65
+ #
66
+ # # Outputs
67
+ # # Hello
68
+ # # world!
69
+ # ```
70
+ #
71
+ # This is for `Location#source`.
72
+ # The `#source` returns the text spans from the beginning to end of the element.
73
+ # It will look like the following.
74
+ #
75
+ # ```rbs
76
+ # module Foo
77
+ # type t = Integer # the definition of `t` starts from line=2, column=2
78
+ # | String
79
+ # | :false # the definition of `t` ends from line=4, column=17
80
+ # end
81
+ # ```
82
+ #
83
+ # The expected output will be something like:
84
+ #
85
+ # ```rbs
86
+ # type t = Integer # Extracted from `Foo` definition and keeps the line breaks
87
+ # | String
88
+ # | :false
89
+ # ```
90
+ #
91
+ # And it can be done with a `#put_lines(source, leading_spaces: 2)` call.
92
+ #
93
+ def put_lines: (String, leading_spaces: Integer) -> void
94
+
95
+ def write_loc_source: (_Located) { () -> void } -> void
96
+
20
97
  def write_annotation: (Array[AST::Annotation]) -> void
21
98
 
22
99
  def write_comment: (AST::Comment?) -> void
23
100
 
24
- def write: (Array[AST::Declarations::t]) -> void
25
-
26
101
  def write_decl: (AST::Declarations::t) -> void
27
102
 
28
103
  def write_member: (AST::Declarations::Module::member) -> void
@@ -31,6 +106,8 @@ module RBS
31
106
 
32
107
  def name_and_args: (TypeName, Array[Types::t]) -> String?
33
108
 
109
+ def write_alias: (AST::Declarations::Alias) -> void
110
+
34
111
  def method_name: (Symbol) -> String
35
112
 
36
113
  def write_def: (AST::Members::MethodDefinition) -> void
@@ -1,2 +1,3 @@
1
1
  dependencies:
2
2
  - name: uri
3
+ - name: timeout
@@ -33,6 +33,27 @@ module Net
33
33
  class HTTPHeaderSyntaxError < StandardError
34
34
  end
35
35
 
36
+ # <!-- rdoc-file=lib/net/protocol.rb -->
37
+ # OpenTimeout, a subclass of Timeout::Error, is raised if a connection cannot be
38
+ # created within the open_timeout.
39
+ #
40
+ class OpenTimeout < Timeout::Error
41
+ end
42
+
43
+ # <!-- rdoc-file=lib/net/protocol.rb -->
44
+ # ReadTimeout, a subclass of Timeout::Error, is raised if a chunk of the
45
+ # response cannot be read within the read_timeout.
46
+ #
47
+ class ReadTimeout < Timeout::Error
48
+ end
49
+
50
+ # <!-- rdoc-file=lib/net/protocol.rb -->
51
+ # WriteTimeout, a subclass of Timeout::Error, is raised if a chunk of the
52
+ # response cannot be written within the write_timeout. Not raised on Windows.
53
+ #
54
+ class WriteTimeout < Timeout::Error
55
+ end
56
+
36
57
  # <!-- rdoc-file=lib/net/http.rb -->
37
58
  # ## An HTTP client API for Ruby.
38
59
  #
@@ -880,7 +880,7 @@ module URI
880
880
  # uri.merge!("/main.rbx?page=1")
881
881
  # uri.to_s # => "http://my.example.com/main.rbx?page=1"
882
882
  #
883
- def merge!: (string oth) -> String
883
+ def merge!: (URI::Generic | string oth) -> String
884
884
 
885
885
  # <!--
886
886
  # rdoc-file=lib/uri/generic.rb
@@ -904,7 +904,7 @@ module URI
904
904
  # uri.merge("/main.rbx?page=1")
905
905
  # # => "http://my.example.com/main.rbx?page=1"
906
906
  #
907
- def merge: (string oth) -> URI::Generic
907
+ def merge: (URI::Generic | string oth) -> URI::Generic
908
908
 
909
909
  # :stopdoc:
910
910
  def route_from_path: (String src, String dst) -> String