steep 1.4.0.dev.5 → 1.4.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 +35 -0
- data/Gemfile.lock +2 -2
- data/Gemfile.steep.lock +2 -3
- data/lib/steep/diagnostic/lsp_formatter.rb +1 -1
- data/lib/steep/diagnostic/ruby.rb +5 -4
- data/lib/steep/server/interaction_worker.rb +3 -2
- data/lib/steep/subtyping/check.rb +13 -16
- data/lib/steep/type_construction.rb +37 -23
- data/lib/steep/version.rb +1 -1
- data/sig/steep/subtyping/check.rbs +1 -1
- data/sig/steep/type_construction.rbs +2 -0
- data/smoke/regression/Steepfile +0 -1
- data/smoke/regression/enumerator_product.rb +1 -0
- metadata +5 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d0c3f3309cc8169ca1616f43b6bfcaf977339107d6e6e14f7c256d71921b9455
|
4
|
+
data.tar.gz: 0a85c1429383a0321fe2932befbd880942c00df1e788913a4f5c2e3d8abd9479
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8ce071dd59d2a6e4c21c9c2114d33603e4628052074b7a6f8500f8e4380ca53dfdd77baac210c1ced711eeccc7da94257baceefdafe5633cbd3932687dab6e8c
|
7
|
+
data.tar.gz: db71a9ab6ca415b266e62b7ef17a34e88dd4135326bae512fcf8fe8051610a6c2259bcf11773f09ebb8192958d96f03154a5a1be955beddc7088f2bfc0bf57a5
|
data/CHANGELOG.md
CHANGED
@@ -2,6 +2,41 @@
|
|
2
2
|
|
3
3
|
## master
|
4
4
|
|
5
|
+
## 1.4.0 (2023-04-25)
|
6
|
+
|
7
|
+
### Type checker core
|
8
|
+
|
9
|
+
* Return immediately if blocks are incompatible ([#765](https://github.com/soutaro/steep/pull/765))
|
10
|
+
* Fix location of no method error ([#763](https://github.com/soutaro/steep/pull/763))
|
11
|
+
* Support `gvasgn` in assignment variants ([#762](https://github.com/soutaro/steep/pull/762))
|
12
|
+
* Set up break contexts correctly for untyped blocks ([#752](https://github.com/soutaro/steep/pull/752))
|
13
|
+
* Fix flow sensitive on `case` without condition ([#751](https://github.com/soutaro/steep/pull/751))
|
14
|
+
* Support `...` syntax ([#750](https://github.com/soutaro/steep/pull/750))
|
15
|
+
* Fix constant declaration type checking ([#738](https://github.com/soutaro/steep/pull/738))
|
16
|
+
* Fix errors caused by non-ascii variable names ([#703](https://github.com/soutaro/steep/pull/703))
|
17
|
+
* Update RBS to 3.0 ([#716](https://github.com/soutaro/steep/pull/716), [#754](https://github.com/soutaro/steep/pull/754))
|
18
|
+
|
19
|
+
### Language server
|
20
|
+
|
21
|
+
* Implement signature help, better completion and hover ([#759](https://github.com/soutaro/steep/pull/759), [#761](https://github.com/soutaro/steep/pull/761), [#766](https://github.com/soutaro/steep/pull/766))
|
22
|
+
|
23
|
+
### Miscellaneous
|
24
|
+
|
25
|
+
* Remove pathname from runtime_dependency ([#739](https://github.com/soutaro/steep/pull/739))
|
26
|
+
* `parallel` out, `concurrent-ruby` in ([#760](https://github.com/soutaro/steep/pull/760))
|
27
|
+
|
28
|
+
## 1.3.2 (2023-03-17)
|
29
|
+
|
30
|
+
### Miscellaneous
|
31
|
+
|
32
|
+
* Remove pathname from runtime_dependency ([#740](https://github.com/soutaro/steep/pull/740))
|
33
|
+
|
34
|
+
## 1.3.1 (2023-03-08)
|
35
|
+
|
36
|
+
### Miscellaneous
|
37
|
+
|
38
|
+
* Require rbs-2.8.x ([#732](https://github.com/soutaro/steep/pull/732))
|
39
|
+
|
5
40
|
## 1.3.0 (2022-11-25)
|
6
41
|
|
7
42
|
### Type checker core
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
steep (1.4.0
|
4
|
+
steep (1.4.0)
|
5
5
|
activesupport (>= 5.1)
|
6
6
|
concurrent-ruby (>= 1.2.2)
|
7
7
|
csv (>= 3.0.9)
|
@@ -46,7 +46,7 @@ GEM
|
|
46
46
|
minitest (> 5.3)
|
47
47
|
minitest-slow_test (0.2.0)
|
48
48
|
minitest (>= 5.0)
|
49
|
-
parser (3.2.2.
|
49
|
+
parser (3.2.2.1)
|
50
50
|
ast (~> 2.4.1)
|
51
51
|
rainbow (3.1.1)
|
52
52
|
rake (13.0.6)
|
data/Gemfile.steep.lock
CHANGED
@@ -20,7 +20,6 @@ GEM
|
|
20
20
|
rb-inotify (~> 0.9, >= 0.9.10)
|
21
21
|
logger (1.5.3)
|
22
22
|
minitest (5.18.0)
|
23
|
-
parallel (1.22.1)
|
24
23
|
parser (3.2.2.0)
|
25
24
|
ast (~> 2.4.1)
|
26
25
|
rainbow (3.1.1)
|
@@ -29,15 +28,15 @@ GEM
|
|
29
28
|
ffi (~> 1.0)
|
30
29
|
rbs (3.0.4)
|
31
30
|
securerandom (0.2.2)
|
32
|
-
steep (1.4.0.dev.
|
31
|
+
steep (1.4.0.dev.5)
|
33
32
|
activesupport (>= 5.1)
|
33
|
+
concurrent-ruby (>= 1.2.2)
|
34
34
|
csv (>= 3.0.9)
|
35
35
|
fileutils (>= 1.1.0)
|
36
36
|
json (>= 2.1.0)
|
37
37
|
language_server-protocol (>= 3.15, < 4.0)
|
38
38
|
listen (~> 3.0)
|
39
39
|
logger (>= 1.3.0)
|
40
|
-
parallel (>= 1.0.0)
|
41
40
|
parser (>= 3.1)
|
42
41
|
rainbow (>= 2.2.2, < 4.0)
|
43
42
|
rbs (>= 2.8.0)
|
@@ -41,7 +41,7 @@ module Steep
|
|
41
41
|
severity = severity_for(diagnostic)
|
42
42
|
|
43
43
|
if severity
|
44
|
-
range = diagnostic.location&.as_lsp_range or raise
|
44
|
+
range = diagnostic.location&.as_lsp_range or raise "#{diagnostic.class} object (#{diagnostic.full_message}) instance must have `#location`"
|
45
45
|
|
46
46
|
LSP::Interface::Diagnostic.new(
|
47
47
|
message: diagnostic.full_message,
|
@@ -286,13 +286,14 @@ module Steep
|
|
286
286
|
def initialize(node:, type:, method:)
|
287
287
|
loc = case node.type
|
288
288
|
when :send
|
289
|
-
|
289
|
+
loc = _ = nil
|
290
|
+
loc ||= node.loc.operator if node.loc.respond_to?(:operator)
|
291
|
+
loc ||= node.loc.selector if node.loc.respond_to?(:selector)
|
292
|
+
loc
|
290
293
|
when :block
|
291
294
|
node.children[0].loc.selector
|
292
|
-
else
|
293
|
-
node.loc.expression
|
294
295
|
end
|
295
|
-
super(node: node, location: loc)
|
296
|
+
super(node: node, location: loc || node.loc.expression)
|
296
297
|
@type = type
|
297
298
|
@method = method
|
298
299
|
end
|
@@ -144,7 +144,6 @@ module Steep
|
|
144
144
|
|
145
145
|
case sig_service.status
|
146
146
|
when Services::SignatureService::SyntaxErrorStatus, Services::SignatureService::AncestorErrorStatus
|
147
|
-
|
148
147
|
if buffer = sig_service.latest_env.buffers.find {|buf| Pathname(buf.name) == Pathname(relative_path) }
|
149
148
|
dirs = sig_service.latest_env.signatures[buffer][0]
|
150
149
|
else
|
@@ -208,7 +207,7 @@ module Steep
|
|
208
207
|
end
|
209
208
|
|
210
209
|
LSP::Interface::CompletionList.new(
|
211
|
-
is_incomplete:
|
210
|
+
is_incomplete: !sig_service.status.is_a?(Services::SignatureService::LoadedStatus),
|
212
211
|
items: completion_items
|
213
212
|
)
|
214
213
|
end
|
@@ -394,6 +393,8 @@ module Steep
|
|
394
393
|
end
|
395
394
|
end
|
396
395
|
end
|
396
|
+
rescue Parser::SyntaxError
|
397
|
+
# Ignore syntax error
|
397
398
|
end
|
398
399
|
end
|
399
400
|
end
|
@@ -627,7 +627,7 @@ module Steep
|
|
627
627
|
|
628
628
|
sub_interface, super_interface = relation
|
629
629
|
|
630
|
-
method_pairs = super_interface.methods.each_with_object({}) do |(method_name, sup_method), hash|
|
630
|
+
method_pairs = super_interface.methods.each_with_object({}) do |(method_name, sup_method), hash| #$ Hash[Symbol, Relation[Interface::Shape::Entry]]
|
631
631
|
if sub_method = sub_interface.methods[method_name]
|
632
632
|
hash[method_name] = Relation.new(sub_type: sub_method, super_type: sup_method)
|
633
633
|
else
|
@@ -806,26 +806,23 @@ module Steep
|
|
806
806
|
super_type.type_params.empty? or raise "Expected monomorphic method type: #{super_type}"
|
807
807
|
|
808
808
|
All(relation) do |result|
|
809
|
-
|
810
|
-
|
811
|
-
|
812
|
-
|
813
|
-
|
814
|
-
|
815
|
-
|
816
|
-
|
817
|
-
when Relation
|
809
|
+
type_relation = Relation.new(sub_type: sub_type.type, super_type: super_type.type)
|
810
|
+
|
811
|
+
case ret = expand_block_given(name, Relation.new(sub_type: sub_type.block, super_type: super_type.block))
|
812
|
+
when true
|
813
|
+
result.add(type_relation) { check_function(name, type_relation) }
|
814
|
+
when Relation
|
815
|
+
result.add(type_relation) { check_function(name, type_relation) }
|
816
|
+
result.add(ret) do
|
818
817
|
All(ret) do |result|
|
819
818
|
result.add_result(check_self_type_binding(ret, ret.super_type.self_type, ret.sub_type.self_type))
|
820
|
-
result.add(Relation(ret.super_type.type, ret.sub_type.type)) do |
|
821
|
-
check_function(name,
|
819
|
+
result.add(Relation(ret.super_type.type, ret.sub_type.type)) do |block_relation|
|
820
|
+
check_function(name, block_relation)
|
822
821
|
end
|
823
822
|
end
|
824
|
-
when Result::Base
|
825
|
-
ret
|
826
|
-
else
|
827
|
-
nil
|
828
823
|
end
|
824
|
+
when Result::Failure
|
825
|
+
result.add { ret }
|
829
826
|
end
|
830
827
|
end
|
831
828
|
end
|
@@ -848,6 +848,15 @@ module Steep
|
|
848
848
|
|
849
849
|
constr.add_typing(node, type: type)
|
850
850
|
|
851
|
+
when :gvasgn
|
852
|
+
var_node = lhs.updated(:gvar)
|
853
|
+
send_node = rhs.updated(:send, [var_node, op, rhs])
|
854
|
+
new_node = node.updated(:gvasgn, [lhs.children[0], send_node])
|
855
|
+
|
856
|
+
type, constr = synthesize(new_node, hint: hint)
|
857
|
+
|
858
|
+
constr.add_typing(node, type: type)
|
859
|
+
|
851
860
|
when :send
|
852
861
|
new_rhs = rhs.updated(:send, [lhs, node.children[1], node.children[2]])
|
853
862
|
new_node = lhs.updated(:send, [lhs.children[0], :"#{lhs.children[1]}=", *lhs.children.drop(2), new_rhs])
|
@@ -2226,6 +2235,9 @@ module Steep
|
|
2226
2235
|
when :ivasgn
|
2227
2236
|
type, constr = synthesize(rhs, hint: hint)
|
2228
2237
|
constr.ivasgn(asgn, type)
|
2238
|
+
when :gvasgn
|
2239
|
+
type, constr = synthesize(rhs, hint: hint)
|
2240
|
+
constr.gvasgn(asgn, type)
|
2229
2241
|
when :send
|
2230
2242
|
children = asgn.children.dup
|
2231
2243
|
children[1] = :"#{children[1]}="
|
@@ -2257,27 +2269,11 @@ module Steep
|
|
2257
2269
|
yield_self do
|
2258
2270
|
name, rhs = node.children
|
2259
2271
|
lhs_type = context.type_env[name]
|
2260
|
-
|
2261
2272
|
rhs_type, constr = synthesize(rhs, hint: lhs_type).to_ary
|
2262
2273
|
|
2263
|
-
|
2264
|
-
result = constr.check_relation(sub_type: rhs_type, super_type: lhs_type)
|
2265
|
-
|
2266
|
-
if result.failure?
|
2267
|
-
constr.typing.add_error(
|
2268
|
-
Diagnostic::Ruby::IncompatibleAssignment.new(
|
2269
|
-
node: node,
|
2270
|
-
lhs_type: lhs_type,
|
2271
|
-
rhs_type: rhs_type,
|
2272
|
-
result: result
|
2273
|
-
)
|
2274
|
-
)
|
2275
|
-
end
|
2276
|
-
else
|
2277
|
-
constr.typing.add_error(Diagnostic::Ruby::UnknownGlobalVariable.new(node: node, name: name))
|
2278
|
-
end
|
2274
|
+
type, constr = constr.gvasgn(node, rhs_type)
|
2279
2275
|
|
2280
|
-
constr.add_typing(node, type:
|
2276
|
+
constr.add_typing(node, type: type)
|
2281
2277
|
end
|
2282
2278
|
|
2283
2279
|
when :gvar
|
@@ -2584,7 +2580,7 @@ module Steep
|
|
2584
2580
|
else
|
2585
2581
|
a.type
|
2586
2582
|
end
|
2587
|
-
asgn_type.nil? || asgn_type == :lvasgn || asgn_type == :ivasgn
|
2583
|
+
asgn_type.nil? || asgn_type == :lvasgn || asgn_type == :ivasgn || asgn_type == :gvasgn
|
2588
2584
|
end
|
2589
2585
|
end
|
2590
2586
|
|
@@ -2632,6 +2628,24 @@ module Steep
|
|
2632
2628
|
add_typing(node, type: rhs_type)
|
2633
2629
|
end
|
2634
2630
|
|
2631
|
+
def gvasgn(node, rhs_type)
|
2632
|
+
name = node.children[0]
|
2633
|
+
|
2634
|
+
lhs_type = context.type_env[name]
|
2635
|
+
|
2636
|
+
if lhs_type
|
2637
|
+
if result = no_subtyping?(sub_type: rhs_type, super_type: lhs_type)
|
2638
|
+
typing.add_error(
|
2639
|
+
Diagnostic::Ruby::IncompatibleAssignment.new(node: node, lhs_type: lhs_type, rhs_type: rhs_type, result: result)
|
2640
|
+
)
|
2641
|
+
end
|
2642
|
+
else
|
2643
|
+
typing.add_error(Diagnostic::Ruby::UnknownGlobalVariable.new(node: node, name: name))
|
2644
|
+
end
|
2645
|
+
|
2646
|
+
add_typing(node, type: rhs_type)
|
2647
|
+
end
|
2648
|
+
|
2635
2649
|
def type_masgn_type(mlhs_node, rhs_type, masgn:, optional:)
|
2636
2650
|
# @type var constr: TypeConstruction
|
2637
2651
|
constr = self
|
@@ -2659,7 +2673,7 @@ module Steep
|
|
2659
2673
|
when :ivasgn
|
2660
2674
|
_, constr = constr.ivasgn(asgn_node, type)
|
2661
2675
|
when :gvasgn
|
2662
|
-
|
2676
|
+
_, constr = constr.gvasgn(asgn_node, type)
|
2663
2677
|
when :mlhs
|
2664
2678
|
constr = (constr.type_masgn_type(asgn_node, type, masgn: masgn, optional: optional) or return)
|
2665
2679
|
end
|
@@ -2714,11 +2728,11 @@ module Steep
|
|
2714
2728
|
each_descendant_node(lhs) do |node|
|
2715
2729
|
case node.type
|
2716
2730
|
when :lvasgn
|
2717
|
-
_, constr = constr.lvasgn(node, AST::Builtin.any_type)
|
2731
|
+
_, constr = constr.lvasgn(node, AST::Builtin.any_type)
|
2718
2732
|
when :ivasgn
|
2719
|
-
_, constr = constr.ivasgn(node, AST::Builtin.any_type)
|
2733
|
+
_, constr = constr.ivasgn(node, AST::Builtin.any_type)
|
2720
2734
|
when :gvasgn
|
2721
|
-
|
2735
|
+
_, constr = constr.gvasgn(node, AST::Builtin.any_type)
|
2722
2736
|
else
|
2723
2737
|
_, constr = constr.add_typing(node, type: AST::Builtin.any_type).to_ary
|
2724
2738
|
end
|
data/lib/steep/version.rb
CHANGED
@@ -97,7 +97,7 @@ module Steep
|
|
97
97
|
# Returns a Relation when the given relation can be expanded to relation between Interface::Block.
|
98
98
|
# Returns a failure otherwise.
|
99
99
|
#
|
100
|
-
def expand_block_given: (Symbol name, Relation[Interface::Block?] relation) -> (Relation[Interface::Block] | true | Result::
|
100
|
+
def expand_block_given: (Symbol name, Relation[Interface::Block?] relation) -> (Relation[Interface::Block] | true | Result::Failure)
|
101
101
|
|
102
102
|
# Receives a subtyping relation between self bindings `S <: S'` that is included in procs or blocks as:
|
103
103
|
#
|
@@ -122,6 +122,8 @@ module Steep
|
|
122
122
|
|
123
123
|
def ivasgn: (Parser::AST::Node node, AST::Types::t rhs_type) -> Pair
|
124
124
|
|
125
|
+
def gvasgn: (Parser::AST::Node node, AST::Types::t rhs_type) -> Pair
|
126
|
+
|
125
127
|
def type_masgn: (Parser::AST::Node node) -> Pair
|
126
128
|
|
127
129
|
def type_masgn_type: (Parser::AST::Node mlhs_node, AST::Types::t? rhs_type, masgn: TypeInference::MultipleAssignment, optional: bool) -> TypeConstruction?
|
data/smoke/regression/Steepfile
CHANGED
@@ -0,0 +1 @@
|
|
1
|
+
Enumerator::Product.new([1,2,3], ["a", "b", "c"])
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: steep
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.4.0
|
4
|
+
version: 1.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Soutaro Matsumoto
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-04-
|
11
|
+
date: 2023-04-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: parser
|
@@ -702,6 +702,7 @@ files:
|
|
702
702
|
- smoke/regression/block_param_split.rbs
|
703
703
|
- smoke/regression/empty_yield.rb
|
704
704
|
- smoke/regression/empty_yield.rbs
|
705
|
+
- smoke/regression/enumerator_product.rb
|
705
706
|
- smoke/regression/fun.rb
|
706
707
|
- smoke/regression/fun.rbs
|
707
708
|
- smoke/regression/hash.rb
|
@@ -774,9 +775,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
774
775
|
version: 2.7.0
|
775
776
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
776
777
|
requirements:
|
777
|
-
- - "
|
778
|
+
- - ">="
|
778
779
|
- !ruby/object:Gem::Version
|
779
|
-
version:
|
780
|
+
version: '0'
|
780
781
|
requirements: []
|
781
782
|
rubygems_version: 3.4.6
|
782
783
|
signing_key:
|