typeprof 0.21.2 → 0.21.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/dependabot.yml +6 -0
- data/.github/workflows/main.yml +14 -7
- data/Gemfile +7 -3
- data/Gemfile.lock +5 -5
- data/lib/typeprof/analyzer.rb +4 -2
- data/lib/typeprof/block.rb +1 -1
- data/lib/typeprof/import.rb +7 -2
- data/lib/typeprof/iseq.rb +34 -6
- data/lib/typeprof/lsp.rb +4 -0
- data/lib/typeprof/type.rb +9 -4
- data/lib/typeprof/version.rb +1 -1
- data/lib/typeprof.rb +1 -1
- data/typeprof.gemspec +1 -1
- metadata +7 -16
- data/vscode/.gitignore +0 -5
- data/vscode/.vscode/launch.json +0 -16
- data/vscode/.vscodeignore +0 -7
- data/vscode/README.md +0 -22
- data/vscode/development.md +0 -31
- data/vscode/package-lock.json +0 -3249
- data/vscode/package.json +0 -71
- data/vscode/sandbox/test.rb +0 -24
- data/vscode/src/extension.ts +0 -302
- data/vscode/tsconfig.json +0 -15
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c0f10007471912f793ce801817a088aa794bc4baeb15e5179362521f55e41ec0
|
4
|
+
data.tar.gz: ed61a2b2f4b9800cfb9c9e75d7aa0d0a5690ec1660e509dd4da456b60d1d03e7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 218064fc39d5eeacfe48c8babb28cfade5a069703d71ec4fb45f1a436491596006a01e46b63a14a25c611924176e7bc7aa5131a687c48f9c35b9d84e03e044e8
|
7
|
+
data.tar.gz: 61cca1138af6ab08bb91b9e05cd03a27de7c43bd13a36b9aa5522dffb1a118cb67f4494b0f109097572aa787a334be822773c6fedd87b3f1bcce1d7d221d7eba
|
data/.github/workflows/main.yml
CHANGED
@@ -7,19 +7,26 @@ jobs:
|
|
7
7
|
strategy:
|
8
8
|
fail-fast: false
|
9
9
|
matrix:
|
10
|
-
ruby-version: [2.7, 3.0,head]
|
10
|
+
ruby-version: [2.7, 3.0, 3.1, 3.2, head]
|
11
11
|
runs-on: ubuntu-latest
|
12
12
|
steps:
|
13
|
-
- uses: actions/checkout@
|
14
|
-
with:
|
15
|
-
submodules: true
|
13
|
+
- uses: actions/checkout@v3
|
16
14
|
- name: Set up Ruby
|
17
15
|
uses: ruby/setup-ruby@v1
|
18
16
|
with:
|
19
17
|
ruby-version: ${{ matrix.ruby-version }}
|
20
|
-
|
21
|
-
run: |
|
22
|
-
bundle install
|
18
|
+
bundler-cache: true
|
23
19
|
- name: Run the test suite
|
24
20
|
run: |
|
25
21
|
bundle exec rake TESTOPT=-v
|
22
|
+
|
23
|
+
truffleruby:
|
24
|
+
runs-on: ubuntu-latest
|
25
|
+
steps:
|
26
|
+
- uses: actions/checkout@v3
|
27
|
+
- name: Set up Ruby
|
28
|
+
uses: ruby/setup-ruby@v1
|
29
|
+
with:
|
30
|
+
ruby-version: truffleruby
|
31
|
+
bundler-cache: true
|
32
|
+
- run: bundle exec typeprof --version
|
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.3)
|
5
5
|
rbs (>= 1.8.1)
|
6
6
|
|
7
7
|
GEM
|
@@ -11,14 +11,14 @@ GEM
|
|
11
11
|
docile (1.4.0)
|
12
12
|
power_assert (2.0.1)
|
13
13
|
rake (13.0.1)
|
14
|
-
rbs (2.
|
14
|
+
rbs (2.8.3)
|
15
15
|
simplecov (0.21.2)
|
16
16
|
docile (~> 1.1)
|
17
17
|
simplecov-html (~> 0.11)
|
18
18
|
simplecov_json_formatter (~> 0.1)
|
19
19
|
simplecov-html (0.12.3)
|
20
|
-
simplecov_json_formatter (0.1.
|
21
|
-
stackprof (0.2.
|
20
|
+
simplecov_json_formatter (0.1.4)
|
21
|
+
stackprof (0.2.19)
|
22
22
|
test-unit (3.5.3)
|
23
23
|
power_assert
|
24
24
|
|
@@ -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
|
data/lib/typeprof/block.rb
CHANGED
@@ -92,7 +92,7 @@ module TypeProf
|
|
92
92
|
aargs = scratch.globalize_type(aargs, caller_env, caller_ep)
|
93
93
|
subst = aargs.consistent_with_method_signature?(@msig)
|
94
94
|
unless subst
|
95
|
-
scratch.warn(caller_ep, "The arguments is not
|
95
|
+
scratch.warn(caller_ep, "The arguments is not compatible to RBS block")
|
96
96
|
end
|
97
97
|
# check?
|
98
98
|
#subst = { Type::Var.new(:self) => caller_env.static_env.recv_ty }
|
data/lib/typeprof/import.rb
CHANGED
@@ -170,7 +170,12 @@ module TypeProf
|
|
170
170
|
when RBS::AST::Members::MethodDefinition
|
171
171
|
name = member.name
|
172
172
|
|
173
|
-
|
173
|
+
if member.respond_to?(:overloads)
|
174
|
+
types = member.overloads.map {|overload| overload.method_type }
|
175
|
+
else
|
176
|
+
types = member.types
|
177
|
+
end
|
178
|
+
method_types = types.map do |method_type|
|
174
179
|
case method_type
|
175
180
|
when RBS::MethodType then method_type
|
176
181
|
when :super then raise NotImplementedError
|
@@ -180,7 +185,7 @@ module TypeProf
|
|
180
185
|
method_def = conv_method_def(method_types, visibility)
|
181
186
|
rbs_source = [
|
182
187
|
(member.kind == :singleton ? "self." : "") + member.name.to_s,
|
183
|
-
|
188
|
+
types.map {|type| type.location.source },
|
184
189
|
[member.location.name, CodeRange.from_rbs(member.location)],
|
185
190
|
]
|
186
191
|
if member.instance?
|
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/lsp.rb
CHANGED
@@ -5,6 +5,8 @@ require "uri"
|
|
5
5
|
module TypeProf
|
6
6
|
def self.start_lsp_server(config)
|
7
7
|
if config.lsp_options[:stdio]
|
8
|
+
$stdin.binmode
|
9
|
+
$stdout.binmode
|
8
10
|
reader = LSP::Reader.new($stdin)
|
9
11
|
writer = LSP::Writer.new($stdout)
|
10
12
|
# pipe all builtin print output to stderr to avoid conflicting with lsp
|
@@ -498,9 +500,11 @@ module TypeProf
|
|
498
500
|
when "typeprof.enableSignature"
|
499
501
|
@server.signature_enabled = true
|
500
502
|
@server.send_request("workspace/codeLens/refresh")
|
503
|
+
respond(nil)
|
501
504
|
when "typeprof.disableSignature"
|
502
505
|
@server.signature_enabled = false
|
503
506
|
@server.send_request("workspace/codeLens/refresh")
|
507
|
+
respond(nil)
|
504
508
|
when "typeprof.createPrototypeRBS"
|
505
509
|
class_kind, class_name, sig_str = @params[:arguments]
|
506
510
|
code_range =
|
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
data/typeprof.gemspec
CHANGED
@@ -24,7 +24,7 @@ Gem::Specification.new do |spec|
|
|
24
24
|
# Specify which files should be added to the gem when it is released.
|
25
25
|
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
26
26
|
spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
|
27
|
-
`git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(doc|test|spec|features|smoke|testbed)/}) }
|
27
|
+
`git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(doc|test|spec|features|smoke|testbed|vscode)/}) }
|
28
28
|
end
|
29
29
|
spec.bindir = "exe"
|
30
30
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
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.4
|
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-01-12 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
|
@@ -67,23 +68,13 @@ files:
|
|
67
68
|
- tools/setup-insns-def.rb
|
68
69
|
- typeprof-lsp
|
69
70
|
- typeprof.gemspec
|
70
|
-
- vscode/.gitignore
|
71
|
-
- vscode/.vscode/launch.json
|
72
|
-
- vscode/.vscodeignore
|
73
|
-
- vscode/README.md
|
74
|
-
- vscode/development.md
|
75
|
-
- vscode/package-lock.json
|
76
|
-
- vscode/package.json
|
77
|
-
- vscode/sandbox/test.rb
|
78
|
-
- vscode/src/extension.ts
|
79
|
-
- vscode/tsconfig.json
|
80
71
|
homepage: https://github.com/ruby/typeprof
|
81
72
|
licenses:
|
82
73
|
- MIT
|
83
74
|
metadata:
|
84
75
|
homepage_uri: https://github.com/ruby/typeprof
|
85
76
|
source_code_uri: https://github.com/ruby/typeprof
|
86
|
-
post_install_message:
|
77
|
+
post_install_message:
|
87
78
|
rdoc_options: []
|
88
79
|
require_paths:
|
89
80
|
- lib
|
@@ -98,8 +89,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
98
89
|
- !ruby/object:Gem::Version
|
99
90
|
version: '0'
|
100
91
|
requirements: []
|
101
|
-
rubygems_version: 3.
|
102
|
-
signing_key:
|
92
|
+
rubygems_version: 3.3.26
|
93
|
+
signing_key:
|
103
94
|
specification_version: 4
|
104
95
|
summary: TypeProf is a type analysis tool for Ruby code based on abstract interpretation
|
105
96
|
test_files: []
|
data/vscode/.gitignore
DELETED
data/vscode/.vscode/launch.json
DELETED
@@ -1,16 +0,0 @@
|
|
1
|
-
{
|
2
|
-
"version": "0.1.0",
|
3
|
-
"configurations": [
|
4
|
-
{
|
5
|
-
"name": "Launch Extension",
|
6
|
-
"type": "extensionHost",
|
7
|
-
"request": "launch",
|
8
|
-
"runtimeExecutable": "${execPath}",
|
9
|
-
"args": ["--extensionDevelopmentPath=${workspaceRoot}" ],
|
10
|
-
"stopOnEntry": false,
|
11
|
-
"sourceMaps": true,
|
12
|
-
"outFiles": [ "${workspaceRoot}/out/src/**/*.js" ],
|
13
|
-
"preLaunchTask": "npm: vscode:prepublish"
|
14
|
-
}
|
15
|
-
]
|
16
|
-
}
|
data/vscode/.vscodeignore
DELETED
data/vscode/README.md
DELETED
@@ -1,22 +0,0 @@
|
|
1
|
-
# Ruby TypeProf VSCode Integration
|
2
|
-
|
3
|
-
*NOTE: This extenstion is very preliminary.*
|
4
|
-
|
5
|
-
This is a VSCode extension to help you write Ruby code by using an code analyzer called [Ruby TypeProf](https://github.com/ruby/typeprof/) as a backend.
|
6
|
-
|
7
|
-
## How to use this extension
|
8
|
-
|
9
|
-
*TBD*
|
10
|
-
|
11
|
-
Requirements:
|
12
|
-
|
13
|
-
1. Use Ruby 3.1.0 or later, and TypeProf 0.20.0 or later
|
14
|
-
2. Add `gem "typeprof"` to your `Gemfile`, and execute `bundle install`
|
15
|
-
|
16
|
-
Troubleshooting:
|
17
|
-
|
18
|
-
*TBD*
|
19
|
-
|
20
|
-
## How to develop this extension
|
21
|
-
|
22
|
-
See [development.md](https://github.com/ruby/typeprof/blob/master/development.md).
|
data/vscode/development.md
DELETED
@@ -1,31 +0,0 @@
|
|
1
|
-
# LSP client for vscode
|
2
|
-
|
3
|
-
Note: this is under development
|
4
|
-
|
5
|
-
## How to run
|
6
|
-
|
7
|
-
```
|
8
|
-
$ cd vscode
|
9
|
-
$ npm install
|
10
|
-
$ npx run tsc -p ./
|
11
|
-
$ cd ..
|
12
|
-
$ code --extensionDevelopmentPath=vscode/ .
|
13
|
-
```
|
14
|
-
|
15
|
-
Alternatively, you can do it in vscode itself.
|
16
|
-
|
17
|
-
```
|
18
|
-
$ cd vscode
|
19
|
-
$ code
|
20
|
-
```
|
21
|
-
|
22
|
-
And then press F5 to run another vscode with extension.
|
23
|
-
|
24
|
-
## How to release
|
25
|
-
|
26
|
-
```
|
27
|
-
$ npm run package
|
28
|
-
$ npx vsce publish
|
29
|
-
```
|
30
|
-
|
31
|
-
See also: https://code.visualstudio.com/api/working-with-extensions/publishing-extension
|