typeprof 0.21.3 → 0.21.7
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/.github/dependabot.yml +6 -0
- data/.github/workflows/main.yml +19 -5
- data/Gemfile +7 -3
- data/Gemfile.lock +4 -4
- data/lib/typeprof/analyzer.rb +55 -34
- data/lib/typeprof/import.rb +52 -15
- data/lib/typeprof/iseq.rb +34 -6
- data/lib/typeprof/method.rb +11 -0
- data/lib/typeprof/type.rb +9 -4
- data/lib/typeprof/version.rb +1 -1
- data/lib/typeprof.rb +1 -1
- metadata +7 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6586977939af7be53d8c86c57f992569abffac1f011e7a435ea248835fabb5be
|
4
|
+
data.tar.gz: fec9babce50e7c23b31d053a137d7b16c9481ab51bc694d5ba1bf9fd720f63e2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b49afd59c81f251f6526f4f297773983cad6e4ead9ffeff659d1257a5c0138f2b3f8016197fc5537b5bf1a53bebb1382bf3385ce377441a9bbff0f5852e0ac07
|
7
|
+
data.tar.gz: 3603cff083f9db951648cbc8069c017a42057eb6242963879634f7a0e64633632cb21e4bb51988f4a7d99e30de61e670e953409b64b6cc6bac5bbd771049666c
|
data/.github/workflows/main.yml
CHANGED
@@ -1,25 +1,39 @@
|
|
1
1
|
name: Ruby
|
2
2
|
|
3
|
-
on:
|
3
|
+
on:
|
4
|
+
push:
|
5
|
+
pull_request:
|
6
|
+
workflow_dispatch:
|
7
|
+
schedule:
|
8
|
+
# # This job runs at 00:00 on Friday.
|
9
|
+
- cron: '0 15 * * 5'
|
4
10
|
|
5
11
|
jobs:
|
12
|
+
ruby-versions:
|
13
|
+
uses: ruby/actions/.github/workflows/ruby_versions.yml@master
|
14
|
+
with:
|
15
|
+
engine: cruby-truffleruby
|
16
|
+
min_version: 2.7
|
17
|
+
|
6
18
|
build:
|
19
|
+
needs: ruby-versions
|
20
|
+
name: build (${{ matrix.ruby }})
|
7
21
|
strategy:
|
8
22
|
fail-fast: false
|
9
23
|
matrix:
|
10
|
-
ruby
|
24
|
+
ruby: ${{ fromJson(needs.ruby-versions.outputs.versions) }}
|
11
25
|
runs-on: ubuntu-latest
|
12
26
|
steps:
|
13
27
|
- uses: actions/checkout@v3
|
14
|
-
with:
|
15
|
-
submodules: true
|
16
28
|
- name: Set up Ruby
|
17
29
|
uses: ruby/setup-ruby@v1
|
18
30
|
with:
|
19
|
-
ruby-version: ${{ matrix.ruby
|
31
|
+
ruby-version: ${{ matrix.ruby }}
|
20
32
|
- name: Bundle install
|
21
33
|
run: |
|
22
34
|
bundle install
|
35
|
+
- run: bundle exec typeprof --version
|
23
36
|
- name: Run the test suite
|
24
37
|
run: |
|
25
38
|
bundle exec rake TESTOPT=-v
|
39
|
+
if: ${{ !startsWith(matrix.ruby, 'truffle') }}
|
data/Gemfile
CHANGED
@@ -1,11 +1,15 @@
|
|
1
1
|
source "https://rubygems.org"
|
2
2
|
|
3
|
-
|
4
|
-
|
3
|
+
if ENV["RBS_VERSION"]
|
4
|
+
gem "rbs", github: "ruby/rbs", ref: ENV["RBS_VERSION"]
|
5
|
+
else
|
6
|
+
# Specify your gem's dependencies in typeprof.gemspec
|
7
|
+
gemspec
|
8
|
+
end
|
5
9
|
|
6
10
|
group :development do
|
7
11
|
gem "rake"
|
8
|
-
gem "stackprof"
|
12
|
+
gem "stackprof", platforms: :mri
|
9
13
|
gem "test-unit"
|
10
14
|
gem "simplecov"
|
11
15
|
gem "simplecov-html"
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
typeprof (0.21.
|
4
|
+
typeprof (0.21.7)
|
5
5
|
rbs (>= 1.8.1)
|
6
6
|
|
7
7
|
GEM
|
@@ -10,8 +10,8 @@ GEM
|
|
10
10
|
coverage-helpers (1.0.0)
|
11
11
|
docile (1.4.0)
|
12
12
|
power_assert (2.0.1)
|
13
|
-
rake (13.0.
|
14
|
-
rbs (
|
13
|
+
rake (13.0.1)
|
14
|
+
rbs (3.0.2)
|
15
15
|
simplecov (0.21.2)
|
16
16
|
docile (~> 1.1)
|
17
17
|
simplecov-html (~> 0.11)
|
@@ -36,4 +36,4 @@ DEPENDENCIES
|
|
36
36
|
typeprof!
|
37
37
|
|
38
38
|
BUNDLED WITH
|
39
|
-
2.
|
39
|
+
2.3.11
|
data/lib/typeprof/analyzer.rb
CHANGED
@@ -1997,7 +1997,8 @@ module TypeProf
|
|
1997
1997
|
env = env.push(Type.any) # or String | NilClass only?
|
1998
1998
|
when 1 # VM_SVAR_BACKREF ($~)
|
1999
1999
|
merge_env(ep.next, env.push(Type::Instance.new(Type::Builtin[:matchdata])))
|
2000
|
-
|
2000
|
+
# tentatively disabled; it is too conservative
|
2001
|
+
#merge_env(ep.next, env.push(Type.nil))
|
2001
2002
|
return
|
2002
2003
|
else # flip-flop
|
2003
2004
|
env = env.push(Type.bool)
|
@@ -2005,7 +2006,8 @@ module TypeProf
|
|
2005
2006
|
else
|
2006
2007
|
# NTH_REF ($1, $2, ...) / BACK_REF ($&, $+, ...)
|
2007
2008
|
merge_env(ep.next, env.push(Type::Instance.new(Type::Builtin[:str])))
|
2008
|
-
|
2009
|
+
# tentatively disabled; it is too conservative
|
2010
|
+
#merge_env(ep.next, env.push(Type.nil))
|
2009
2011
|
return
|
2010
2012
|
end
|
2011
2013
|
when :setspecial
|
@@ -2229,6 +2231,34 @@ module TypeProf
|
|
2229
2231
|
merge_env(ep.next, env)
|
2230
2232
|
end
|
2231
2233
|
|
2234
|
+
private def ruby_3_3_keywords?
|
2235
|
+
@ruby_3_3_keywords ||=
|
2236
|
+
RubyVM::InstructionSequence.compile("foo(*a, **b)").to_a.last[-2][1][:orig_argc] == 2
|
2237
|
+
end
|
2238
|
+
|
2239
|
+
private def type_to_keywords(ty, ep)
|
2240
|
+
case ty
|
2241
|
+
when Type::Hash
|
2242
|
+
ty.elems.to_keywords
|
2243
|
+
when Type::Union
|
2244
|
+
hash_elems = nil
|
2245
|
+
ty.elems&.each do |(container_kind, base_type), elems|
|
2246
|
+
if container_kind == Type::Hash
|
2247
|
+
elems.to_keywords
|
2248
|
+
hash_elems = hash_elems ? hash_elems.union(elems) : elems
|
2249
|
+
end
|
2250
|
+
end
|
2251
|
+
if hash_elems
|
2252
|
+
hash_elems.to_keywords
|
2253
|
+
else
|
2254
|
+
{ nil => Type.any }
|
2255
|
+
end
|
2256
|
+
else
|
2257
|
+
warn(ep, "non hash is passed to **kwarg?") unless ty == Type.any
|
2258
|
+
{ nil => Type.any }
|
2259
|
+
end
|
2260
|
+
end
|
2261
|
+
|
2232
2262
|
private def setup_actual_arguments(kind, operands, ep, env)
|
2233
2263
|
opt, blk_iseq = operands
|
2234
2264
|
flags = opt[:flag]
|
@@ -2282,42 +2312,33 @@ module TypeProf
|
|
2282
2312
|
blk_ty = new_blk_ty
|
2283
2313
|
|
2284
2314
|
if flag_args_splat
|
2285
|
-
|
2286
|
-
|
2287
|
-
|
2288
|
-
|
2289
|
-
|
2290
|
-
|
2291
|
-
|
2292
|
-
|
2293
|
-
|
2294
|
-
|
2295
|
-
|
2296
|
-
|
2297
|
-
|
2298
|
-
|
2299
|
-
|
2300
|
-
|
2301
|
-
|
2302
|
-
|
2303
|
-
|
2304
|
-
|
2305
|
-
|
2306
|
-
end
|
2307
|
-
if hash_elems
|
2308
|
-
kw_tys = hash_elems.to_keywords
|
2309
|
-
else
|
2310
|
-
kw_tys = { nil => Type.any }
|
2311
|
-
end
|
2315
|
+
if ruby_3_3_keywords?
|
2316
|
+
if flag_args_kw_splat
|
2317
|
+
kw_tys = type_to_keywords(globalize_type(aargs[-1], env, ep), ep)
|
2318
|
+
aargs = aargs[0..-2]
|
2319
|
+
else
|
2320
|
+
kw_tys = {}
|
2321
|
+
end
|
2322
|
+
rest_ty = aargs.last
|
2323
|
+
aargs = aargs[0..-2]
|
2324
|
+
else
|
2325
|
+
rest_ty = aargs.last
|
2326
|
+
aargs = aargs[0..-2]
|
2327
|
+
if flag_args_kw_splat
|
2328
|
+
# XXX: The types contained in ActualArguments are expected to be all local types.
|
2329
|
+
# This "globalize_type" breaks the invariant, and violates the assertion of Union#globalize that asserts @elems be nil.
|
2330
|
+
# To fix this issue fundamentally, ActualArguments should keep all arguments as-is (as like the VM does),
|
2331
|
+
# and globalize some types on the on-demand bases.
|
2332
|
+
ty = globalize_type(rest_ty, env, ep)
|
2333
|
+
if ty.is_a?(Type::Array)
|
2334
|
+
_, (ty,) = ty.elems.take_last(1)
|
2335
|
+
kw_tys = type_to_keywords(ty, ep)
|
2312
2336
|
else
|
2313
|
-
|
2314
|
-
kw_tys = { nil => Type.any }
|
2337
|
+
raise NotImplementedError
|
2315
2338
|
end
|
2316
2339
|
else
|
2317
|
-
|
2340
|
+
kw_tys = {}
|
2318
2341
|
end
|
2319
|
-
else
|
2320
|
-
kw_tys = {}
|
2321
2342
|
end
|
2322
2343
|
aargs = ActualArguments.new(aargs, rest_ty, kw_tys, blk_ty)
|
2323
2344
|
elsif flag_args_kw_splat
|
data/lib/typeprof/import.rb
CHANGED
@@ -6,8 +6,13 @@ module TypeProf
|
|
6
6
|
@repo = RBS::Repository.new
|
7
7
|
collection_path = Config.current.collection_path
|
8
8
|
if collection_path&.exist?
|
9
|
-
|
10
|
-
|
9
|
+
lock_path = RBS::Collection::Config.to_lockfile_path(collection_path)
|
10
|
+
if lock_path.exist?
|
11
|
+
collection_lock = RBS::Collection::Config.from_path(lock_path)
|
12
|
+
@repo.add(collection_lock.repo_path)
|
13
|
+
else
|
14
|
+
raise "Please execute 'rbs collection install'"
|
15
|
+
end
|
11
16
|
end
|
12
17
|
@env, @loaded_gems, @builtin_env_json = RBSReader.get_builtin_env
|
13
18
|
end
|
@@ -23,9 +28,14 @@ module TypeProf
|
|
23
28
|
# TODO: invalidate this cache when rbs_collection.yml was changed
|
24
29
|
collection_path = Config.current.collection_path
|
25
30
|
if collection_path&.exist?
|
26
|
-
|
27
|
-
|
28
|
-
|
31
|
+
lock_path = RBS::Collection::Config.to_lockfile_path(collection_path)
|
32
|
+
if lock_path.exist?
|
33
|
+
collection_lock = RBS::Collection::Config::Lockfile.from_lockfile(lockfile_path: lock_path, data: YAML.load_file(lock_path.to_s))
|
34
|
+
collection_lock.gems.each {|gem| @loaded_gems << gem["name"] }
|
35
|
+
loader.add_collection(collection_lock)
|
36
|
+
else
|
37
|
+
raise "Please execute 'rbs collection install'"
|
38
|
+
end
|
29
39
|
end
|
30
40
|
|
31
41
|
new_decls = loader.load(env: @builtin_env).map {|decl,| decl }
|
@@ -77,19 +87,37 @@ module TypeProf
|
|
77
87
|
def load_rbs_string(name, content)
|
78
88
|
buffer = RBS::Buffer.new(name: name, content: content)
|
79
89
|
new_decls = []
|
80
|
-
RBS::Parser.parse_signature(buffer)
|
81
|
-
|
82
|
-
|
90
|
+
ret = RBS::Parser.parse_signature(buffer)
|
91
|
+
if ret[0].is_a?(RBS::Buffer)
|
92
|
+
# rbs 3.0
|
93
|
+
buffer, directives, decls = ret
|
94
|
+
@env.add_signature(buffer: buffer, directives: directives, decls: decls)
|
95
|
+
new_decls.concat(decls)
|
96
|
+
else
|
97
|
+
ret.each do |decl|
|
98
|
+
@env << decl
|
99
|
+
new_decls << decl
|
100
|
+
end
|
83
101
|
end
|
84
102
|
RBSReader.load_rbs(@env, new_decls)
|
85
103
|
end
|
86
104
|
|
87
105
|
def self.load_rbs(env, new_decls)
|
88
106
|
all_env = env.resolve_type_names
|
89
|
-
resolver = RBS::TypeNameResolver.from_env(all_env)
|
90
107
|
cur_env = RBS::Environment.new
|
91
|
-
|
92
|
-
|
108
|
+
if defined?(RBS::TypeNameResolver)
|
109
|
+
resolver = RBS::TypeNameResolver.from_env(all_env)
|
110
|
+
new_decls.each do |decl|
|
111
|
+
cur_env << env.resolve_declaration(resolver, decl, outer: [], prefix: RBS::Namespace.root)
|
112
|
+
end
|
113
|
+
else
|
114
|
+
resolver = RBS::Resolver::TypeNameResolver.new(all_env)
|
115
|
+
table = RBS::Environment::UseMap::Table.new()
|
116
|
+
table.compute_children
|
117
|
+
map = RBS::Environment::UseMap.new(table: table)
|
118
|
+
new_decls.each do |decl|
|
119
|
+
cur_env << s = env.resolve_declaration(resolver, map, decl, outer: [], prefix: RBS::Namespace.root)
|
120
|
+
end
|
93
121
|
end
|
94
122
|
|
95
123
|
RBS2JSON.new(all_env, cur_env).dump_json
|
@@ -134,6 +162,9 @@ module TypeProf
|
|
134
162
|
gvars
|
135
163
|
end
|
136
164
|
|
165
|
+
AliasDecl = defined?(RBS::AST::Declarations::Alias) ? RBS::AST::Declarations::Alias : RBS::AST::Declarations::AliasDecl
|
166
|
+
TypeAlias = defined?(RBS::AST::Declarations::TypeAlias) ? RBS::AST::Declarations::TypeAlias : nil
|
167
|
+
|
137
168
|
def conv_classes
|
138
169
|
json = {}
|
139
170
|
|
@@ -170,7 +201,12 @@ module TypeProf
|
|
170
201
|
when RBS::AST::Members::MethodDefinition
|
171
202
|
name = member.name
|
172
203
|
|
173
|
-
|
204
|
+
if member.respond_to?(:overloads)
|
205
|
+
types = member.overloads.map {|overload| overload.method_type }
|
206
|
+
else
|
207
|
+
types = member.types
|
208
|
+
end
|
209
|
+
method_types = types.map do |method_type|
|
174
210
|
case method_type
|
175
211
|
when RBS::MethodType then method_type
|
176
212
|
when :super then raise NotImplementedError
|
@@ -180,7 +216,7 @@ module TypeProf
|
|
180
216
|
method_def = conv_method_def(method_types, visibility)
|
181
217
|
rbs_source = [
|
182
218
|
(member.kind == :singleton ? "self." : "") + member.name.to_s,
|
183
|
-
|
219
|
+
types.map {|type| type.location.source },
|
184
220
|
[member.location.name, CodeRange.from_rbs(member.location)],
|
185
221
|
]
|
186
222
|
if member.instance?
|
@@ -260,9 +296,10 @@ module TypeProf
|
|
260
296
|
|
261
297
|
# The following declarations are ignoreable because they are handled in other level
|
262
298
|
when RBS::AST::Declarations::Constant
|
263
|
-
when
|
299
|
+
when AliasDecl # type alias
|
264
300
|
when RBS::AST::Declarations::Class, RBS::AST::Declarations::Module
|
265
301
|
when RBS::AST::Declarations::Interface
|
302
|
+
when TypeAlias
|
266
303
|
|
267
304
|
else
|
268
305
|
warn "Importing #{ member.class.name } is not supported yet"
|
@@ -487,7 +524,7 @@ module TypeProf
|
|
487
524
|
else
|
488
525
|
begin
|
489
526
|
@alias_resolution_stack[ty.name] = true
|
490
|
-
alias_decl = @all_env.alias_decls[ty.name]
|
527
|
+
alias_decl = (@all_env.respond_to?(:alias_decls) ? @all_env.alias_decls : @all_env.type_alias_decls)[ty.name]
|
491
528
|
alias_decl ? conv_type(alias_decl.decl.type) : [:any]
|
492
529
|
ensure
|
493
530
|
@alias_resolution_stack.delete(ty.name)
|
data/lib/typeprof/iseq.rb
CHANGED
@@ -1,11 +1,13 @@
|
|
1
1
|
module TypeProf
|
2
2
|
class ISeq
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
3
|
+
if defined?(RubyVM::InstructionSequence)
|
4
|
+
# https://github.com/ruby/ruby/pull/4468
|
5
|
+
CASE_WHEN_CHECKMATCH = RubyVM::InstructionSequence.compile("case 1; when Integer; end").to_a.last.any? {|insn,| insn == :checkmatch }
|
6
|
+
# https://github.com/ruby/ruby/blob/v3_0_2/vm_core.h#L1206
|
7
|
+
VM_ENV_DATA_SIZE = 3
|
8
|
+
# Check if Ruby 3.1 or later
|
9
|
+
RICH_AST = begin RubyVM::AbstractSyntaxTree.parse("1", keep_script_lines: true).node_id; true; rescue; false; end
|
10
|
+
end
|
9
11
|
|
10
12
|
FileInfo = Struct.new(
|
11
13
|
:node_id2node,
|
@@ -447,6 +449,11 @@ module TypeProf
|
|
447
449
|
insn.insn, insn.operands = :branch, [:nil] + insn.operands
|
448
450
|
when :getblockparam, :getblockparamproxy
|
449
451
|
insn.insn = :getlocal
|
452
|
+
when :getglobal
|
453
|
+
if insn.operands == [:$typeprof]
|
454
|
+
insn.insn = :putobject
|
455
|
+
insn.operands = [true]
|
456
|
+
end
|
450
457
|
end
|
451
458
|
end
|
452
459
|
end
|
@@ -687,6 +694,27 @@ module TypeProf
|
|
687
694
|
@insns[i + 1] = Insn.new(:getlocal_branch, [getlocal_operands, branch_operands])
|
688
695
|
end
|
689
696
|
end
|
697
|
+
|
698
|
+
# find a pattern: putobject, branch
|
699
|
+
(@insns.size - 1).times do |i|
|
700
|
+
next if branch_targets[i + 1]
|
701
|
+
insn0 = @insns[i]
|
702
|
+
insn1 = @insns[i + 1]
|
703
|
+
if insn0.insn == :putobject && insn1.insn == :branch
|
704
|
+
putobject_operands = insn0.operands
|
705
|
+
branch_operands = insn1.operands
|
706
|
+
obj = putobject_operands[0]
|
707
|
+
branch_type = branch_operands[0]
|
708
|
+
branch_target = branch_operands[1]
|
709
|
+
case branch_type
|
710
|
+
when :if then jump = !!obj
|
711
|
+
when :unless then jump = !obj
|
712
|
+
when :nil then jump = obj == nil
|
713
|
+
end
|
714
|
+
@insns[i ] = Insn.new(:nop, [])
|
715
|
+
@insns[i + 1] = jump ? Insn.new(:jump, [branch_target]) : Insn.new(:nop, [])
|
716
|
+
end
|
717
|
+
end
|
690
718
|
end
|
691
719
|
|
692
720
|
def check_send_branch(sp, j)
|
data/lib/typeprof/method.rb
CHANGED
@@ -117,6 +117,12 @@ module TypeProf
|
|
117
117
|
ty = Type::Array.new(Type::Array::Elements.new([], msig.rest_ty), Type::Instance.new(Type::Builtin[:ary]))
|
118
118
|
ty = ty.substitute(cur_subst, Config.current.options[:type_depth_limit]).remove_type_vars
|
119
119
|
nenv, rest_ty = scratch.localize_type(ty, nenv, callee_ep, alloc_site2)
|
120
|
+
# TODO: handle a case where rest_start is not found
|
121
|
+
nenv = nenv.local_update(rest_start, rest_ty)
|
122
|
+
elsif rest_start
|
123
|
+
alloc_site2 = alloc_site.add_id(idx += 1)
|
124
|
+
ty = Type::Array.new(Type::Array::Elements.new([], Type.any), Type::Instance.new(Type::Builtin[:ary]))
|
125
|
+
nenv, rest_ty = scratch.localize_type(ty, nenv, callee_ep, alloc_site2)
|
120
126
|
nenv = nenv.local_update(rest_start, rest_ty)
|
121
127
|
end
|
122
128
|
if msig.post_tys
|
@@ -146,6 +152,11 @@ module TypeProf
|
|
146
152
|
ty = ty.substitute(cur_subst, Config.current.options[:type_depth_limit]).remove_type_vars
|
147
153
|
nenv, ty = scratch.localize_type(ty, nenv, callee_ep, alloc_site2)
|
148
154
|
nenv = nenv.local_update(kw_rest, ty)
|
155
|
+
elsif kw_rest
|
156
|
+
alloc_site2 = alloc_site.add_id(:**)
|
157
|
+
ty = Type.gen_hash {}
|
158
|
+
nenv, ty = scratch.localize_type(ty, nenv, callee_ep, alloc_site2)
|
159
|
+
nenv = nenv.local_update(kw_rest, ty)
|
149
160
|
end
|
150
161
|
nenv = nenv.local_update(block_start, msig.blk_ty) if block_start
|
151
162
|
|
data/lib/typeprof/type.rb
CHANGED
@@ -59,10 +59,13 @@ module TypeProf
|
|
59
59
|
else
|
60
60
|
if ty2.is_a?(Type::ContainerType)
|
61
61
|
# ty2 may have type variables
|
62
|
-
|
63
|
-
|
62
|
+
if ty1.class == ty2.class
|
63
|
+
ty1.match?(ty2)
|
64
|
+
else
|
65
|
+
Type.match?(ty1, ty2.base_type)
|
66
|
+
end
|
64
67
|
elsif ty1.is_a?(Type::ContainerType)
|
65
|
-
|
68
|
+
Type.match?(ty1.base_type, ty2)
|
66
69
|
else
|
67
70
|
ty1.consistent?(ty2) ? {} : nil
|
68
71
|
end
|
@@ -810,7 +813,9 @@ module TypeProf
|
|
810
813
|
when :$0, :$PROGRAM_NAME
|
811
814
|
Type::Instance.new(Type::Builtin[:str])
|
812
815
|
when :$~
|
813
|
-
|
816
|
+
# optional type is tentatively disabled; it is too conservative
|
817
|
+
#Type.optional(Type::Instance.new(Type::Builtin[:matchdata]))
|
818
|
+
Type::Instance.new(Type::Builtin[:matchdata])
|
814
819
|
when :$., :$$
|
815
820
|
Type::Instance.new(Type::Builtin[:int])
|
816
821
|
when :$?
|
data/lib/typeprof/version.rb
CHANGED
data/lib/typeprof.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: typeprof
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.21.
|
4
|
+
version: 0.21.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Yusuke Endoh
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2023-03-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rbs
|
@@ -37,6 +37,7 @@ executables:
|
|
37
37
|
extensions: []
|
38
38
|
extra_rdoc_files: []
|
39
39
|
files:
|
40
|
+
- ".github/dependabot.yml"
|
40
41
|
- ".github/workflows/main.yml"
|
41
42
|
- ".gitignore"
|
42
43
|
- Gemfile
|
@@ -73,7 +74,7 @@ licenses:
|
|
73
74
|
metadata:
|
74
75
|
homepage_uri: https://github.com/ruby/typeprof
|
75
76
|
source_code_uri: https://github.com/ruby/typeprof
|
76
|
-
post_install_message:
|
77
|
+
post_install_message:
|
77
78
|
rdoc_options: []
|
78
79
|
require_paths:
|
79
80
|
- lib
|
@@ -88,8 +89,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
88
89
|
- !ruby/object:Gem::Version
|
89
90
|
version: '0'
|
90
91
|
requirements: []
|
91
|
-
rubygems_version: 3.
|
92
|
-
signing_key:
|
92
|
+
rubygems_version: 3.5.0.dev
|
93
|
+
signing_key:
|
93
94
|
specification_version: 4
|
94
95
|
summary: TypeProf is a type analysis tool for Ruby code based on abstract interpretation
|
95
96
|
test_files: []
|