rbs 0.11.0 → 0.12.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +5 -0
- data/Rakefile +9 -4
- data/Steepfile +28 -0
- data/bin/steep +4 -0
- data/bin/test_runner.rb +10 -5
- data/lib/rbs/ast/comment.rb +7 -1
- data/lib/rbs/ast/declarations.rb +15 -9
- data/lib/rbs/buffer.rb +1 -1
- data/lib/rbs/definition.rb +22 -13
- data/lib/rbs/definition_builder.rb +79 -55
- data/lib/rbs/environment.rb +24 -10
- data/lib/rbs/location.rb +1 -5
- data/lib/rbs/method_type.rb +5 -5
- data/lib/rbs/namespace.rb +14 -3
- data/lib/rbs/parser.y +0 -8
- data/lib/rbs/prototype/rb.rb +3 -4
- data/lib/rbs/prototype/rbi.rb +1 -2
- data/lib/rbs/substitution.rb +4 -3
- data/lib/rbs/type_name.rb +18 -1
- data/lib/rbs/type_name_resolver.rb +10 -3
- data/lib/rbs/types.rb +27 -21
- data/lib/rbs/variance_calculator.rb +8 -5
- data/lib/rbs/version.rb +1 -1
- data/sig/annotation.rbs +26 -0
- data/sig/buffer.rbs +28 -0
- data/sig/builtin_names.rbs +41 -0
- data/sig/comment.rbs +26 -0
- data/sig/declarations.rbs +202 -0
- data/sig/definition.rbs +129 -0
- data/sig/definition_builder.rbs +95 -0
- data/sig/environment.rbs +94 -0
- data/sig/environment_loader.rbs +4 -0
- data/sig/location.rbs +52 -0
- data/sig/members.rbs +160 -0
- data/sig/method_types.rbs +40 -0
- data/sig/namespace.rbs +124 -0
- data/sig/polyfill.rbs +3 -0
- data/sig/rbs.rbs +3 -0
- data/sig/substitution.rbs +39 -0
- data/sig/type_name_resolver.rbs +24 -0
- data/sig/typename.rbs +70 -0
- data/sig/types.rbs +361 -0
- data/sig/util.rbs +13 -0
- data/sig/variance_calculator.rbs +35 -0
- data/stdlib/bigdecimal/big_decimal.rbs +887 -0
- data/stdlib/bigdecimal/math/big_math.rbs +142 -0
- data/stdlib/builtin/builtin.rbs +0 -3
- data/stdlib/builtin/math.rbs +26 -26
- data/stdlib/builtin/struct.rbs +9 -10
- data/stdlib/forwardable/forwardable.rbs +204 -0
- data/stdlib/set/set.rbs +1 -1
- data/stdlib/uri/file.rbs +167 -0
- data/stdlib/uri/generic.rbs +875 -0
- data/steep/Gemfile +3 -0
- data/steep/Gemfile.lock +55 -0
- metadata +36 -6
@@ -73,11 +73,11 @@ module RBS
|
|
73
73
|
type(param.type, result: result, context: :contravariant)
|
74
74
|
end
|
75
75
|
|
76
|
-
if method_type.block
|
77
|
-
|
76
|
+
if block = method_type.block
|
77
|
+
block.type.each_param do |param|
|
78
78
|
type(param.type, result: result, context: :covariant)
|
79
79
|
end
|
80
|
-
type(
|
80
|
+
type(block.type.return_type, result: result, context: :contravariant)
|
81
81
|
end
|
82
82
|
|
83
83
|
type(method_type.type.return_type, result: result, context: :covariant)
|
@@ -113,9 +113,9 @@ module RBS
|
|
113
113
|
|
114
114
|
type_params = case type
|
115
115
|
when Types::ClassInstance
|
116
|
-
env.class_decls[type.name]
|
116
|
+
env.class_decls[type.name].type_params
|
117
117
|
when Types::Interface
|
118
|
-
env.interface_decls[type.name]
|
118
|
+
env.interface_decls[type.name].decl.type_params
|
119
119
|
end
|
120
120
|
|
121
121
|
type.args.each.with_index do |ty, i|
|
@@ -126,6 +126,7 @@ module RBS
|
|
126
126
|
when :covariant
|
127
127
|
type(ty, result: result, context: context)
|
128
128
|
when :contravariant
|
129
|
+
# @type var con: variance
|
129
130
|
con = case context
|
130
131
|
when :invariant
|
131
132
|
:invariant
|
@@ -133,6 +134,8 @@ module RBS
|
|
133
134
|
:contravariant
|
134
135
|
when :contravariant
|
135
136
|
:covariant
|
137
|
+
else
|
138
|
+
raise
|
136
139
|
end
|
137
140
|
type(ty, result: result, context: con)
|
138
141
|
end
|
data/lib/rbs/version.rb
CHANGED
data/sig/annotation.rbs
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
module RBS
|
2
|
+
module AST
|
3
|
+
# RBS allows writing annotations of declarations and members.
|
4
|
+
#
|
5
|
+
# %a{annotation_here}
|
6
|
+
# class Hello
|
7
|
+
# %a{rbs:test:skip}
|
8
|
+
# def foo: () -> void
|
9
|
+
# end
|
10
|
+
#
|
11
|
+
class Annotation
|
12
|
+
attr_reader string: String
|
13
|
+
attr_reader location: Location?
|
14
|
+
|
15
|
+
def initialize: (string: String, location: Location?) -> void
|
16
|
+
|
17
|
+
def ==: (untyped other) -> bool
|
18
|
+
|
19
|
+
alias eql? ==
|
20
|
+
|
21
|
+
def hash: () -> Integer
|
22
|
+
|
23
|
+
def to_json: (*untyped) -> String
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
data/sig/buffer.rbs
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
module RBS
|
2
|
+
class Buffer
|
3
|
+
# Location in a buffer.
|
4
|
+
# A pair of line number (1 origin) and column number (0 origin).
|
5
|
+
#
|
6
|
+
type loc = [Integer, Integer]
|
7
|
+
|
8
|
+
# Name to identify Buffer.
|
9
|
+
attr_reader name: untyped
|
10
|
+
|
11
|
+
# The content of the buffer.
|
12
|
+
attr_reader content: String
|
13
|
+
|
14
|
+
attr_reader lines: Array[String]
|
15
|
+
|
16
|
+
attr_reader ranges: Array[Range[Integer]]
|
17
|
+
|
18
|
+
def initialize: (name: untyped name, content: String content) -> void
|
19
|
+
|
20
|
+
# Translate position to location.
|
21
|
+
def pos_to_loc: (Integer pos) -> loc
|
22
|
+
|
23
|
+
# Translate location to position.
|
24
|
+
def loc_to_pos: (loc loc) -> Integer
|
25
|
+
|
26
|
+
def last_position: () -> Integer
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
module RBS
|
2
|
+
module BuiltinNames
|
3
|
+
class Name
|
4
|
+
attr_reader name: TypeName
|
5
|
+
|
6
|
+
def initialize: (name: TypeName) -> void
|
7
|
+
|
8
|
+
def to_s: () -> String
|
9
|
+
|
10
|
+
def instance_type: (*Types::t) -> Types::ClassInstance
|
11
|
+
|
12
|
+
def instance_type?: (Types::t) -> bool
|
13
|
+
|
14
|
+
def singleton_type: () -> Types::ClassSingleton
|
15
|
+
|
16
|
+
def singleton_type?: (Types::t) -> bool
|
17
|
+
|
18
|
+
def self.define: (Symbol, ?namespace: Namespace) -> instance
|
19
|
+
end
|
20
|
+
|
21
|
+
BasicObject: Name
|
22
|
+
Object: Name
|
23
|
+
Kernel: Name
|
24
|
+
String: Name
|
25
|
+
Comparable: Name
|
26
|
+
Enumerable: Name
|
27
|
+
Class: Name
|
28
|
+
Module: Name
|
29
|
+
Array: Name
|
30
|
+
Hash: Name
|
31
|
+
Range: Name
|
32
|
+
Enumerator: Name
|
33
|
+
Set: Name
|
34
|
+
Symbol: Name
|
35
|
+
Integer: Name
|
36
|
+
Float: Name
|
37
|
+
Regexp: Name
|
38
|
+
TrueClass: Name
|
39
|
+
FalseClass: Name
|
40
|
+
end
|
41
|
+
end
|
data/sig/comment.rbs
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
module RBS
|
2
|
+
module AST
|
3
|
+
# RBS allows writing documentation of declarations and members.
|
4
|
+
#
|
5
|
+
# # This is a doc for class.
|
6
|
+
# class Hello
|
7
|
+
# end
|
8
|
+
#
|
9
|
+
class Comment
|
10
|
+
attr_reader string: String
|
11
|
+
attr_reader location: Location?
|
12
|
+
|
13
|
+
def initialize: (string: String, location: Location?) -> void
|
14
|
+
|
15
|
+
def ==: (untyped other) -> bool
|
16
|
+
|
17
|
+
alias eql? ==
|
18
|
+
|
19
|
+
def hash: () -> Integer
|
20
|
+
|
21
|
+
def to_json: (*untyped) -> String
|
22
|
+
|
23
|
+
def concat: (string: String, location: Location?) -> self
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,202 @@
|
|
1
|
+
module RBS
|
2
|
+
module AST
|
3
|
+
module Declarations
|
4
|
+
type t = Class | Module | Interface | Constant | Global | Alias
|
5
|
+
|
6
|
+
class Base
|
7
|
+
end
|
8
|
+
|
9
|
+
type variance = :invariant | :covariant | :contravariant
|
10
|
+
|
11
|
+
class ModuleTypeParams
|
12
|
+
class TypeParam
|
13
|
+
attr_reader name: Symbol
|
14
|
+
attr_reader variance: variance
|
15
|
+
attr_reader skip_validation: bool
|
16
|
+
|
17
|
+
def initialize: (name: Symbol, variance: variance, skip_validation: bool) -> void
|
18
|
+
|
19
|
+
include _ToJson
|
20
|
+
end
|
21
|
+
|
22
|
+
attr_reader params: Array[TypeParam]
|
23
|
+
|
24
|
+
def initialize: () -> void
|
25
|
+
|
26
|
+
def add: (TypeParam param) -> self
|
27
|
+
|
28
|
+
include _HashEqual
|
29
|
+
include _ToJson
|
30
|
+
|
31
|
+
def []: (Symbol) -> TypeParam?
|
32
|
+
|
33
|
+
def each: { (TypeParam) -> void } -> void
|
34
|
+
| () -> Enumerator[TypeParam, void]
|
35
|
+
|
36
|
+
def self.empty: () -> instance
|
37
|
+
|
38
|
+
def variance: (Symbol) -> variance
|
39
|
+
|
40
|
+
def skip_validation?: (Symbol) -> bool
|
41
|
+
|
42
|
+
def empty?: () -> bool
|
43
|
+
|
44
|
+
def size: () -> Integer
|
45
|
+
|
46
|
+
def rename_to: (Array[Symbol] names) -> ModuleTypeParams
|
47
|
+
end
|
48
|
+
|
49
|
+
interface _WithMember
|
50
|
+
def members: () -> Array[untyped]
|
51
|
+
end
|
52
|
+
|
53
|
+
module NestedDeclarationHelper : _WithMember
|
54
|
+
def each_member: () { (Members::t) -> void } -> void
|
55
|
+
| () -> Enumerator[Members::t, void]
|
56
|
+
|
57
|
+
def each_decl: () { (t) -> void } -> void
|
58
|
+
| () -> Enumerator[t, void]
|
59
|
+
end
|
60
|
+
|
61
|
+
module MixinHelper : _WithMember
|
62
|
+
type mixin_member = Members::Include | Members::Extend | Members::Prepend
|
63
|
+
|
64
|
+
@mixins: Array[mixin_member]
|
65
|
+
|
66
|
+
def each_mixin: () { (mixin_member) -> void } -> void
|
67
|
+
| () -> Enumerator[mixin_member, void]
|
68
|
+
end
|
69
|
+
|
70
|
+
class Class < Base
|
71
|
+
type member = Members::t | t
|
72
|
+
|
73
|
+
class Super
|
74
|
+
attr_reader name: TypeName
|
75
|
+
attr_reader args: Array[Types::t]
|
76
|
+
|
77
|
+
def initialize: (name: TypeName, args: Array[Types::t]) -> void
|
78
|
+
|
79
|
+
include _HashEqual
|
80
|
+
include _ToJson
|
81
|
+
end
|
82
|
+
|
83
|
+
include NestedDeclarationHelper
|
84
|
+
include MixinHelper
|
85
|
+
|
86
|
+
attr_reader name: TypeName
|
87
|
+
attr_reader type_params: ModuleTypeParams
|
88
|
+
attr_reader members: Array[member]
|
89
|
+
attr_reader super_class: Super?
|
90
|
+
attr_reader annotations: Array[Annotation]
|
91
|
+
attr_reader location: Location?
|
92
|
+
attr_reader comment: Comment?
|
93
|
+
|
94
|
+
def initialize: (name: TypeName, type_params: ModuleTypeParams, members: Array[member], super_class: Super?, annotations: Array[Annotation], location: Location?, comment: Comment?) -> void
|
95
|
+
|
96
|
+
include _HashEqual
|
97
|
+
include _ToJson
|
98
|
+
end
|
99
|
+
|
100
|
+
class Module < Base
|
101
|
+
type member = Members::t | t
|
102
|
+
|
103
|
+
class Self
|
104
|
+
attr_reader name: TypeName
|
105
|
+
attr_reader args: Array[Types::t]
|
106
|
+
attr_reader location: Location?
|
107
|
+
|
108
|
+
def initialize: (name: TypeName, args: Array[Types::t], location: Location?) -> void
|
109
|
+
|
110
|
+
include _HashEqual
|
111
|
+
include _ToJson
|
112
|
+
|
113
|
+
def to_s: () -> String
|
114
|
+
end
|
115
|
+
|
116
|
+
include NestedDeclarationHelper
|
117
|
+
include MixinHelper
|
118
|
+
|
119
|
+
attr_reader name: TypeName
|
120
|
+
attr_reader type_params: ModuleTypeParams
|
121
|
+
attr_reader members: Array[member]
|
122
|
+
attr_reader location: Location?
|
123
|
+
attr_reader annotations: Array[Annotation]
|
124
|
+
attr_reader self_types: Array[Self]
|
125
|
+
attr_reader comment: Comment?
|
126
|
+
|
127
|
+
def initialize: (name: TypeName, type_params: ModuleTypeParams, members: Array[member], location: Location?, annotations: Array[Annotation], self_types: Array[Self], comment: Comment?) -> void
|
128
|
+
|
129
|
+
include _HashEqual
|
130
|
+
include _ToJson
|
131
|
+
end
|
132
|
+
|
133
|
+
class Extension < Base
|
134
|
+
attr_reader name: TypeName
|
135
|
+
attr_reader type_params: ModuleTypeParams
|
136
|
+
attr_reader extension_name: Symbol
|
137
|
+
attr_reader members: Array[Members::t]
|
138
|
+
attr_reader annotations: Array[Annotation]
|
139
|
+
attr_reader location: Location?
|
140
|
+
attr_reader comment: Comment?
|
141
|
+
|
142
|
+
def initialize: (name: TypeName, type_params: ModuleTypeParams, extension_name: Symbol, members: Array[Members::t], annotations: Array[Annotation], location: Location?, comment: Comment?) -> void
|
143
|
+
|
144
|
+
include _HashEqual
|
145
|
+
include _ToJson
|
146
|
+
end
|
147
|
+
|
148
|
+
class Interface
|
149
|
+
type member = Members::t
|
150
|
+
|
151
|
+
attr_reader name: TypeName
|
152
|
+
attr_reader type_params: ModuleTypeParams
|
153
|
+
attr_reader members: Array[member]
|
154
|
+
attr_reader annotations: Array[Annotation]
|
155
|
+
attr_reader location: Location?
|
156
|
+
attr_reader comment: Comment?
|
157
|
+
|
158
|
+
def initialize: (name: TypeName, type_params: ModuleTypeParams, members: Array[member], annotations: Array[Annotation], location: Location?, comment: Comment?) -> void
|
159
|
+
|
160
|
+
include _HashEqual
|
161
|
+
include _ToJson
|
162
|
+
end
|
163
|
+
|
164
|
+
class Alias < Base
|
165
|
+
attr_reader name: TypeName
|
166
|
+
attr_reader type: Types::t
|
167
|
+
attr_reader annotations: Array[Annotation]
|
168
|
+
attr_reader location: Location?
|
169
|
+
attr_reader comment: Comment?
|
170
|
+
|
171
|
+
def initialize: (name: TypeName, type: Types::t, annotations: Array[Annotation], location: Location?, comment: Comment?) -> void
|
172
|
+
|
173
|
+
include _HashEqual
|
174
|
+
include _ToJson
|
175
|
+
end
|
176
|
+
|
177
|
+
class Constant < Base
|
178
|
+
attr_reader name: TypeName
|
179
|
+
attr_reader type: Types::t
|
180
|
+
attr_reader location: Location?
|
181
|
+
attr_reader comment: Comment?
|
182
|
+
|
183
|
+
def initialize: (name: TypeName, type: Types::t, location: Location?, comment: Comment?) -> void
|
184
|
+
|
185
|
+
include _HashEqual
|
186
|
+
include _ToJson
|
187
|
+
end
|
188
|
+
|
189
|
+
class Global < Base
|
190
|
+
attr_reader name: Symbol
|
191
|
+
attr_reader type: Types::t
|
192
|
+
attr_reader location: Location?
|
193
|
+
attr_reader comment: Comment?
|
194
|
+
|
195
|
+
def initialize: (name: Symbol, type: Types::t, location: Location?, comment: Comment?) -> void
|
196
|
+
|
197
|
+
include _HashEqual
|
198
|
+
include _ToJson
|
199
|
+
end
|
200
|
+
end
|
201
|
+
end
|
202
|
+
end
|
data/sig/definition.rbs
ADDED
@@ -0,0 +1,129 @@
|
|
1
|
+
module RBS
|
2
|
+
class Definition
|
3
|
+
type accessibility = :public | :private
|
4
|
+
|
5
|
+
class Variable
|
6
|
+
attr_reader parent_variable: Variable?
|
7
|
+
attr_reader type: Types::t
|
8
|
+
attr_reader declared_in: TypeName
|
9
|
+
|
10
|
+
def initialize: (parent_variable: Variable?, type: Types::t, declared_in: TypeName) -> void
|
11
|
+
|
12
|
+
def sub: (Substitution) -> Variable
|
13
|
+
end
|
14
|
+
|
15
|
+
class Method
|
16
|
+
type method_member = AST::Members::MethodDefinition | AST::Members::AttrReader | AST::Members::AttrAccessor | AST::Members::AttrWriter
|
17
|
+
|
18
|
+
class TypeDef
|
19
|
+
attr_reader type: MethodType
|
20
|
+
attr_reader member: method_member
|
21
|
+
attr_reader defined_in: TypeName?
|
22
|
+
attr_reader implemented_in: TypeName?
|
23
|
+
|
24
|
+
def initialize: (type: MethodType, member: method_member, defined_in: TypeName?, implemented_in: TypeName?) -> void
|
25
|
+
|
26
|
+
def comment: () -> AST::Comment?
|
27
|
+
|
28
|
+
def annotations: () -> Array[AST::Annotation]
|
29
|
+
|
30
|
+
def update: (?type: MethodType, ?member: method_member, ?defined_in: TypeName?, ?implemented_in: TypeName?) -> TypeDef
|
31
|
+
|
32
|
+
def overload?: () -> bool
|
33
|
+
end
|
34
|
+
|
35
|
+
attr_reader super_method: Method?
|
36
|
+
attr_reader defs: Array[TypeDef]
|
37
|
+
attr_reader accessibility: accessibility
|
38
|
+
attr_reader extra_annotations: Array[AST::Annotation]
|
39
|
+
attr_reader defined_in: TypeName?
|
40
|
+
attr_reader implemented_in: TypeName?
|
41
|
+
attr_reader method_types: Array[MethodType]
|
42
|
+
attr_reader comments: Array[AST::Comment]
|
43
|
+
attr_reader annotations: Array[AST::Annotation]
|
44
|
+
attr_reader members: Array[method_member]
|
45
|
+
|
46
|
+
def initialize: (super_method: Method?, defs: Array[TypeDef], accessibility: accessibility, ?annotations: Array[AST::Annotation]) -> void
|
47
|
+
|
48
|
+
def public?: () -> bool
|
49
|
+
|
50
|
+
def private?: () -> bool
|
51
|
+
|
52
|
+
def sub: (Substitution) -> Method
|
53
|
+
|
54
|
+
def map_type: () { (Types::t) -> Types::t } -> Method
|
55
|
+
|
56
|
+
def map_method_type: () { (MethodType) -> MethodType } -> Method
|
57
|
+
end
|
58
|
+
|
59
|
+
module Ancestor
|
60
|
+
type t = Instance | Singleton
|
61
|
+
|
62
|
+
class Instance
|
63
|
+
attr_reader name: TypeName
|
64
|
+
attr_reader args: Array[Types::t]
|
65
|
+
|
66
|
+
def initialize: (name: TypeName, args: Array[Types::t]) -> void
|
67
|
+
end
|
68
|
+
|
69
|
+
class Singleton
|
70
|
+
attr_reader name: TypeName
|
71
|
+
|
72
|
+
def initialize: (name: TypeName) -> void
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
class InstanceAncestors
|
77
|
+
attr_reader type_name: TypeName
|
78
|
+
attr_reader params: Array[Symbol]
|
79
|
+
attr_reader ancestors: Array[Ancestor::t]
|
80
|
+
|
81
|
+
def initialize: (type_name: TypeName, params: Array[Symbol], ancestors: Array[Ancestor::t]) -> void
|
82
|
+
|
83
|
+
def apply: (Array[Types::t], location: Location?) -> Array[Ancestor::t]
|
84
|
+
end
|
85
|
+
|
86
|
+
class SingletonAncestors
|
87
|
+
attr_reader type_name: TypeName
|
88
|
+
attr_reader ancestors: Array[Ancestor::t]
|
89
|
+
|
90
|
+
def initialize: (type_name: TypeName, ancestors: Array[Ancestor::t]) -> void
|
91
|
+
end
|
92
|
+
|
93
|
+
type self_type = Types::ClassSingleton | Types::ClassInstance | Types::Interface
|
94
|
+
type definition_entry = Environment::ModuleEntry | Environment::ClassEntry | Environment::SingleEntry[TypeName, AST::Declarations::Interface]
|
95
|
+
|
96
|
+
attr_reader type_name: TypeName
|
97
|
+
attr_reader entry: definition_entry
|
98
|
+
attr_reader ancestors: InstanceAncestors | SingletonAncestors | nil
|
99
|
+
attr_reader self_type: self_type
|
100
|
+
attr_reader methods: Hash[Symbol, Method]
|
101
|
+
attr_reader instance_variables: Hash[Symbol, Variable]
|
102
|
+
attr_reader class_variables: Hash[Symbol, Variable]
|
103
|
+
|
104
|
+
def initialize: (type_name: TypeName, entry: definition_entry, self_type: self_type, ancestors: InstanceAncestors | SingletonAncestors | nil) -> void
|
105
|
+
|
106
|
+
def class?: () -> bool
|
107
|
+
|
108
|
+
def module?: () -> bool
|
109
|
+
|
110
|
+
def interface?: () -> bool
|
111
|
+
|
112
|
+
def class_type?: () -> bool
|
113
|
+
|
114
|
+
def instance_type?: () -> bool
|
115
|
+
|
116
|
+
def interface_type?: () -> bool
|
117
|
+
|
118
|
+
def type_params: () -> Array[Symbol]
|
119
|
+
|
120
|
+
def type_params_decl: () -> AST::Declarations::ModuleTypeParams
|
121
|
+
|
122
|
+
def sub: (Substitution) -> Definition
|
123
|
+
|
124
|
+
def map_method_type: () { (MethodType) -> MethodType } -> Definition
|
125
|
+
|
126
|
+
def each_type: () { (Types::t) -> void } -> void
|
127
|
+
| () -> Enumerator[Types::t, void]
|
128
|
+
end
|
129
|
+
end
|