typeprof 0.21.3 → 0.21.7

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 87b881146ffc3f78049ac01775f0bd6cae8efeec13a77da7eab2a61e3027a802
4
- data.tar.gz: 61507f6552b6440fa58ea298ed80956a32e97b149b46d0969a594e8d1b0920bc
3
+ metadata.gz: 6586977939af7be53d8c86c57f992569abffac1f011e7a435ea248835fabb5be
4
+ data.tar.gz: fec9babce50e7c23b31d053a137d7b16c9481ab51bc694d5ba1bf9fd720f63e2
5
5
  SHA512:
6
- metadata.gz: dce6a8c024aa553089224545ca89a6148a590390791f9411b6a70791ad23cb70a9e97d4405264882c3cfccc8cd30e69443cc6330cb81c33f996fa2363dc0369a
7
- data.tar.gz: c6f6e02dc30a6c8b7ecbee01f05f171b467a95526b4541173b303803287ea208eb816223353a704866b7f0b87b266462560554bb997bdbe67d3b5c9373385a4f
6
+ metadata.gz: b49afd59c81f251f6526f4f297773983cad6e4ead9ffeff659d1257a5c0138f2b3f8016197fc5537b5bf1a53bebb1382bf3385ce377441a9bbff0f5852e0ac07
7
+ data.tar.gz: 3603cff083f9db951648cbc8069c017a42057eb6242963879634f7a0e64633632cb21e4bb51988f4a7d99e30de61e670e953409b64b6cc6bac5bbd771049666c
@@ -0,0 +1,6 @@
1
+ version: 2
2
+ updates:
3
+ - package-ecosystem: 'github-actions'
4
+ directory: '/'
5
+ schedule:
6
+ interval: 'weekly'
@@ -1,25 +1,39 @@
1
1
  name: Ruby
2
2
 
3
- on: [push,pull_request]
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-version: [2.7, 3.0, 3.1, head]
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-version }}
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
- # Specify your gem's dependencies in typeprof.gemspec
4
- gemspec
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.3)
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.6)
14
- rbs (2.6.0)
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.2.15
39
+ 2.3.11
@@ -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
- merge_env(ep.next, env.push(Type.nil))
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
- merge_env(ep.next, env.push(Type.nil))
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
- # assert !flag_args_kwarg
2286
- rest_ty = aargs.last
2287
- aargs = aargs[0..-2]
2288
- if flag_args_kw_splat
2289
- # XXX: The types contained in ActualArguments are expected to be all local types.
2290
- # This "globalize_type" breaks the invariant, and violates the assertion of Union#globalize that asserts @elems be nil.
2291
- # To fix this issue fundamentally, ActualArguments should keep all arguments as-is (as like the VM does),
2292
- # and globalize some types on the on-demand bases.
2293
- ty = globalize_type(rest_ty, env, ep)
2294
- if ty.is_a?(Type::Array)
2295
- _, (ty,) = ty.elems.take_last(1)
2296
- case ty
2297
- when Type::Hash
2298
- kw_tys = ty.elems.to_keywords
2299
- when Type::Union
2300
- hash_elems = nil
2301
- ty.elems&.each do |(container_kind, base_type), elems|
2302
- if container_kind == Type::Hash
2303
- elems.to_keywords
2304
- hash_elems = hash_elems ? hash_elems.union(elems) : elems
2305
- end
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
- warn(ep, "non hash is passed to **kwarg?") unless ty == Type.any
2314
- kw_tys = { nil => Type.any }
2337
+ raise NotImplementedError
2315
2338
  end
2316
2339
  else
2317
- raise NotImplementedError
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
@@ -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
- collection_lock = RBS::Collection::Config.lockfile_of(collection_path)
10
- @repo.add(collection_lock.repo_path)
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
- collection_lock = RBS::Collection::Config.lockfile_of(collection_path)
27
- collection_lock.gems.each {|gem| @loaded_gems << gem["name"] }
28
- loader.add_collection(collection_lock)
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).each do |decl|
81
- @env << decl
82
- new_decls << decl
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
- new_decls.each do |decl|
92
- cur_env << env.resolve_declaration(resolver, decl, outer: [], prefix: RBS::Namespace.root)
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
- method_types = member.types.map do |method_type|
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
- member.types.map {|type| type.location.source },
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 RBS::AST::Declarations::Alias # type alias
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
- # https://github.com/ruby/ruby/pull/4468
4
- CASE_WHEN_CHECKMATCH = RubyVM::InstructionSequence.compile("case 1; when Integer; end").to_a.last.any? {|insn,| insn == :checkmatch }
5
- # https://github.com/ruby/ruby/blob/v3_0_2/vm_core.h#L1206
6
- VM_ENV_DATA_SIZE = 3
7
- # Check if Ruby 3.1 or later
8
- RICH_AST = begin RubyVM::AbstractSyntaxTree.parse("1", keep_script_lines: true).node_id; true; rescue; false; end
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)
@@ -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
- return nil if ty1.class != ty2.class
63
- ty1.match?(ty2)
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
- nil
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
- Type.optional(Type::Instance.new(Type::Builtin[:matchdata]))
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 :$?
@@ -1,3 +1,3 @@
1
1
  module TypeProf
2
- VERSION = "0.21.3"
2
+ VERSION = "0.21.7"
3
3
  end
data/lib/typeprof.rb CHANGED
@@ -17,4 +17,4 @@ require_relative "typeprof/builtin"
17
17
  require_relative "typeprof/cli"
18
18
  require_relative "typeprof/code-range"
19
19
 
20
- require_relative "typeprof/lsp" if RUBY_VERSION >= "3"
20
+ require_relative "typeprof/lsp" if RUBY_VERSION >= "3" and RUBY_ENGINE != "truffleruby"
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.3
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: 2022-07-06 00:00:00.000000000 Z
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.3.7
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: []