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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d7c16469878ea17544f2d704d822cd5c3dbd708f80038a807a9104d0d06dd391
4
- data.tar.gz: e1afe2645bf6e640ef22744f6263f61e00c401f82f9628ba3e1c418c93bfa38e
3
+ metadata.gz: d0c3f3309cc8169ca1616f43b6bfcaf977339107d6e6e14f7c256d71921b9455
4
+ data.tar.gz: 0a85c1429383a0321fe2932befbd880942c00df1e788913a4f5c2e3d8abd9479
5
5
  SHA512:
6
- metadata.gz: 772c359b95c1bbf823ed356825ec1e45fb33f0ee0d5d88491b8a2c762263732ec1001f9217b9aaa1a3d87c6e3e94b3b6cab906f0936b634dc15c854097c65ca0
7
- data.tar.gz: 6fb78d79be35325b617b852e2dc2c42c6abeb2f7b48e9ed83386fb0f95b65750d0454f0266d2b43135f5d8d7a044bd4d25443a1d5f25f6a37e5122dafbb58b03
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.dev.5)
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.0)
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.3)
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
- node.loc.selector
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: false,
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
- result.add(Relation.new(sub_type: sub_type.type, super_type: super_type.type)) do |rel|
810
- check_function(name, rel)
811
- end
812
-
813
- result.add(Relation.new(sub_type: sub_type.block, super_type: super_type.block)) do |rel|
814
- ret = expand_block_given(name, rel)
815
-
816
- case ret
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 |rel|
821
- check_function(name, rel)
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
- if lhs_type
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: rhs_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
- raise
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).to_ary
2731
+ _, constr = constr.lvasgn(node, AST::Builtin.any_type)
2718
2732
  when :ivasgn
2719
- _, constr = constr.ivasgn(node, AST::Builtin.any_type).to_ary
2733
+ _, constr = constr.ivasgn(node, AST::Builtin.any_type)
2720
2734
  when :gvasgn
2721
- raise
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
@@ -1,3 +1,3 @@
1
1
  module Steep
2
- VERSION = "1.4.0.dev.5"
2
+ VERSION = "1.4.0"
3
3
  end
@@ -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::t)
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?
@@ -1,7 +1,6 @@
1
1
  target :test do
2
2
  check "*.rb"
3
3
  signature "*.rbs"
4
- library "set"
5
4
 
6
5
  configure_code_diagnostics(Steep::Diagnostic::Ruby.all_error)
7
6
  end
@@ -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.dev.5
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-21 00:00:00.000000000 Z
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: 1.3.1
780
+ version: '0'
780
781
  requirements: []
781
782
  rubygems_version: 3.4.6
782
783
  signing_key: