steep 1.0.2 → 1.1.1

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.
Files changed (122) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ruby.yml +5 -0
  3. data/.gitignore +1 -0
  4. data/CHANGELOG.md +35 -3
  5. data/Gemfile +6 -3
  6. data/Gemfile.lock +12 -16
  7. data/Gemfile.steep +4 -0
  8. data/Gemfile.steep.lock +50 -0
  9. data/Rakefile +5 -0
  10. data/Steepfile +6 -1
  11. data/bin/setup +2 -0
  12. data/bin/steep +19 -0
  13. data/lib/steep/ast/types/factory.rb +1 -1
  14. data/lib/steep/diagnostic/ruby.rb +49 -3
  15. data/lib/steep/diagnostic/signature.rb +18 -0
  16. data/lib/steep/drivers/watch.rb +3 -1
  17. data/lib/steep/method_name.rb +9 -3
  18. data/lib/steep/node_helper.rb +49 -0
  19. data/lib/steep/services/completion_provider.rb +22 -15
  20. data/lib/steep/services/hover_provider/ruby.rb +30 -12
  21. data/lib/steep/services/type_check_service.rb +12 -12
  22. data/lib/steep/shims/symbol_start_with.rb +18 -0
  23. data/lib/steep/signature/validator.rb +19 -0
  24. data/lib/steep/subtyping/constraints.rb +43 -14
  25. data/lib/steep/type_construction.rb +751 -760
  26. data/lib/steep/type_inference/constant_env.rb +0 -2
  27. data/lib/steep/type_inference/context.rb +23 -17
  28. data/lib/steep/type_inference/logic_type_interpreter.rb +225 -119
  29. data/lib/steep/type_inference/method_call.rb +80 -6
  30. data/lib/steep/type_inference/multiple_assignment.rb +194 -0
  31. data/lib/steep/type_inference/type_env.rb +282 -119
  32. data/lib/steep/type_inference/type_env_builder.rb +138 -0
  33. data/lib/steep/typing.rb +2 -0
  34. data/lib/steep/version.rb +1 -1
  35. data/lib/steep.rb +4 -3
  36. data/rbs_collection.steep.lock.yaml +108 -0
  37. data/rbs_collection.steep.yaml +19 -0
  38. data/sample/sig/conference.rbs +8 -0
  39. data/sig/shims/parser/source/map.rbs +146 -0
  40. data/sig/shims/parser/source/range.rbs +237 -0
  41. data/sig/shims/parser.rbs +17 -0
  42. data/sig/steep/ast/annotation/collection.rbs +75 -0
  43. data/sig/steep/ast/annotation.rbs +126 -0
  44. data/sig/steep/ast/builtin.rbs +69 -0
  45. data/sig/steep/ast/type_params.rbs +11 -0
  46. data/sig/steep/ast/types/any.rbs +29 -0
  47. data/sig/steep/ast/types/boolean.rbs +31 -0
  48. data/sig/steep/ast/types/bot.rbs +29 -0
  49. data/sig/steep/ast/types/class.rbs +29 -0
  50. data/sig/steep/ast/types/factory.rbs +76 -0
  51. data/sig/steep/ast/types/helper.rbs +19 -0
  52. data/sig/steep/ast/types/instance.rbs +29 -0
  53. data/sig/steep/ast/types/intersection.rbs +35 -0
  54. data/sig/steep/ast/types/literal.rbs +33 -0
  55. data/sig/steep/ast/types/logic.rbs +78 -0
  56. data/sig/steep/ast/types/name.rbs +71 -0
  57. data/sig/steep/ast/types/nil.rbs +31 -0
  58. data/sig/steep/ast/types/proc.rbs +46 -0
  59. data/sig/steep/ast/types/record.rbs +38 -0
  60. data/sig/steep/ast/types/self.rbs +29 -0
  61. data/sig/steep/ast/types/top.rbs +29 -0
  62. data/sig/steep/ast/types/tuple.rbs +34 -0
  63. data/sig/steep/ast/types/union.rbs +38 -0
  64. data/sig/steep/ast/types/var.rbs +37 -0
  65. data/sig/steep/ast/types/void.rbs +29 -0
  66. data/sig/steep/ast/types.rbs +37 -0
  67. data/sig/steep/diagnostic/deprecated/unknown_constant_assigned.rbs +15 -0
  68. data/sig/steep/diagnostic/helper.rbs +9 -0
  69. data/sig/steep/diagnostic/lsp_formatter.rbs +29 -0
  70. data/sig/steep/diagnostic/ruby.rbs +494 -0
  71. data/sig/steep/diagnostic/signature.rbs +215 -0
  72. data/sig/steep/interface/block.rbs +35 -0
  73. data/sig/steep/interface/function.rbs +253 -0
  74. data/sig/steep/interface/interface.rbs +23 -0
  75. data/sig/steep/interface/method_type.rbs +55 -0
  76. data/sig/steep/interface/substitution.rbs +53 -0
  77. data/sig/steep/interface/type_param.rbs +35 -0
  78. data/sig/steep/method_name.rbs +26 -0
  79. data/sig/steep/module_helper.rbs +7 -0
  80. data/sig/steep/node_helper.rbs +13 -0
  81. data/sig/steep/project/dsl.rbs +94 -0
  82. data/sig/steep/project/options.rbs +15 -0
  83. data/sig/steep/project/pattern.rbs +25 -0
  84. data/sig/steep/project/target.rbs +25 -0
  85. data/sig/steep/project.rbs +19 -0
  86. data/sig/steep/services/completion_provider.rbs +123 -0
  87. data/sig/steep/services/content_change.rbs +35 -0
  88. data/sig/steep/services/file_loader.rbs +13 -0
  89. data/sig/steep/services/goto_service.rbs +45 -0
  90. data/sig/steep/services/hover_provider/rbs.rbs +21 -0
  91. data/sig/steep/services/hover_provider/ruby.rbs +109 -0
  92. data/sig/steep/services/hover_provider/singleton_methods.rbs +11 -0
  93. data/sig/steep/services/path_assignment.rbs +21 -0
  94. data/sig/steep/services/signature_service.rbs +91 -0
  95. data/sig/steep/services/stats_calculator.rbs +17 -0
  96. data/sig/steep/services/type_check_service.rbs +93 -0
  97. data/sig/steep/source.rbs +55 -0
  98. data/sig/steep/subtyping/cache.rbs +17 -0
  99. data/sig/steep/subtyping/check.rbs +93 -0
  100. data/sig/steep/subtyping/constraints.rbs +111 -0
  101. data/sig/steep/subtyping/relation.rbs +51 -0
  102. data/sig/steep/subtyping/result.rbs +157 -0
  103. data/sig/steep/subtyping/variable_variance.rbs +23 -0
  104. data/sig/steep/type_construction.rbs +300 -0
  105. data/sig/steep/type_inference/block_params.rbs +52 -0
  106. data/sig/steep/type_inference/constant_env.rbs +27 -0
  107. data/sig/steep/type_inference/context.rbs +137 -0
  108. data/sig/steep/type_inference/logic_type_interpreter.rbs +72 -0
  109. data/sig/steep/type_inference/method_call.rbs +124 -0
  110. data/sig/steep/type_inference/method_params.rbs +104 -0
  111. data/sig/steep/type_inference/multiple_assignment.rbs +76 -0
  112. data/sig/steep/type_inference/type_env.rbs +160 -0
  113. data/sig/steep/type_inference/type_env_builder.rbs +77 -0
  114. data/sig/steep/typing.rbs +68 -0
  115. data/sig/steep.rbs +31 -0
  116. data/sig/version.rbs +3 -0
  117. data/smoke/class/f.rb +1 -0
  118. data/smoke/class/test_expectations.yml +2 -2
  119. data/smoke/diagnostics/test_expectations.yml +4 -2
  120. metadata +90 -5
  121. data/lib/steep/type_inference/local_variable_type_env.rb +0 -249
  122. data/lib/steep/type_inference/logic.rb +0 -161
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8317c379e5b7e85cca4a22c9133248a77a112e7687c3cf553ddb90f96ab31236
4
- data.tar.gz: cd9c06372e29c009b4af99a5f0c252dcdbdcc9d2905cbd601cffb7210f809c93
3
+ metadata.gz: a82e5deea68aec9ddc24d1ff5c4872ea0c2fd1d00a6098056e144bc932fba5bf
4
+ data.tar.gz: 2e55a0e505ab5ff267c911b53828f7de2159ae1ac443401a962c1d77c8cda294
5
5
  SHA512:
6
- metadata.gz: 7b0cfaee1dac3cdc8a69d9ef50714615647c1049783d6406d6ee3246c11a5cb2b5e4287f42a896d13e9ed6411e092acf15406199a0f6f0e3bad412f0ae12e250
7
- data.tar.gz: a8b8192a8e6217eff958d30ac12c9aa1cbf9608626c892c9ae9585e33c9241d5a75e760060271e15f60f9869ceab41e9ff2fab38920db9692aa4f1ec296d1257
6
+ metadata.gz: 3d572d7d6f4908286a5714cfe029930a749a0437d5f88663b3c85f86bf14a60f2de0f53320177b6749d235ed384576cfbfc21f6954873fa4fcc29d4132a24880
7
+ data.tar.gz: 7319b4110d5f5ad465f0a84a4052c7c542ed5c0f2da5bd8e378247a75883ecc62fecfb16d3da215f9e017ade5045cffa56cff3d5eaaaeeb59c602035113af370
@@ -11,6 +11,7 @@ jobs:
11
11
  strategy:
12
12
  matrix:
13
13
  container_tag:
14
+ - "2.6"
14
15
  - "2.7"
15
16
  - "3.0"
16
17
  - "3.1"
@@ -24,6 +25,10 @@ jobs:
24
25
  image: rubylang/ruby:${{ matrix.container_tag }}
25
26
  steps:
26
27
  - uses: actions/checkout@v3
28
+ - name: Reset bundler
29
+ run: |
30
+ rm Gemfile.lock Gemfile.steep.lock
31
+ if: contains(matrix.container_tag, '2.6')
27
32
  - name: Run test
28
33
  run: |
29
34
  git config --global --add safe.directory /__w/steep/steep
data/.gitignore CHANGED
@@ -9,3 +9,4 @@
9
9
  /lib/steep/parser.output
10
10
  /lib/steep/parser.rb
11
11
  /log
12
+ /.gem_rbs_collection
data/CHANGELOG.md CHANGED
@@ -2,11 +2,43 @@
2
2
 
3
3
  ## master
4
4
 
5
+ ## 1.1.1 (2022-07-31)
6
+
7
+ ### Type checker core
8
+
9
+ * Ignore special local variables -- `_`, `__any__` and `__skip__` ([#617](https://github.com/soutaro/steep/pull/617), [#627](https://github.com/soutaro/steep/pull/627))
10
+ * Fix type narrowing on assignments ([#622](https://github.com/soutaro/steep/pull/622))
11
+
12
+ ## 1.1.0 (2022-07-27)
13
+
14
+ ### Type checker core
15
+
16
+ * Fix `#each_child_node` ([#612](https://github.com/soutaro/steep/pull/612))
17
+
18
+ ## 1.1.0.pre.1 (2022-07-26)
19
+
20
+ ### Type checker core
21
+
22
+ * Type refinement with method calls ([#590](https://github.com/soutaro/steep/issues/590))
23
+ * Better multiple assignment type checking ([\#605](https://github.com/soutaro/steep/pull/605))
24
+ * Fix generics issues around proc types ([\#609](https://github.com/soutaro/steep/pull/609), [\#611](https://github.com/soutaro/steep/pull/611))
25
+ * Fix type application validation ([#607](https://github.com/soutaro/steep/pull/607); backport from 1.0.2)
26
+ * Add class variable validation ([\#593](https://github.com/soutaro/steep/pull/593))
27
+ * Fix type application validation ([\#607](https://github.com/soutaro/steep/pull/607))
28
+
29
+ ### Commandline tool
30
+
31
+ * Appends "done!" to the watch output when the type check is complete ([\#596](https://github.com/soutaro/steep/pull/596))
32
+
33
+ ### Language server
34
+
35
+ * Fix hover on multiple assignment ([\#606](https://github.com/soutaro/steep/pull/606))
36
+
5
37
  ## 1.0.2 (2022-07-19)
6
38
 
7
39
  This is another patch release for Steep 1.0.
8
40
 
9
- ### Type checker
41
+ ### Type checker core
10
42
 
11
43
  * Fix type application validation ([#607](https://github.com/soutaro/steep/pull/607))
12
44
 
@@ -16,7 +48,7 @@ This is the first patch release for Steep 1.0.
16
48
  However, this release includes one non-trivial type system update, [\#570](https://github.com/soutaro/steep/pull/570), which adds a special typing rule for `Hash#compact` like `Array#compact`.
17
49
  The change will make type checking more permissive and precise, so no new error won't be reported with the fix.
18
50
 
19
- ### Type checker
51
+ ### Type checker core
20
52
 
21
53
  * Support shorthand hash for Ruby 3.1 ([\#567](https://github.com/soutaro/steep/pull/567))
22
54
  * Fix super and zsuper with block ([\#568](https://github.com/soutaro/steep/pull/568))
@@ -30,7 +62,7 @@ The change will make type checking more permissive and precise, so no new error
30
62
  * Type check `gvar` and `gvasgn` in methods([\#579](https://github.com/soutaro/steep/pull/579))
31
63
  * Avoid `UnexpectedError` when assigning untyped singleton class ([\#586](https://github.com/soutaro/steep/pull/586))
32
64
 
33
- ### Tool
65
+ ### Commandline tool
34
66
 
35
67
  * Improve Windows support ([\#561](https://github.com/soutaro/steep/pull/561), [\#573](https://github.com/soutaro/steep/pull/573))
36
68
  * Test if `.ruby-version` exists before `rvm do` in binstub ([\#558](https://github.com/soutaro/steep/pull/558))
data/Gemfile CHANGED
@@ -3,9 +3,6 @@ source 'https://rubygems.org'
3
3
  # Specify your gem's dependencies in steep.gemspec
4
4
  gemspec
5
5
 
6
- gem "with_steep_types", path: "test/gems/with_steep_types"
7
- gem "without_steep_types", path: "test/gems/without_steep_types"
8
-
9
6
  gem "rake"
10
7
  gem "minitest", "~> 5.16"
11
8
  gem "minitest-hooks"
@@ -13,3 +10,9 @@ group :stackprof, optional: true do
13
10
  gem "stackprof"
14
11
  end
15
12
  gem 'minitest-slow_test'
13
+ gem "rbs", "~> 2.5.1"
14
+
15
+ group :ide, optional: true do
16
+ gem "ruby-debug-ide"
17
+ gem "debase", ">= 0.2.5.beta2"
18
+ end
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- steep (1.0.2)
4
+ steep (1.1.1)
5
5
  activesupport (>= 5.1)
6
6
  language_server-protocol (>= 3.15, < 4.0)
7
7
  listen (~> 3.0)
@@ -11,16 +11,6 @@ PATH
11
11
  rbs (>= 2.3.2)
12
12
  terminal-table (>= 2, < 4)
13
13
 
14
- PATH
15
- remote: test/gems/with_steep_types
16
- specs:
17
- with_steep_types (1.0.0)
18
-
19
- PATH
20
- remote: test/gems/without_steep_types
21
- specs:
22
- without_steep_types (1.0.0)
23
-
24
14
  GEM
25
15
  remote: https://rubygems.org/
26
16
  specs:
@@ -31,6 +21,9 @@ GEM
31
21
  tzinfo (~> 2.0)
32
22
  ast (2.4.2)
33
23
  concurrent-ruby (1.1.10)
24
+ debase (0.2.5.beta2)
25
+ debase-ruby_core_source (>= 0.10.12)
26
+ debase-ruby_core_source (0.10.16)
34
27
  ffi (1.15.5)
35
28
  i18n (1.12.0)
36
29
  concurrent-ruby (~> 1.0)
@@ -38,7 +31,7 @@ GEM
38
31
  listen (3.7.1)
39
32
  rb-fsevent (~> 0.10, >= 0.10.3)
40
33
  rb-inotify (~> 0.9, >= 0.9.10)
41
- minitest (5.16.1)
34
+ minitest (5.16.2)
42
35
  minitest-hooks (1.5.0)
43
36
  minitest (> 5.3)
44
37
  minitest-slow_test (0.2.0)
@@ -51,11 +44,13 @@ GEM
51
44
  rb-fsevent (0.11.1)
52
45
  rb-inotify (0.10.1)
53
46
  ffi (~> 1.0)
54
- rbs (2.6.0)
47
+ rbs (2.5.1)
48
+ ruby-debug-ide (0.7.3)
49
+ rake (>= 0.8.1)
55
50
  stackprof (0.2.19)
56
51
  terminal-table (3.0.2)
57
52
  unicode-display_width (>= 1.1.1, < 3)
58
- tzinfo (2.0.4)
53
+ tzinfo (2.0.5)
59
54
  concurrent-ruby (~> 1.0)
60
55
  unicode-display_width (2.2.0)
61
56
 
@@ -63,14 +58,15 @@ PLATFORMS
63
58
  ruby
64
59
 
65
60
  DEPENDENCIES
61
+ debase (>= 0.2.5.beta2)
66
62
  minitest (~> 5.16)
67
63
  minitest-hooks
68
64
  minitest-slow_test
69
65
  rake
66
+ rbs (~> 2.5.1)
67
+ ruby-debug-ide
70
68
  stackprof
71
69
  steep!
72
- with_steep_types!
73
- without_steep_types!
74
70
 
75
71
  BUNDLED WITH
76
72
  2.3.8
data/Gemfile.steep ADDED
@@ -0,0 +1,4 @@
1
+ source "https://rubygems.org"
2
+
3
+ gem 'steep', '~> 1.1.0'
4
+ gem "rbs", "~> 2.5.0"
@@ -0,0 +1,50 @@
1
+ GEM
2
+ remote: https://rubygems.org/
3
+ specs:
4
+ activesupport (7.0.3.1)
5
+ concurrent-ruby (~> 1.0, >= 1.0.2)
6
+ i18n (>= 1.6, < 2)
7
+ minitest (>= 5.1)
8
+ tzinfo (~> 2.0)
9
+ ast (2.4.2)
10
+ concurrent-ruby (1.1.10)
11
+ ffi (1.15.5)
12
+ i18n (1.12.0)
13
+ concurrent-ruby (~> 1.0)
14
+ language_server-protocol (3.16.0.3)
15
+ listen (3.7.1)
16
+ rb-fsevent (~> 0.10, >= 0.10.3)
17
+ rb-inotify (~> 0.9, >= 0.9.10)
18
+ minitest (5.16.2)
19
+ parallel (1.22.1)
20
+ parser (3.1.2.0)
21
+ ast (~> 2.4.1)
22
+ rainbow (3.1.1)
23
+ rb-fsevent (0.11.1)
24
+ rb-inotify (0.10.1)
25
+ ffi (~> 1.0)
26
+ rbs (2.5.1)
27
+ steep (1.1.0)
28
+ activesupport (>= 5.1)
29
+ language_server-protocol (>= 3.15, < 4.0)
30
+ listen (~> 3.0)
31
+ parallel (>= 1.0.0)
32
+ parser (>= 3.1)
33
+ rainbow (>= 2.2.2, < 4.0)
34
+ rbs (>= 2.3.2)
35
+ terminal-table (>= 2, < 4)
36
+ terminal-table (3.0.2)
37
+ unicode-display_width (>= 1.1.1, < 3)
38
+ tzinfo (2.0.5)
39
+ concurrent-ruby (~> 1.0)
40
+ unicode-display_width (2.2.0)
41
+
42
+ PLATFORMS
43
+ arm64-darwin-21
44
+
45
+ DEPENDENCIES
46
+ rbs (~> 2.5.0)
47
+ steep (~> 1.1.0)
48
+
49
+ BUNDLED WITH
50
+ 2.3.15
data/Rakefile CHANGED
@@ -1,6 +1,11 @@
1
1
  require "bundler/gem_tasks"
2
2
  require "rake/testtask"
3
3
 
4
+ if ENV["VSCODE_CWD"]
5
+ require "minitest"
6
+ Minitest.seed = Time.now.to_i
7
+ end
8
+
4
9
  Rake::TestTask.new(:test) do |t|
5
10
  t.libs << "test"
6
11
  t.libs << "lib"
data/Steepfile CHANGED
@@ -1 +1,6 @@
1
- target :app do end
1
+ target :app do
2
+ check "lib"
3
+ signature "sig"
4
+
5
+ collection_config "rbs_collection.steep.yaml"
6
+ end
data/bin/setup CHANGED
@@ -5,3 +5,5 @@ set -vx
5
5
 
6
6
  bundle install
7
7
 
8
+ bundle install --gemfile=Gemfile.steep
9
+ bundle exec --gemfile=Gemfile.steep rbs --collection=rbs_collection.steep.yaml collection install
data/bin/steep ADDED
@@ -0,0 +1,19 @@
1
+ #!/usr/bin/env bash
2
+
3
+ BINSTUB_DIR=$(cd $(dirname $0); pwd)
4
+ GEMFILE=$(readlink -f ${BINSTUB_DIR}/../Gemfile.steep)
5
+ ROOT_DIR=$(readlink -f ${BINSTUB_DIR}/..)
6
+
7
+ STEEP="bundle exec --gemfile=${GEMFILE} steep"
8
+
9
+ if type "rbenv" > /dev/null 2>&1; then
10
+ STEEP="rbenv exec ${STEEP}"
11
+ else
12
+ if type "rvm" > /dev/null 2>&1; then
13
+ if [ -e ${ROOT_DIR}/.ruby-version ]; then
14
+ STEEP="rvm ${ROOT_DIR} do ${STEEP}"
15
+ fi
16
+ fi
17
+ fi
18
+
19
+ exec $STEEP $@
@@ -399,7 +399,7 @@ module Steep
399
399
  when AST::Types::Boolean
400
400
  [type, type]
401
401
  else
402
- [type, nil]
402
+ [type, AST::Types::Bot.new()]
403
403
  end
404
404
  end
405
405
 
@@ -7,7 +7,7 @@ module Steep
7
7
  attr_reader :node
8
8
  attr_reader :location
9
9
 
10
- def initialize(node:, location: node.location.expression)
10
+ def initialize(node:, location: node&.location&.expression)
11
11
  @node = node
12
12
  @location = location
13
13
  end
@@ -71,6 +71,8 @@ module Steep
71
71
  end
72
72
 
73
73
  def header_line
74
+ node = node() or raise
75
+
74
76
  element = case node.type
75
77
  when :ivasgn, :lvasgn, :gvasgn, :cvasgn
76
78
  "a variable"
@@ -387,6 +389,7 @@ module Steep
387
389
 
388
390
  class UnexpectedJumpValue < Base
389
391
  def header_line
392
+ node = node() or raise
390
393
  "The value given to #{node.type} will be ignored"
391
394
  end
392
395
  end
@@ -452,7 +455,7 @@ module Steep
452
455
  super(node: node)
453
456
  @interface_method = interface_method
454
457
  @annotation_method = annotation_method
455
- @result = relation
458
+ @result = result
456
459
  end
457
460
  end
458
461
 
@@ -578,6 +581,32 @@ module Steep
578
581
 
579
582
  autoload :UnknownConstantAssigned, "steep/diagnostic/deprecated/unknown_constant_assigned"
580
583
 
584
+ class UnknownInstanceVariable < Base
585
+ attr_reader :name
586
+
587
+ def initialize(node:, name:)
588
+ super(node: node, location: node.loc.name)
589
+ @name = name
590
+ end
591
+
592
+ def header_line
593
+ "Cannot find the declaration of instance variable: `#{name}`"
594
+ end
595
+ end
596
+
597
+ class UnknownGlobalVariable < Base
598
+ attr_reader :name
599
+
600
+ def initialize(node:, name:)
601
+ super(node: node, location: node.loc.name)
602
+ @name = name
603
+ end
604
+
605
+ def header_line
606
+ "Cannot find the declaration of global variable: `#{name}`"
607
+ end
608
+ end
609
+
581
610
  class FallbackAny < Base
582
611
  def initialize(node:)
583
612
  super(node: node)
@@ -617,7 +646,7 @@ module Steep
617
646
  attr_reader :relation
618
647
 
619
648
  def initialize(node:, var_name:, result:, relation:)
620
- super(node: node)
649
+ super(node: node, location: node.location.expression)
621
650
  @var_name = var_name
622
651
  @result = result
623
652
  @relation = relation
@@ -688,6 +717,22 @@ module Steep
688
717
  end
689
718
  end
690
719
 
720
+ class MultipleAssignmentConversionError < Base
721
+ attr_reader :original_type, :returned_type
722
+
723
+ def initialize(node:, original_type:, returned_type:)
724
+ super(node: node)
725
+
726
+ @node = node
727
+ @original_type = original_type
728
+ @returned_type = returned_type
729
+ end
730
+
731
+ def header_line
732
+ "Cannot convert `#{original_type}` to Array or tuple (`#to_ary` returns `#{returned_type}`)"
733
+ end
734
+ end
735
+
691
736
  class UnsupportedSyntax < Base
692
737
  attr_reader :message
693
738
 
@@ -700,6 +745,7 @@ module Steep
700
745
  if message
701
746
  message
702
747
  else
748
+ node = node() or raise
703
749
  "Syntax `#{node.type}` is not supported in Steep"
704
750
  end
705
751
  end
@@ -264,6 +264,24 @@ module Steep
264
264
  end
265
265
  end
266
266
 
267
+ class ClassVariableDuplicationError < Base
268
+ attr_reader :class_name
269
+ attr_reader :other_class_name
270
+ attr_reader :variable_name
271
+
272
+ def initialize(class_name:, other_class_name:, variable_name:, location:)
273
+ super(location: location)
274
+
275
+ @class_name = class_name
276
+ @other_class_name = other_class_name
277
+ @variable_name = variable_name
278
+ end
279
+
280
+ def header_line
281
+ "Class variable definition `#{variable_name}` in `#{class_name}` may be overtaken by `#{other_class_name}`"
282
+ end
283
+ end
284
+
267
285
  class InstanceVariableTypeError < Base
268
286
  attr_reader :name
269
287
  attr_reader :variable
@@ -79,7 +79,7 @@ module Steep
79
79
  file_paths = Set.new(dirs.select(&:file?).map(&:realpath))
80
80
 
81
81
  listener = Listen.to(*watch_paths.map(&:to_s)) do |modified, added, removed|
82
- stdout.puts Rainbow("🔬 Type checking updated files...").bold
82
+ stdout.print Rainbow("🔬 Type checking updated files...").bold
83
83
 
84
84
  version = Time.now.to_i
85
85
  Steep.logger.tagged "watch" do
@@ -112,6 +112,8 @@ module Steep
112
112
  end
113
113
 
114
114
  client_writer.write(method: "$/typecheck", params: { guid: nil })
115
+
116
+ stdout.puts Rainbow("done!").bold
115
117
  end.tap(&:start)
116
118
 
117
119
  begin
@@ -1,24 +1,30 @@
1
1
  module Steep
2
- InstanceMethodName = Struct.new(:type_name, :method_name, keyword_init: true) do
2
+ InstanceMethodName = _ = Struct.new(:type_name, :method_name, keyword_init: true) do
3
+ # @implements InstanceMethodName
3
4
  def to_s
4
5
  "#{type_name}##{method_name}"
5
6
  end
6
7
  end
7
8
 
8
- SingletonMethodName = Struct.new(:type_name, :method_name, keyword_init: true) do
9
+ SingletonMethodName = _ = Struct.new(:type_name, :method_name, keyword_init: true) do
10
+ # @implements SingletonMethodName
9
11
  def to_s
10
12
  "#{type_name}.#{method_name}"
11
13
  end
12
14
  end
13
15
 
14
- module ::Kernel
16
+ class ::Object
15
17
  def MethodName(string)
16
18
  case string
17
19
  when /#/
18
20
  type_name, method_name = string.split(/#/, 2)
21
+ type_name or raise
22
+ method_name or raise
19
23
  InstanceMethodName.new(type_name: TypeName(type_name), method_name: method_name.to_sym)
20
24
  when /\./
21
25
  type_name, method_name = string.split(/\./, 2)
26
+ type_name or raise
27
+ method_name or raise
22
28
  SingletonMethodName.new(type_name: TypeName(type_name), method_name: method_name.to_sym)
23
29
  else
24
30
  raise "Unexpected method name: #{string}"
@@ -0,0 +1,49 @@
1
+ module Steep
2
+ module NodeHelper
3
+ def each_child_node(node, &block)
4
+ if block
5
+ node.children.each do |child|
6
+ if child.is_a?(Parser::AST::Node)
7
+ yield child
8
+ end
9
+ end
10
+ else
11
+ enum_for :each_child_node, node
12
+ end
13
+ end
14
+
15
+ def each_descendant_node(node, &block)
16
+ if block
17
+ each_child_node(node) do |child|
18
+ yield child
19
+ each_descendant_node(child, &block)
20
+ end
21
+ else
22
+ enum_for :each_descendant_node, node
23
+ end
24
+ end
25
+
26
+ def value_node?(node)
27
+ case node.type
28
+ when :true, :false, :str, :sym, :int, :float, :nil
29
+ true
30
+ when :lvar
31
+ true
32
+ when :const
33
+ each_child_node(node).all? {|child| child.type == :cbase || value_node?(child) }
34
+ when :array
35
+ each_child_node(node).all? {|child| value_node?(child) }
36
+ when :hash
37
+ each_child_node(node).all? do |pair|
38
+ each_child_node(pair).all? {|child| value_node?(child) }
39
+ end
40
+ when :dstr
41
+ each_child_node(node).all? {|child| value_node?(child)}
42
+ when :begin
43
+ each_child_node(node).all? {|child| value_node?(child) }
44
+ else
45
+ false
46
+ end
47
+ end
48
+ end
49
+ end
@@ -1,16 +1,20 @@
1
1
  module Steep
2
2
  module Services
3
3
  class CompletionProvider
4
- Position = Struct.new(:line, :column, keyword_init: true) do
4
+ Position = _ = Struct.new(:line, :column, keyword_init: true) do
5
+ # @implements Position
5
6
  def -(size)
6
7
  Position.new(line: line, column: column - size)
7
8
  end
8
9
  end
9
- Range = Struct.new(:start, :end, keyword_init: true)
10
10
 
11
- InstanceVariableItem = Struct.new(:identifier, :range, :type, keyword_init: true)
12
- LocalVariableItem = Struct.new(:identifier, :range, :type, keyword_init: true)
13
- ConstantItem = Struct.new(:env, :identifier, :range, :type, :full_name, keyword_init: true) do
11
+ Range = _ = Struct.new(:start, :end, keyword_init: true)
12
+
13
+ InstanceVariableItem = _ = Struct.new(:identifier, :range, :type, keyword_init: true)
14
+ LocalVariableItem = _ = Struct.new(:identifier, :range, :type, keyword_init: true)
15
+ ConstantItem = _ = Struct.new(:env, :identifier, :range, :type, :full_name, keyword_init: true) do
16
+ # @implements ConstantItem
17
+
14
18
  def class?
15
19
  if decl = env.class_decls[full_name]
16
20
  decl.primary.decl.is_a?(RBS::AST::Declarations::Class)
@@ -34,20 +38,23 @@ module Steep
34
38
  end
35
39
  end
36
40
  end
37
- MethodNameItem = Struct.new(:identifier, :range, :receiver_type, :method_type, :method_decls, keyword_init: true) do
41
+ MethodNameItem = _ = Struct.new(:identifier, :range, :receiver_type, :method_type, :method_decls, keyword_init: true) do
42
+ # @implements MethodNameItem
43
+
38
44
  def comment
39
45
  case method_decls.size
40
46
  when 0
41
47
  nil
42
48
  when 1
43
- method_decls.to_a.first.method_def&.comment
49
+ method = method_decls.to_a.first or raise
50
+ method.method_def&.comment
44
51
  else
45
52
  nil
46
53
  end
47
54
  end
48
55
 
49
56
  def inherited?
50
- case receiver_type
57
+ case receiver_type = receiver_type()
51
58
  when AST::Types::Name::Instance, AST::Types::Name::Singleton, AST::Types::Name::Interface
52
59
  method_decls.any? do |decl|
53
60
  decl.method_name.type_name != receiver_type.name
@@ -365,11 +372,11 @@ module Steep
365
372
 
366
373
  def local_variable_items_for_context(context, position:, prefix:, items:)
367
374
  range = range_for(position, prefix: prefix)
368
- context.lvar_env.each do |name, type|
375
+ context.type_env.local_variable_types.each do |name, pair|
376
+ type, _ = pair
377
+
369
378
  if name.to_s.start_with?(prefix)
370
- items << LocalVariableItem.new(identifier: name,
371
- range: range,
372
- type: type)
379
+ items << LocalVariableItem.new(identifier: name, range: range, type: type)
373
380
  end
374
381
  end
375
382
  end
@@ -381,10 +388,10 @@ module Steep
381
388
  case parent.type
382
389
  when :const
383
390
  const_name = typing.source_index.reference(constant_node: parent)
384
- consts = context.module_context.const_env.children(const_name)
391
+ consts = context.type_env.constant_env.children(const_name)
385
392
  end
386
393
  else
387
- consts = context.module_context.const_env.constants
394
+ consts = context.type_env.constant_env.constants
388
395
  end
389
396
 
390
397
  if consts
@@ -400,7 +407,7 @@ module Steep
400
407
 
401
408
  def instance_variable_items_for_context(context, position:, prefix:, items:)
402
409
  range = range_for(position, prefix: prefix)
403
- context.type_env.ivar_types.map do |name, type|
410
+ context.type_env.instance_variable_types.each do |name, type|
404
411
  if name.to_s.start_with?(prefix)
405
412
  items << InstanceVariableItem.new(identifier: name,
406
413
  range: range,