steep 1.4.0.dev.5 → 1.4.0

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: 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: