steep 0.35.0 → 0.40.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.
Files changed (202) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ruby.yml +1 -1
  3. data/CHANGELOG.md +31 -0
  4. data/Rakefile +5 -2
  5. data/bin/output_rebaseline.rb +49 -0
  6. data/bin/output_test.rb +93 -0
  7. data/lib/steep.rb +14 -3
  8. data/lib/steep/ast/types/bot.rb +1 -1
  9. data/lib/steep/ast/types/factory.rb +122 -53
  10. data/lib/steep/ast/types/logic.rb +33 -1
  11. data/lib/steep/ast/types/proc.rb +32 -20
  12. data/lib/steep/ast/types/top.rb +1 -1
  13. data/lib/steep/cli.rb +1 -1
  14. data/lib/steep/diagnostic/helper.rb +17 -0
  15. data/lib/steep/diagnostic/lsp_formatter.rb +16 -0
  16. data/lib/steep/diagnostic/ruby.rb +623 -0
  17. data/lib/steep/diagnostic/signature.rb +224 -0
  18. data/lib/steep/drivers/annotations.rb +13 -6
  19. data/lib/steep/drivers/check.rb +83 -60
  20. data/lib/steep/drivers/diagnostic_printer.rb +94 -0
  21. data/lib/steep/drivers/stats.rb +125 -29
  22. data/lib/steep/drivers/trace_printer.rb +5 -1
  23. data/lib/steep/drivers/validate.rb +13 -6
  24. data/lib/steep/drivers/watch.rb +26 -9
  25. data/lib/steep/drivers/worker.rb +5 -0
  26. data/lib/steep/index/rbs_index.rb +334 -0
  27. data/lib/steep/index/signature_symbol_provider.rb +154 -0
  28. data/lib/steep/index/source_index.rb +100 -0
  29. data/lib/steep/interface/block.rb +79 -0
  30. data/lib/steep/interface/function.rb +770 -0
  31. data/lib/steep/interface/method_type.rb +32 -812
  32. data/lib/steep/project/options.rb +4 -4
  33. data/lib/steep/project/signature_file.rb +8 -2
  34. data/lib/steep/project/stats_calculator.rb +80 -0
  35. data/lib/steep/project/target.rb +64 -53
  36. data/lib/steep/range_extension.rb +29 -0
  37. data/lib/steep/server/base_worker.rb +42 -4
  38. data/lib/steep/server/code_worker.rb +37 -24
  39. data/lib/steep/server/interaction_worker.rb +1 -0
  40. data/lib/steep/server/master.rb +269 -79
  41. data/lib/steep/server/signature_worker.rb +70 -65
  42. data/lib/steep/server/worker_process.rb +9 -9
  43. data/lib/steep/signature/validator.rb +56 -8
  44. data/lib/steep/subtyping/check.rb +42 -18
  45. data/lib/steep/subtyping/variable_occurrence.rb +2 -2
  46. data/lib/steep/subtyping/variable_variance.rb +2 -2
  47. data/lib/steep/type_construction.rb +515 -284
  48. data/lib/steep/type_inference/block_params.rb +1 -1
  49. data/lib/steep/type_inference/constant_env.rb +5 -1
  50. data/lib/steep/type_inference/logic_type_interpreter.rb +102 -26
  51. data/lib/steep/typing.rb +8 -2
  52. data/lib/steep/version.rb +1 -1
  53. data/smoke/alias/a.rb +0 -3
  54. data/smoke/alias/b.rb +0 -1
  55. data/smoke/alias/c.rb +0 -2
  56. data/smoke/alias/test.yaml +73 -0
  57. data/smoke/and/a.rb +0 -3
  58. data/smoke/and/test.yaml +24 -0
  59. data/smoke/array/a.rb +0 -3
  60. data/smoke/array/b.rb +0 -2
  61. data/smoke/array/c.rb +0 -1
  62. data/smoke/array/test.yaml +80 -0
  63. data/smoke/block/a.rb +0 -2
  64. data/smoke/block/b.rb +0 -2
  65. data/smoke/block/d.rb +0 -4
  66. data/smoke/block/test.yaml +96 -0
  67. data/smoke/broken/Steepfile +5 -0
  68. data/smoke/broken/broken.rb +0 -0
  69. data/smoke/broken/broken.rbs +0 -0
  70. data/smoke/broken/test.yaml +6 -0
  71. data/smoke/case/a.rb +0 -3
  72. data/smoke/case/test.yaml +36 -0
  73. data/smoke/class/a.rb +0 -3
  74. data/smoke/class/c.rb +0 -1
  75. data/smoke/class/f.rb +0 -1
  76. data/smoke/class/g.rb +0 -2
  77. data/smoke/class/i.rb +0 -2
  78. data/smoke/class/test.yaml +89 -0
  79. data/smoke/const/a.rb +0 -3
  80. data/smoke/const/b.rb +7 -0
  81. data/smoke/const/b.rbs +5 -0
  82. data/smoke/const/test.yaml +96 -0
  83. data/smoke/diagnostics-rbs-duplicated/Steepfile +5 -0
  84. data/smoke/diagnostics-rbs-duplicated/a.rbs +5 -0
  85. data/smoke/diagnostics-rbs-duplicated/test.yaml +10 -0
  86. data/smoke/diagnostics-rbs/Steepfile +5 -0
  87. data/smoke/diagnostics-rbs/duplicated-method-definition.rbs +20 -0
  88. data/smoke/diagnostics-rbs/generic-parameter-mismatch.rbs +7 -0
  89. data/smoke/diagnostics-rbs/invalid-method-overload.rbs +3 -0
  90. data/smoke/diagnostics-rbs/invalid-type-application.rbs +7 -0
  91. data/smoke/diagnostics-rbs/invalid_variance_annotation.rbs +3 -0
  92. data/smoke/diagnostics-rbs/recursive-alias.rbs +5 -0
  93. data/smoke/diagnostics-rbs/recursive-class.rbs +8 -0
  94. data/smoke/diagnostics-rbs/superclass-mismatch.rbs +7 -0
  95. data/smoke/diagnostics-rbs/test.yaml +142 -0
  96. data/smoke/diagnostics-rbs/unknown-method-alias.rbs +3 -0
  97. data/smoke/diagnostics-rbs/unknown-type-name.rbs +13 -0
  98. data/smoke/diagnostics/Steepfile +5 -0
  99. data/smoke/diagnostics/a.rbs +26 -0
  100. data/smoke/diagnostics/argument_type_mismatch.rb +1 -0
  101. data/smoke/diagnostics/block_body_type_mismatch.rb +1 -0
  102. data/smoke/diagnostics/block_type_mismatch.rb +3 -0
  103. data/smoke/diagnostics/break_type_mismatch.rb +1 -0
  104. data/smoke/diagnostics/else_on_exhaustive_case.rb +12 -0
  105. data/smoke/diagnostics/incompatible_annotation.rb +6 -0
  106. data/smoke/diagnostics/incompatible_argument.rb +1 -0
  107. data/smoke/diagnostics/incompatible_assignment.rb +8 -0
  108. data/smoke/diagnostics/method_arity_mismatch.rb +11 -0
  109. data/smoke/diagnostics/method_body_type_mismatch.rb +6 -0
  110. data/smoke/diagnostics/method_definition_missing.rb +2 -0
  111. data/smoke/diagnostics/method_return_type_annotation_mismatch.rb +7 -0
  112. data/smoke/diagnostics/missing_keyword.rb +1 -0
  113. data/smoke/diagnostics/no_method.rb +1 -0
  114. data/smoke/diagnostics/required_block_missing.rb +1 -0
  115. data/smoke/diagnostics/return_type_mismatch.rb +6 -0
  116. data/smoke/diagnostics/test.yaml +333 -0
  117. data/smoke/diagnostics/unexpected_block_given.rb +1 -0
  118. data/smoke/diagnostics/unexpected_dynamic_method.rb +3 -0
  119. data/smoke/diagnostics/unexpected_jump.rb +4 -0
  120. data/smoke/diagnostics/unexpected_jump_value.rb +3 -0
  121. data/smoke/diagnostics/unexpected_keyword.rb +1 -0
  122. data/smoke/diagnostics/unexpected_splat.rb +1 -0
  123. data/smoke/diagnostics/unexpected_yield.rb +6 -0
  124. data/smoke/diagnostics/unknown_constant_assigned.rb +7 -0
  125. data/smoke/diagnostics/unresolved_overloading.rb +1 -0
  126. data/smoke/diagnostics/unsatisfiable_constraint.rb +7 -0
  127. data/smoke/diagnostics/unsupported_syntax.rb +2 -0
  128. data/smoke/dstr/a.rb +0 -1
  129. data/smoke/dstr/test.yaml +10 -0
  130. data/smoke/ensure/a.rb +0 -4
  131. data/smoke/ensure/test.yaml +47 -0
  132. data/smoke/enumerator/a.rb +0 -6
  133. data/smoke/enumerator/b.rb +0 -3
  134. data/smoke/enumerator/test.yaml +100 -0
  135. data/smoke/extension/a.rb +0 -1
  136. data/smoke/extension/b.rb +0 -2
  137. data/smoke/extension/c.rb +0 -1
  138. data/smoke/extension/test.yaml +50 -0
  139. data/smoke/hash/b.rb +0 -1
  140. data/smoke/hash/c.rb +0 -3
  141. data/smoke/hash/d.rb +0 -1
  142. data/smoke/hash/e.rb +0 -1
  143. data/smoke/hash/test.yaml +62 -0
  144. data/smoke/hello/hello.rb +0 -2
  145. data/smoke/hello/test.yaml +18 -0
  146. data/smoke/if/a.rb +0 -2
  147. data/smoke/if/test.yaml +27 -0
  148. data/smoke/implements/a.rb +0 -2
  149. data/smoke/implements/test.yaml +16 -0
  150. data/smoke/initialize/test.yaml +4 -0
  151. data/smoke/integer/a.rb +0 -7
  152. data/smoke/integer/test.yaml +66 -0
  153. data/smoke/interface/a.rb +0 -2
  154. data/smoke/interface/test.yaml +16 -0
  155. data/smoke/kwbegin/a.rb +0 -1
  156. data/smoke/kwbegin/test.yaml +14 -0
  157. data/smoke/lambda/a.rb +1 -4
  158. data/smoke/lambda/test.yaml +28 -0
  159. data/smoke/literal/a.rb +0 -5
  160. data/smoke/literal/b.rb +0 -2
  161. data/smoke/literal/test.yaml +79 -0
  162. data/smoke/map/test.yaml +4 -0
  163. data/smoke/method/a.rb +0 -5
  164. data/smoke/method/b.rb +0 -1
  165. data/smoke/method/test.yaml +71 -0
  166. data/smoke/module/a.rb +0 -2
  167. data/smoke/module/b.rb +0 -2
  168. data/smoke/module/c.rb +0 -1
  169. data/smoke/module/d.rb +0 -1
  170. data/smoke/module/f.rb +0 -2
  171. data/smoke/module/test.yaml +51 -0
  172. data/smoke/regexp/a.rb +0 -38
  173. data/smoke/regexp/b.rb +0 -26
  174. data/smoke/regexp/test.yaml +372 -0
  175. data/smoke/regression/set_divide.rb +0 -4
  176. data/smoke/regression/test.yaml +38 -0
  177. data/smoke/rescue/a.rb +0 -5
  178. data/smoke/rescue/test.yaml +60 -0
  179. data/smoke/self/a.rb +0 -2
  180. data/smoke/self/test.yaml +16 -0
  181. data/smoke/skip/skip.rb +0 -2
  182. data/smoke/skip/test.yaml +16 -0
  183. data/smoke/stdout/test.yaml +4 -0
  184. data/smoke/super/a.rb +0 -4
  185. data/smoke/super/test.yaml +52 -0
  186. data/smoke/toplevel/a.rb +0 -1
  187. data/smoke/toplevel/test.yaml +12 -0
  188. data/smoke/tsort/Steepfile +6 -0
  189. data/smoke/tsort/a.rb +12 -0
  190. data/smoke/tsort/test.yaml +32 -0
  191. data/smoke/type_case/a.rb +0 -4
  192. data/smoke/type_case/test.yaml +33 -0
  193. data/smoke/yield/a.rb +0 -3
  194. data/smoke/yield/b.rb +6 -0
  195. data/smoke/yield/test.yaml +49 -0
  196. data/steep.gemspec +3 -3
  197. metadata +116 -18
  198. data/bin/smoke_runner.rb +0 -139
  199. data/lib/steep/drivers/signature_error_printer.rb +0 -25
  200. data/lib/steep/errors.rb +0 -565
  201. data/lib/steep/signature/errors.rb +0 -82
  202. data/lib/steep/type_assignability.rb +0 -367
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5ddd53798b724f6fd1a93d869b03a3864db04bed448552a75dadeabe8d1bc51e
4
- data.tar.gz: c85f6c58a010ed11dfc1041f8ba98007e0f557d7bda133222b94915dfed0d6ca
3
+ metadata.gz: 725a6432404ca94fa643ba89ed2028d7b3923ece4031512ebea88ebbdc4fd01e
4
+ data.tar.gz: 957a95acbda38474f1a796f829f8cf098b69484a8ddf42bd39e2c2be935a961e
5
5
  SHA512:
6
- metadata.gz: 79a7742bdef0d368aa2dceaa528cf3e4bc74bccefafc0d6c366aa94994917e7d5560c8d4fd6f03adf0d50c3b8536d80d7e998bba3a9dc5cb872c7047c0079cba
7
- data.tar.gz: 512b5bdf6efd6e465d5e3147de2df6cafb549fe68e05890efc13fffcc763b0cec1c48005a1734b6ade2cd120fa48059c435c20bad4b9998b1d15a0b4f557f615
6
+ metadata.gz: 363a04610a81d4652541c9e5856705f7317a8b4e92a2074dc460b5f34e19f8eb5bfd080826c3a61a41414668d22d0352e4b300d1ce09c659243ef8c06492fc22
7
+ data.tar.gz: 33b8d47d5290acea68f1f07ee74a6129ad0a2568fff2ddc783b7910f2ed55ae2d6d6b6f0b1b90b8dea773bfab0c9cc7ccc70723ab5aee75db3e3a0f997b93fe9
@@ -16,7 +16,7 @@ jobs:
16
16
  - 2.7.0-bionic
17
17
  task:
18
18
  - test
19
- - smoke
19
+ - test:output
20
20
  - build
21
21
  container:
22
22
  image: rubylang/ruby:${{ matrix.container_tag }}
@@ -2,6 +2,37 @@
2
2
 
3
3
  ## master
4
4
 
5
+ ## 0.40.0 (2021-01-31)
6
+
7
+ * Report progress with dots ([#287](https://github.com/soutaro/steep/pull/287))
8
+ * Diagnostics message improvements ([#297](https://github.com/soutaro/steep/pull/297), [#301](https://github.com/soutaro/steep/pull/301))
9
+ * Fix error on implicit `to_proc` syntax when `untyped` is yielded ([#291](https://github.com/soutaro/steep/pull/291))
10
+
11
+ ## 0.39.0 (2020-12-25)
12
+
13
+ * Update RBS to 1.0.0 ([#282](https://github.com/soutaro/steep/pull/282))
14
+ * Better `&&` and `||` typing ([#276](https://github.com/soutaro/steep/pull/276))
15
+ * Type case based on literals ([#277](https://github.com/soutaro/steep/pull/277))
16
+ * Type case improvements ([#279](https://github.com/soutaro/steep/pull/279), [#283](https://github.com/soutaro/steep/pull/283))
17
+ * Improvements on untyped classes/modules, unsupported syntax error handling, and argument types in untyped methods ([#280](https://github.com/soutaro/steep/pull/280))
18
+ * Fix `bot` and `top` type format ([#278](https://github.com/soutaro/steep/pull/278))
19
+ * Colorfull error messages ([#273](https://github.com/soutaro/steep/pull/273))
20
+
21
+ ## 0.38.0 (2020-12-10)
22
+
23
+ * Improve `break`/`next` typing ([#271](https://github.com/soutaro/steep/pull/271))
24
+ * Add LSP `workspace/symbol` feature ([#267](https://github.com/soutaro/steep/pull/267))
25
+
26
+ ## 0.37.0 (2020-12-06)
27
+
28
+ * Update to RBS 0.20.0 with _singleton attribute_ syntax and _proc types with blocks_. ([#264](https://github.com/soutaro/steep/pull/264))
29
+
30
+ ## 0.36.0 (2020-11-16)
31
+
32
+ * Flow-sensitive typing improvements with `||` and `&&` ([#260](https://github.com/soutaro/steep/pull/260))
33
+ * Type-case improvement ([#259](https://github.com/soutaro/steep/pull/259))
34
+ * Subtyping between `bool` and logic types ([#258](https://github.com/soutaro/steep/pull/258))
35
+
5
36
  ## 0.35.0 (2020-11-14)
6
37
 
7
38
  * Support third party RBS repository ([#231](https://github.com/soutaro/steep/pull/231), [#254](https://github.com/soutaro/steep/pull/254), [#255](https://github.com/soutaro/steep/pull/255))
data/Rakefile CHANGED
@@ -9,6 +9,9 @@ end
9
9
 
10
10
  task :default => :test
11
11
 
12
- task :smoke do
13
- sh "bundle", "exec", "bin/smoke_runner.rb", *Dir.glob("smoke/*")
12
+ namespace :test do
13
+ desc "Run output test"
14
+ task :output do
15
+ sh "ruby", "bin/output_test.rb"
16
+ end
14
17
  end
@@ -0,0 +1,49 @@
1
+ require "pathname"
2
+ require "yaml"
3
+ require "open3"
4
+ require "tempfile"
5
+
6
+ if ARGV.empty?
7
+ test_dirs = (Pathname(__dir__) + "../smoke").children
8
+ else
9
+ test_dirs = ARGV.map {|p| Pathname.pwd + p }
10
+ end
11
+
12
+ test_dirs.each do |dir|
13
+ test = dir + "test.yaml"
14
+
15
+ if test.file?
16
+ content = YAML.load_file(test)
17
+ else
18
+ content = { "test" => {} }
19
+ end
20
+
21
+ puts "Rebaselining #{dir}..."
22
+
23
+ command = content["command"] || "steep check"
24
+ puts " command: #{command}"
25
+
26
+ output, _ = Open3.capture2(command, chdir: dir.to_s)
27
+
28
+ diagnostics = output.split(/\n\n/).each.with_object({}) do |message, hash|
29
+ if message =~ /\A([^:]+):\d+:\d+:/
30
+ path = $1
31
+ hash[path] ||= { "diagnostics" => [] }
32
+ hash[path]["diagnostics"] << message.chomp + "\n"
33
+ end
34
+ end
35
+
36
+ content["test"].each_key do |path|
37
+ unless diagnostics.key?(path)
38
+ diagnostics[path] = { "diagnostics" => [] }
39
+ end
40
+ end
41
+
42
+ content["test"] = diagnostics.keys.sort.each.with_object({}) do |key, hash|
43
+ hash[key] = diagnostics[key]
44
+ end
45
+
46
+ test.open("w") do |io|
47
+ YAML.dump(content, io, header: false)
48
+ end
49
+ end
@@ -0,0 +1,93 @@
1
+ require "pathname"
2
+ require "yaml"
3
+ require "open3"
4
+ require "tempfile"
5
+ require "optparse"
6
+
7
+ OptionParser.new do |opts|
8
+ opts.on("--verbose", "-v") { @verbose = true }
9
+ end.parse!(ARGV)
10
+
11
+ if ARGV.empty?
12
+ test_dirs = (Pathname(__dir__) + "../smoke").children
13
+ else
14
+ test_dirs = ARGV.map {|p| Pathname.pwd + p }
15
+ end
16
+
17
+ success = true
18
+
19
+ test_dirs.each do |dir|
20
+ test = dir + "test.yaml"
21
+
22
+ next unless test.file?
23
+
24
+ puts "Running test #{dir}..."
25
+
26
+ content = YAML.load_file(test)
27
+
28
+ command = content["command"] || "steep check"
29
+ puts " command: #{command}"
30
+
31
+ output, _ = Open3.capture2(command, chdir: dir.to_s)
32
+
33
+ if @verbose
34
+ puts " Raw output:"
35
+ output.split(/\n/).each do |line|
36
+ puts " > #{line.chomp}"
37
+ end
38
+ end
39
+
40
+ diagnostics = output.split(/\n\n/).each.with_object({}) do |d, hash|
41
+ if d =~ /\A([^:]+):\d+:\d+:/
42
+ path = $1
43
+ hash[path] ||= []
44
+ hash[path] << (d.chomp + "\n")
45
+ end
46
+ end
47
+
48
+ content["test"].each do |path, test|
49
+ puts " Checking: #{path}..."
50
+
51
+ fail_expected = test["fail"] || false
52
+
53
+ expected_diagnostics = test["diagnostics"]
54
+ reported_diagnostics = (diagnostics[path] || [])
55
+
56
+ puts " # of expected: #{expected_diagnostics.size}, # of reported: #{reported_diagnostics.size}"
57
+
58
+ unexpected_diagnostics = reported_diagnostics.reject {|d| expected_diagnostics.include?(d) }
59
+ missing_diagnostics = expected_diagnostics.reject {|d| reported_diagnostics.include?(d) }
60
+
61
+ unexpected_diagnostics.each do |d|
62
+ puts " Unexpected diagnostics:"
63
+ d.split(/\n/).each do |line|
64
+ puts " + #{line.chomp}"
65
+ end
66
+ end
67
+
68
+ missing_diagnostics.each do |d|
69
+ puts " Missing diagnostics:"
70
+ d.split(/\n/).each do |line|
71
+ puts " - #{line.chomp}"
72
+ end
73
+ end
74
+
75
+ if unexpected_diagnostics.empty? && missing_diagnostics.empty?
76
+ puts " 👍"
77
+ else
78
+ if fail_expected
79
+ puts " 🚨 (expected failure)"
80
+ else
81
+ puts " 🚨"
82
+ success = false
83
+ end
84
+ end
85
+ end
86
+ end
87
+
88
+ if success
89
+ puts "All tests ok! 👏"
90
+ else
91
+ puts "Errors detected! 🤮"
92
+ exit 1
93
+ end
@@ -42,6 +42,10 @@ require "steep/ast/annotation/collection"
42
42
  require "steep/ast/builtin"
43
43
  require "steep/ast/types/factory"
44
44
 
45
+ require "steep/range_extension"
46
+
47
+ require "steep/interface/function"
48
+ require "steep/interface/block"
45
49
  require "steep/interface/method_type"
46
50
  require "steep/interface/substitution"
47
51
  require "steep/interface/interface"
@@ -54,12 +58,14 @@ require "steep/subtyping/constraints"
54
58
  require "steep/subtyping/variable_variance"
55
59
  require "steep/subtyping/variable_occurrence"
56
60
 
57
- require "steep/signature/errors"
61
+ require "steep/diagnostic/helper"
62
+ require "steep/diagnostic/ruby"
63
+ require "steep/diagnostic/signature"
64
+ require "steep/diagnostic/lsp_formatter"
58
65
  require "steep/signature/validator"
59
66
  require "steep/source"
60
67
  require "steep/annotation_parser"
61
68
  require "steep/typing"
62
- require "steep/errors"
63
69
  require "steep/module_helper"
64
70
  require "steep/type_construction"
65
71
  require "steep/type_inference/context"
@@ -74,6 +80,10 @@ require "steep/type_inference/logic_type_interpreter"
74
80
  require "steep/type_inference/method_call"
75
81
  require "steep/ast/types"
76
82
 
83
+ require "steep/index/rbs_index"
84
+ require "steep/index/signature_symbol_provider"
85
+ require "steep/index/source_index"
86
+
77
87
  require "steep/server/utils"
78
88
  require "steep/server/base_worker"
79
89
  require "steep/server/code_worker"
@@ -91,6 +101,7 @@ require "steep/project/dsl"
91
101
  require "steep/project/file_loader"
92
102
  require "steep/project/hover_content"
93
103
  require "steep/project/completion_provider"
104
+ require "steep/project/stats_calculator"
94
105
  require "steep/drivers/utils/driver_helper"
95
106
  require "steep/drivers/check"
96
107
  require "steep/drivers/stats"
@@ -98,12 +109,12 @@ require "steep/drivers/validate"
98
109
  require "steep/drivers/annotations"
99
110
  require "steep/drivers/watch"
100
111
  require "steep/drivers/langserver"
101
- require "steep/drivers/signature_error_printer"
102
112
  require "steep/drivers/trace_printer"
103
113
  require "steep/drivers/print_project"
104
114
  require "steep/drivers/init"
105
115
  require "steep/drivers/vendor"
106
116
  require "steep/drivers/worker"
117
+ require "steep/drivers/diagnostic_printer"
107
118
 
108
119
  if ENV["NO_COLOR"]
109
120
  Rainbow.enabled = false
@@ -23,7 +23,7 @@ module Steep
23
23
  end
24
24
 
25
25
  def to_s
26
- ""
26
+ "bot"
27
27
  end
28
28
 
29
29
  include Helper::NoFreeVariables
@@ -75,9 +75,23 @@ module Steep
75
75
  end
76
76
  Record.new(elements: elements, location: nil)
77
77
  when RBS::Types::Proc
78
- params = params(type.type)
79
- return_type = type(type.type.return_type)
80
- Proc.new(params: params, return_type: return_type, location: nil)
78
+ func = Interface::Function.new(
79
+ params: params(type.type),
80
+ return_type: type(type.type.return_type),
81
+ location: type.location
82
+ )
83
+ block = if type.block
84
+ Interface::Block.new(
85
+ type: Interface::Function.new(
86
+ params: params(type.block.type),
87
+ return_type: type(type.block.type.return_type),
88
+ location: type.location
89
+ ),
90
+ optional: !type.block.required
91
+ )
92
+ end
93
+
94
+ Proc.new(type: func, block: block)
81
95
  else
82
96
  raise "Unexpected type given: #{type}"
83
97
  end
@@ -145,8 +159,15 @@ module Steep
145
159
  end
146
160
  RBS::Types::Record.new(fields: fields, location: nil)
147
161
  when Proc
162
+ block = if type.block
163
+ RBS::Types::Block.new(
164
+ type: function_1(type.block.type),
165
+ required: !type.block.optional?
166
+ )
167
+ end
148
168
  RBS::Types::Proc.new(
149
- type: function_1(type.params, type.return_type),
169
+ type: function_1(type.type),
170
+ block: block,
150
171
  location: nil
151
172
  )
152
173
  when Logic::Base
@@ -156,7 +177,10 @@ module Steep
156
177
  end
157
178
  end
158
179
 
159
- def function_1(params, return_type)
180
+ def function_1(func)
181
+ params = func.params
182
+ return_type = func.return_type
183
+
160
184
  RBS::Types::Function.new(
161
185
  required_positionals: params.required.map {|type| RBS::Types::Function::Param.new(name: nil, type: type_1(type)) },
162
186
  optional_positionals: params.optional.map {|type| RBS::Types::Function::Param.new(name: nil, type: type_1(type)) },
@@ -170,7 +194,7 @@ module Steep
170
194
  end
171
195
 
172
196
  def params(type)
173
- Interface::Params.new(
197
+ Interface::Function::Params.new(
174
198
  required: type.required_positionals.map {|param| type(param.type) },
175
199
  optional: type.optional_positionals.map {|param| type(param.type) },
176
200
  rest: type.rest_positionals&.yield_self {|param| type(param.type) },
@@ -202,13 +226,19 @@ module Steep
202
226
 
203
227
  type = Interface::MethodType.new(
204
228
  type_params: type_params,
205
- return_type: type(method_type.type.return_type).subst(subst),
206
- params: params(method_type.type).subst(subst),
229
+ type: Interface::Function.new(
230
+ params: params(method_type.type).subst(subst),
231
+ return_type: type(method_type.type.return_type).subst(subst),
232
+ location: method_type.location
233
+ ),
207
234
  block: method_type.block&.yield_self do |block|
208
235
  Interface::Block.new(
209
236
  optional: !block.required,
210
- type: Proc.new(params: params(block.type).subst(subst),
211
- return_type: type(block.type.return_type).subst(subst), location: nil)
237
+ type: Interface::Function.new(
238
+ params: params(block.type).subst(subst),
239
+ return_type: type(block.type.return_type).subst(subst),
240
+ location: nil
241
+ )
212
242
  )
213
243
  end,
214
244
  method_decls: method_decls
@@ -242,12 +272,12 @@ module Steep
242
272
 
243
273
  type = RBS::MethodType.new(
244
274
  type_params: type_params,
245
- type: function_1(method_type.params.subst(subst), method_type.return_type.subst(subst)),
275
+ type: function_1(method_type.type.subst(subst)),
246
276
  block: method_type.block&.yield_self do |block|
247
277
  block_type = block.type.subst(subst)
248
278
 
249
- RBS::MethodType::Block.new(
250
- type: function_1(block_type.params, block_type.return_type),
279
+ RBS::Types::Block.new(
280
+ type: function_1(block_type),
251
281
  required: !block.optional
252
282
  )
253
283
  end,
@@ -338,6 +368,8 @@ module Steep
338
368
  ]
339
369
  when AST::Types::Name::Alias
340
370
  unwrap_optional(expand_alias(type))
371
+ when AST::Types::Boolean
372
+ [AST::Builtin.true_type, AST::Builtin.false_type]
341
373
  else
342
374
  [type, nil]
343
375
  end
@@ -354,7 +386,9 @@ module Steep
354
386
  when :is_a?, :kind_of?, :instance_of?
355
387
  if defined_in == RBS::BuiltinNames::Object.name && member.instance?
356
388
  return method_type.with(
357
- return_type: AST::Types::Logic::ReceiverIsArg.new(location: method_type.return_type.location)
389
+ type: method_type.type.with(
390
+ return_type: AST::Types::Logic::ReceiverIsArg.new(location: method_type.type.return_type.location)
391
+ )
358
392
  )
359
393
  end
360
394
 
@@ -363,7 +397,9 @@ module Steep
363
397
  when RBS::BuiltinNames::Object.name,
364
398
  NilClassName
365
399
  return method_type.with(
366
- return_type: AST::Types::Logic::ReceiverIsNil.new(location: method_type.return_type.location)
400
+ type: method_type.type.with(
401
+ return_type: AST::Types::Logic::ReceiverIsNil.new(location: method_type.type.return_type.location)
402
+ )
367
403
  )
368
404
  end
369
405
 
@@ -373,7 +409,9 @@ module Steep
373
409
  RBS::BuiltinNames::TrueClass.name,
374
410
  RBS::BuiltinNames::FalseClass.name
375
411
  return method_type.with(
376
- return_type: AST::Types::Logic::Not.new(location: method_type.return_type.location)
412
+ type: method_type.type.with(
413
+ return_type: AST::Types::Logic::Not.new(location: method_type.type.return_type.location)
414
+ )
377
415
  )
378
416
  end
379
417
 
@@ -381,7 +419,17 @@ module Steep
381
419
  case defined_in
382
420
  when RBS::BuiltinNames::Module.name
383
421
  return method_type.with(
384
- return_type: AST::Types::Logic::ArgIsReceiver.new(location: method_type.return_type.location)
422
+ type: method_type.type.with(
423
+ return_type: AST::Types::Logic::ArgIsReceiver.new(location: method_type.type.return_type.location)
424
+ )
425
+ )
426
+ when RBS::BuiltinNames::Object.name, RBS::BuiltinNames::String.name, RBS::BuiltinNames::Integer.name, RBS::BuiltinNames::Symbol.name,
427
+ RBS::BuiltinNames::TrueClass.name, RBS::BuiltinNames::FalseClass.name, TypeName("::NilClass")
428
+ # Value based type-case works on literal types which is available for String, Integer, Symbol, TrueClass, FalseClass, and NilClass
429
+ return method_type.with(
430
+ type: method_type.type.with(
431
+ return_type: AST::Types::Logic::ArgEqualsReceiver.new(location: method_type.type.return_type.location)
432
+ )
385
433
  )
386
434
  end
387
435
  end
@@ -572,14 +620,17 @@ module Steep
572
620
  method_types: type.types.map.with_index {|elem_type, index|
573
621
  Interface::MethodType.new(
574
622
  type_params: [],
575
- params: Interface::Params.new(required: [AST::Types::Literal.new(value: index)],
576
- optional: [],
577
- rest: nil,
578
- required_keywords: {},
579
- optional_keywords: {},
580
- rest_keywords: nil),
623
+ type: Interface::Function.new(
624
+ params: Interface::Function::Params.new(required: [AST::Types::Literal.new(value: index)],
625
+ optional: [],
626
+ rest: nil,
627
+ required_keywords: {},
628
+ optional_keywords: {},
629
+ rest_keywords: nil),
630
+ return_type: elem_type,
631
+ location: nil
632
+ ),
581
633
  block: nil,
582
- return_type: elem_type,
583
634
  method_decls: Set[]
584
635
  )
585
636
  } + aref.method_types
@@ -591,14 +642,17 @@ module Steep
591
642
  method_types: type.types.map.with_index {|elem_type, index|
592
643
  Interface::MethodType.new(
593
644
  type_params: [],
594
- params: Interface::Params.new(required: [AST::Types::Literal.new(value: index), elem_type],
595
- optional: [],
596
- rest: nil,
597
- required_keywords: {},
598
- optional_keywords: {},
599
- rest_keywords: nil),
645
+ type: Interface::Function.new(
646
+ params: Interface::Function::Params.new(required: [AST::Types::Literal.new(value: index), elem_type],
647
+ optional: [],
648
+ rest: nil,
649
+ required_keywords: {},
650
+ optional_keywords: {},
651
+ rest_keywords: nil),
652
+ return_type: elem_type,
653
+ location: nil
654
+ ),
600
655
  block: nil,
601
- return_type: elem_type,
602
656
  method_decls: Set[]
603
657
  )
604
658
  } + update.method_types
@@ -610,9 +664,12 @@ module Steep
610
664
  method_types: [
611
665
  Interface::MethodType.new(
612
666
  type_params: [],
613
- params: Interface::Params.empty,
667
+ type: Interface::Function.new(
668
+ params: Interface::Function::Params.empty,
669
+ return_type: type.types[0] || AST::Builtin.nil_type,
670
+ location: nil
671
+ ),
614
672
  block: nil,
615
- return_type: type.types[0] || AST::Builtin.nil_type,
616
673
  method_decls: Set[]
617
674
  )
618
675
  ]
@@ -624,9 +681,12 @@ module Steep
624
681
  method_types: [
625
682
  Interface::MethodType.new(
626
683
  type_params: [],
627
- params: Interface::Params.empty,
684
+ type: Interface::Function.new(
685
+ params: Interface::Function::Params.empty,
686
+ return_type: type.types.last || AST::Builtin.nil_type,
687
+ location: nil
688
+ ),
628
689
  block: nil,
629
- return_type: type.types.last || AST::Builtin.nil_type,
630
690
  method_decls: Set[]
631
691
  )
632
692
  ]
@@ -651,14 +711,17 @@ module Steep
651
711
 
652
712
  Interface::MethodType.new(
653
713
  type_params: [],
654
- params: Interface::Params.new(required: [key_type],
655
- optional: [],
656
- rest: nil,
657
- required_keywords: {},
658
- optional_keywords: {},
659
- rest_keywords: nil),
714
+ type: Interface::Function.new(
715
+ params: Interface::Function::Params.new(required: [key_type],
716
+ optional: [],
717
+ rest: nil,
718
+ required_keywords: {},
719
+ optional_keywords: {},
720
+ rest_keywords: nil),
721
+ return_type: value_type,
722
+ location: nil
723
+ ),
660
724
  block: nil,
661
- return_type: value_type,
662
725
  method_decls: Set[]
663
726
  )
664
727
  } + ref.method_types
@@ -671,14 +734,16 @@ module Steep
671
734
  key_type = Literal.new(value: key_value, location: nil)
672
735
  Interface::MethodType.new(
673
736
  type_params: [],
674
- params: Interface::Params.new(required: [key_type, value_type],
675
- optional: [],
676
- rest: nil,
677
- required_keywords: {},
678
- optional_keywords: {},
679
- rest_keywords: nil),
737
+ type: Interface::Function.new(
738
+ params: Interface::Function::Params.new(required: [key_type, value_type],
739
+ optional: [],
740
+ rest: nil,
741
+ required_keywords: {},
742
+ optional_keywords: {},
743
+ rest_keywords: nil),
744
+ return_type: value_type,
745
+ location: nil),
680
746
  block: nil,
681
- return_type: value_type,
682
747
  method_decls: Set[]
683
748
  )
684
749
  } + update.method_types
@@ -691,14 +756,18 @@ module Steep
691
756
  interface(Builtin::Proc.instance_type, private: private, self_type: self_type).tap do |interface|
692
757
  method_type = Interface::MethodType.new(
693
758
  type_params: [],
694
- params: type.params,
695
- return_type: type.return_type,
696
- block: nil,
759
+ type: type.type,
760
+ block: type.block,
697
761
  method_decls: Set[]
698
762
  )
699
763
 
700
- interface.methods[:[]] = Interface::Interface::Entry.new(method_types: [method_type])
701
764
  interface.methods[:call] = Interface::Interface::Entry.new(method_types: [method_type])
765
+
766
+ if type.block_required?
767
+ interface.methods.delete(:[])
768
+ else
769
+ interface.methods[:[]] = Interface::Interface::Entry.new(method_types: [method_type.with(block: nil)])
770
+ end
702
771
  end
703
772
 
704
773
  when Logic::Base