sorbet-runtime 0.5.9327 → 0.5.9338
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/lib/sorbet-runtime.rb +2 -2
- data/lib/types/private/methods/_methods.rb +13 -10
- data/lib/types/private/methods/decl_builder.rb +103 -7
- data/lib/types/sig.rb +46 -3
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: dd07f89d57f3da4bd05dc16bfe0163a67f417549c6e65771415df742fb02882f
|
4
|
+
data.tar.gz: 4e7650cda8f79b6a7bd0afc041ffbf9f2c07e596fb52fc38f8526f4b1cf723da
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3dfb99200d94190aad5bd3ec27179b43a552c543c03c5be771de8b5985d1571c6e60e9ccc9ecf9b42a0bb1fe09f25ddca10e51a0e70b35cfca5a3fae27e19414
|
7
|
+
data.tar.gz: 31299aee649d7479933ea1b5eb3c1ae514279b02479e6d17f280753a964a5a0a6dd4da9feaeca83201e95cf7e807b302df7b4c31c5fa7f9460610e8a634b5f7c
|
data/lib/sorbet-runtime.rb
CHANGED
@@ -22,6 +22,8 @@ require_relative 'types/private/decl_state'
|
|
22
22
|
require_relative 'types/private/class_utils'
|
23
23
|
require_relative 'types/private/runtime_levels'
|
24
24
|
require_relative 'types/private/methods/_methods'
|
25
|
+
require_relative 'types/private/methods/modes'
|
26
|
+
require_relative 'types/private/methods/decl_builder'
|
25
27
|
require_relative 'types/sig'
|
26
28
|
require_relative 'types/helpers'
|
27
29
|
require_relative 'types/private/final'
|
@@ -60,7 +62,6 @@ require_relative 'types/types/type_member'
|
|
60
62
|
require_relative 'types/types/type_template'
|
61
63
|
|
62
64
|
# Call validation
|
63
|
-
require_relative 'types/private/methods/modes'
|
64
65
|
require_relative 'types/private/methods/call_validation'
|
65
66
|
|
66
67
|
# Signature validation
|
@@ -74,7 +75,6 @@ require_relative 'types/interface_wrapper'
|
|
74
75
|
require_relative 'types/private/abstract/declare'
|
75
76
|
require_relative 'types/private/abstract/hooks'
|
76
77
|
require_relative 'types/private/casts'
|
77
|
-
require_relative 'types/private/methods/decl_builder'
|
78
78
|
require_relative 'types/private/methods/signature'
|
79
79
|
require_relative 'types/private/retry'
|
80
80
|
require_relative 'types/utils'
|
@@ -29,12 +29,13 @@ module T::Private::Methods
|
|
29
29
|
ARG_NOT_PROVIDED = Object.new
|
30
30
|
PROC_TYPE = Object.new
|
31
31
|
|
32
|
-
DeclarationBlock = Struct.new(:mod, :loc, :blk, :
|
32
|
+
DeclarationBlock = Struct.new(:mod, :loc, :blk, :raw, :decl_builder)
|
33
33
|
|
34
34
|
def self.declare_sig(mod, loc, arg, &blk)
|
35
|
-
|
35
|
+
declaration = _declare_sig_internal(mod, loc, arg, &blk)
|
36
|
+
T::Private::DeclState.current.active_declaration = declaration
|
36
37
|
|
37
|
-
|
38
|
+
declaration.decl_builder
|
38
39
|
end
|
39
40
|
|
40
41
|
# See tests for how to use this. But you shouldn't be using this.
|
@@ -54,7 +55,10 @@ module T::Private::Methods
|
|
54
55
|
raise "Invalid argument to `sig`: #{arg}"
|
55
56
|
end
|
56
57
|
|
57
|
-
|
58
|
+
decl_builder = DeclBuilder.new(mod, raw)
|
59
|
+
decl_builder.final if arg == :final # needed for backwards compatibility with sig(:final) {...}
|
60
|
+
|
61
|
+
DeclarationBlock.new(mod, loc, blk, raw, decl_builder)
|
58
62
|
end
|
59
63
|
|
60
64
|
def self._with_declared_signature(mod, declblock, &blk)
|
@@ -213,7 +217,7 @@ module T::Private::Methods
|
|
213
217
|
current_declaration = T::Private::DeclState.current.active_declaration
|
214
218
|
mod = is_singleton_method ? hook_mod.singleton_class : hook_mod
|
215
219
|
|
216
|
-
if T::Private::Final.final_module?(mod) && (current_declaration.nil? || !current_declaration.final)
|
220
|
+
if T::Private::Final.final_module?(mod) && (current_declaration.nil? || !current_declaration.decl_builder.final?)
|
217
221
|
raise "#{mod} was declared as final but its method `#{method_name}` was not declared as final"
|
218
222
|
end
|
219
223
|
# Don't compute mod.ancestors if we don't need to bother checking final-ness.
|
@@ -277,7 +281,7 @@ module T::Private::Methods
|
|
277
281
|
end
|
278
282
|
|
279
283
|
@sig_wrappers[key] = sig_block
|
280
|
-
if current_declaration.final
|
284
|
+
if current_declaration.decl_builder.final?
|
281
285
|
@was_ever_final_names[method_name] = true
|
282
286
|
# use hook_mod, not mod, because for example, we want class C to be marked as having final if we def C.foo as
|
283
287
|
# final. change this to mod to see some final_method tests fail.
|
@@ -346,10 +350,9 @@ module T::Private::Methods
|
|
346
350
|
end
|
347
351
|
|
348
352
|
def self.run_builder(declaration_block)
|
349
|
-
|
350
|
-
|
351
|
-
.
|
352
|
-
.finalize!
|
353
|
+
declaration_block
|
354
|
+
.decl_builder
|
355
|
+
.run!(&declaration_block.blk)
|
353
356
|
.decl
|
354
357
|
end
|
355
358
|
|
@@ -2,9 +2,23 @@
|
|
2
2
|
# typed: true
|
3
3
|
|
4
4
|
module T::Private::Methods
|
5
|
-
Declaration = Struct.new(
|
5
|
+
Declaration = Struct.new(
|
6
|
+
:mod,
|
7
|
+
:params,
|
8
|
+
:returns,
|
9
|
+
:bind,
|
10
|
+
:mode,
|
11
|
+
:checked,
|
12
|
+
:finalized,
|
13
|
+
:on_failure,
|
14
|
+
:override_allow_incompatible,
|
15
|
+
:type_parameters,
|
16
|
+
:raw,
|
17
|
+
:final
|
18
|
+
)
|
6
19
|
|
7
20
|
class DeclBuilder
|
21
|
+
# The signature declaration the builder is composing (class `Declaration`)
|
8
22
|
attr_reader :decl
|
9
23
|
|
10
24
|
class BuilderError < StandardError; end
|
@@ -15,6 +29,24 @@ module T::Private::Methods
|
|
15
29
|
end
|
16
30
|
end
|
17
31
|
|
32
|
+
private def check_sig_block_is_unset!
|
33
|
+
if T::Private::DeclState.current.active_declaration&.blk
|
34
|
+
raise BuilderError.new(
|
35
|
+
"Cannot add more signature statements after the declaration block."
|
36
|
+
)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
# Verify if we're trying to invoke the method outside of a signature block. Notice that we need to check if it's a
|
41
|
+
# proc, because this is valid and would lead to a false positive: `T.type_alias { T.proc.params(a: Integer).void }`
|
42
|
+
private def check_running_inside_block!(method_name)
|
43
|
+
unless @inside_sig_block || decl.mod == T::Private::Methods::PROC_TYPE
|
44
|
+
raise BuilderError.new(
|
45
|
+
"Can't invoke #{method_name} outside of a signature declaration block"
|
46
|
+
)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
18
50
|
def initialize(mod, raw)
|
19
51
|
# TODO RUBYPLAT-1278 - with ruby 2.5, use kwargs here
|
20
52
|
@decl = Declaration.new(
|
@@ -28,12 +60,23 @@ module T::Private::Methods
|
|
28
60
|
ARG_NOT_PROVIDED, # on_failure
|
29
61
|
nil, # override_allow_incompatible
|
30
62
|
ARG_NOT_PROVIDED, # type_parameters
|
31
|
-
raw
|
63
|
+
raw,
|
64
|
+
ARG_NOT_PROVIDED, # final
|
32
65
|
)
|
66
|
+
@inside_sig_block = false
|
67
|
+
end
|
68
|
+
|
69
|
+
def run!(&block)
|
70
|
+
@inside_sig_block = true
|
71
|
+
instance_exec(&block)
|
72
|
+
finalize!
|
73
|
+
self
|
33
74
|
end
|
34
75
|
|
35
76
|
def params(**params)
|
36
77
|
check_live!
|
78
|
+
check_running_inside_block!(__method__)
|
79
|
+
|
37
80
|
if !decl.params.equal?(ARG_NOT_PROVIDED)
|
38
81
|
raise BuilderError.new("You can't call .params twice")
|
39
82
|
end
|
@@ -48,6 +91,8 @@ module T::Private::Methods
|
|
48
91
|
|
49
92
|
def returns(type)
|
50
93
|
check_live!
|
94
|
+
check_running_inside_block!(__method__)
|
95
|
+
|
51
96
|
if decl.returns.is_a?(T::Private::Types::Void)
|
52
97
|
raise BuilderError.new("You can't call .returns after calling .void.")
|
53
98
|
end
|
@@ -62,6 +107,8 @@ module T::Private::Methods
|
|
62
107
|
|
63
108
|
def void
|
64
109
|
check_live!
|
110
|
+
check_running_inside_block!(__method__)
|
111
|
+
|
65
112
|
if !decl.returns.equal?(ARG_NOT_PROVIDED)
|
66
113
|
raise BuilderError.new("You can't call .void after calling .returns.")
|
67
114
|
end
|
@@ -73,6 +120,8 @@ module T::Private::Methods
|
|
73
120
|
|
74
121
|
def bind(type)
|
75
122
|
check_live!
|
123
|
+
check_running_inside_block!(__method__)
|
124
|
+
|
76
125
|
if !decl.bind.equal?(ARG_NOT_PROVIDED)
|
77
126
|
raise BuilderError.new("You can't call .bind multiple times in a signature.")
|
78
127
|
end
|
@@ -84,6 +133,7 @@ module T::Private::Methods
|
|
84
133
|
|
85
134
|
def checked(level)
|
86
135
|
check_live!
|
136
|
+
check_running_inside_block!(__method__)
|
87
137
|
|
88
138
|
if !decl.checked.equal?(ARG_NOT_PROVIDED)
|
89
139
|
raise BuilderError.new("You can't call .checked multiple times in a signature.")
|
@@ -102,6 +152,7 @@ module T::Private::Methods
|
|
102
152
|
|
103
153
|
def on_failure(*args)
|
104
154
|
check_live!
|
155
|
+
check_running_inside_block!(__method__)
|
105
156
|
|
106
157
|
if !decl.on_failure.equal?(ARG_NOT_PROVIDED)
|
107
158
|
raise BuilderError.new("You can't call .on_failure multiple times in a signature.")
|
@@ -115,7 +166,7 @@ module T::Private::Methods
|
|
115
166
|
self
|
116
167
|
end
|
117
168
|
|
118
|
-
def abstract
|
169
|
+
def abstract(&blk)
|
119
170
|
check_live!
|
120
171
|
|
121
172
|
case decl.mode
|
@@ -127,15 +178,47 @@ module T::Private::Methods
|
|
127
178
|
raise BuilderError.new("`.abstract` cannot be combined with `.override` or `.overridable`.")
|
128
179
|
end
|
129
180
|
|
181
|
+
check_sig_block_is_unset!
|
182
|
+
|
183
|
+
if blk
|
184
|
+
T::Private::DeclState.current.active_declaration.blk = blk
|
185
|
+
end
|
186
|
+
|
130
187
|
self
|
131
188
|
end
|
132
189
|
|
133
|
-
def final
|
190
|
+
def final(&blk)
|
134
191
|
check_live!
|
135
|
-
|
192
|
+
|
193
|
+
if !decl.final.equal?(ARG_NOT_PROVIDED)
|
194
|
+
raise BuilderError.new("You can't call .final multiple times in a signature.")
|
195
|
+
end
|
196
|
+
|
197
|
+
if @inside_sig_block
|
198
|
+
raise BuilderError.new(
|
199
|
+
"Unlike other sig annotations, the `final` annotation must remain outside the sig block, " \
|
200
|
+
"using either `sig(:final) {...}` or `sig.final {...}`, not `sig {final. ...}"
|
201
|
+
)
|
202
|
+
end
|
203
|
+
|
204
|
+
raise BuilderError.new(".final cannot be repeated in a single signature") if final?
|
205
|
+
|
206
|
+
decl.final = true
|
207
|
+
|
208
|
+
check_sig_block_is_unset!
|
209
|
+
|
210
|
+
if blk
|
211
|
+
T::Private::DeclState.current.active_declaration.blk = blk
|
212
|
+
end
|
213
|
+
|
214
|
+
self
|
136
215
|
end
|
137
216
|
|
138
|
-
def
|
217
|
+
def final?
|
218
|
+
!decl.final.equal?(ARG_NOT_PROVIDED) && decl.final
|
219
|
+
end
|
220
|
+
|
221
|
+
def override(allow_incompatible: false, &blk)
|
139
222
|
check_live!
|
140
223
|
|
141
224
|
case decl.mode
|
@@ -150,10 +233,16 @@ module T::Private::Methods
|
|
150
233
|
raise BuilderError.new("`.override` cannot be combined with `.abstract`.")
|
151
234
|
end
|
152
235
|
|
236
|
+
check_sig_block_is_unset!
|
237
|
+
|
238
|
+
if blk
|
239
|
+
T::Private::DeclState.current.active_declaration.blk = blk
|
240
|
+
end
|
241
|
+
|
153
242
|
self
|
154
243
|
end
|
155
244
|
|
156
|
-
def overridable
|
245
|
+
def overridable(&blk)
|
157
246
|
check_live!
|
158
247
|
|
159
248
|
case decl.mode
|
@@ -167,6 +256,12 @@ module T::Private::Methods
|
|
167
256
|
raise BuilderError.new(".overridable cannot be repeated in a single signature")
|
168
257
|
end
|
169
258
|
|
259
|
+
check_sig_block_is_unset!
|
260
|
+
|
261
|
+
if blk
|
262
|
+
T::Private::DeclState.current.active_declaration.blk = blk
|
263
|
+
end
|
264
|
+
|
170
265
|
self
|
171
266
|
end
|
172
267
|
|
@@ -183,6 +278,7 @@ module T::Private::Methods
|
|
183
278
|
# def map(&blk); end
|
184
279
|
def type_parameters(*names)
|
185
280
|
check_live!
|
281
|
+
check_running_inside_block!(__method__)
|
186
282
|
|
187
283
|
names.each do |name|
|
188
284
|
raise BuilderError.new("not a symbol: #{name}") unless name.is_a?(Symbol)
|
data/lib/types/sig.rb
CHANGED
@@ -12,10 +12,53 @@ module T::Sig
|
|
12
12
|
original_verbose = $VERBOSE
|
13
13
|
$VERBOSE = false
|
14
14
|
|
15
|
-
# At runtime,
|
16
|
-
# as T::Sig#sig. Only use it in cases where you can't use T::Sig#sig.
|
15
|
+
# At runtime, only returns a fake declaration builder to allow chaining methods, but statically it is treated
|
16
|
+
# exactly the same as T::Sig#sig. Only use it in cases where you can't use T::Sig#sig.
|
17
17
|
T::Sig::WithoutRuntime.sig {params(arg0: T.nilable(Symbol), blk: T.proc.bind(T::Private::Methods::DeclBuilder).void).void}
|
18
|
-
def self.sig(arg0=nil, &blk)
|
18
|
+
def self.sig(arg0=nil, &blk) # rubocop:disable Lint/DuplicateMethods
|
19
|
+
DeclBuilder.new
|
20
|
+
end
|
21
|
+
|
22
|
+
# This fake version of DeclBuilder exists so that signatures without runtime don't have to pay the cost associated
|
23
|
+
# with using the actual DeclBuilder
|
24
|
+
class DeclBuilder
|
25
|
+
T::Sig::WithoutRuntime.sig do
|
26
|
+
params(
|
27
|
+
_blk: T.nilable(T.proc.bind(T::Private::Methods::DeclBuilder).void)
|
28
|
+
).returns(DeclBuilder)
|
29
|
+
end
|
30
|
+
def abstract(&_blk)
|
31
|
+
self
|
32
|
+
end
|
33
|
+
|
34
|
+
T::Sig::WithoutRuntime.sig do
|
35
|
+
params(
|
36
|
+
_blk: T.nilable(T.proc.bind(T::Private::Methods::DeclBuilder).void)
|
37
|
+
).returns(DeclBuilder)
|
38
|
+
end
|
39
|
+
def final(&_blk)
|
40
|
+
self
|
41
|
+
end
|
42
|
+
|
43
|
+
T::Sig::WithoutRuntime.sig do
|
44
|
+
params(
|
45
|
+
_allow_incompatible: T::Boolean,
|
46
|
+
_blk: T.nilable(T.proc.bind(T::Private::Methods::DeclBuilder).void)
|
47
|
+
).returns(DeclBuilder)
|
48
|
+
end
|
49
|
+
def override(_allow_incompatible: false, &_blk)
|
50
|
+
self
|
51
|
+
end
|
52
|
+
|
53
|
+
T::Sig::WithoutRuntime.sig do
|
54
|
+
params(
|
55
|
+
_blk: T.nilable(T.proc.bind(T::Private::Methods::DeclBuilder).void)
|
56
|
+
).returns(DeclBuilder)
|
57
|
+
end
|
58
|
+
def overridable(&_blk)
|
59
|
+
self
|
60
|
+
end
|
61
|
+
end
|
19
62
|
|
20
63
|
$VERBOSE = original_verbose
|
21
64
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sorbet-runtime
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
4
|
+
version: 0.5.9338
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Stripe
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-11-
|
11
|
+
date: 2021-11-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: minitest
|