steep 0.11.1 → 0.12.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 (299) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ruby.yml +27 -0
  3. data/.gitmodules +3 -0
  4. data/CHANGELOG.md +5 -0
  5. data/README.md +48 -90
  6. data/Rakefile +10 -6
  7. data/Steepfile +1 -0
  8. data/bin/setup +1 -0
  9. data/bin/smoke_runner.rb +9 -14
  10. data/exe/rbs +3 -0
  11. data/exe/ruby-signature +3 -0
  12. data/exe/steep +1 -0
  13. data/lib/steep.rb +32 -26
  14. data/lib/steep/annotation_parser.rb +167 -0
  15. data/lib/steep/ast/annotation/collection.rb +7 -7
  16. data/lib/steep/ast/types.rb +60 -0
  17. data/lib/steep/ast/types/any.rb +1 -1
  18. data/lib/steep/ast/types/factory.rb +535 -0
  19. data/lib/steep/ast/types/name.rb +3 -3
  20. data/lib/steep/ast/types/var.rb +1 -1
  21. data/lib/steep/cli.rb +56 -240
  22. data/lib/steep/drivers/annotations.rb +36 -19
  23. data/lib/steep/drivers/check.rb +55 -91
  24. data/lib/steep/drivers/init.rb +54 -0
  25. data/lib/steep/drivers/langserver.rb +241 -150
  26. data/lib/steep/drivers/print_project.rb +56 -0
  27. data/lib/steep/drivers/signature_error_printer.rb +25 -0
  28. data/lib/steep/drivers/trace_printer.rb +25 -0
  29. data/lib/steep/drivers/utils/driver_helper.rb +26 -0
  30. data/lib/steep/drivers/validate.rb +18 -38
  31. data/lib/steep/drivers/vendor.rb +46 -0
  32. data/lib/steep/drivers/watch.rb +78 -140
  33. data/lib/steep/errors.rb +22 -13
  34. data/lib/steep/interface/interface.rb +91 -0
  35. data/lib/steep/interface/method.rb +0 -4
  36. data/lib/steep/interface/method_type.rb +362 -2
  37. data/lib/steep/interface/substitution.rb +22 -0
  38. data/lib/steep/project.rb +25 -233
  39. data/lib/steep/project/dsl.rb +132 -0
  40. data/lib/steep/project/file.rb +93 -76
  41. data/lib/steep/project/file_loader.rb +63 -0
  42. data/lib/steep/project/options.rb +7 -0
  43. data/lib/steep/project/target.rb +190 -0
  44. data/lib/steep/signature/errors.rb +25 -77
  45. data/lib/steep/signature/validator.rb +122 -0
  46. data/lib/steep/source.rb +12 -7
  47. data/lib/steep/subtyping/check.rb +357 -633
  48. data/lib/steep/subtyping/constraints.rb +2 -2
  49. data/lib/steep/subtyping/trace.rb +23 -0
  50. data/lib/steep/type_construction.rb +509 -455
  51. data/lib/steep/type_inference/constant_env.rb +16 -24
  52. data/lib/steep/type_inference/type_env.rb +26 -18
  53. data/lib/steep/version.rb +1 -1
  54. data/sample/Steepfile +6 -0
  55. data/sample/lib/conference.rb +12 -0
  56. data/sample/sig/conference.rbs +6 -0
  57. data/smoke/alias/Steepfile +4 -0
  58. data/smoke/alias/a.rb +2 -2
  59. data/smoke/alias/{a.rbi → a.rbs} +1 -1
  60. data/smoke/and/Steepfile +4 -0
  61. data/smoke/array/Steepfile +4 -0
  62. data/smoke/array/a.rb +2 -2
  63. data/smoke/array/b.rb +4 -4
  64. data/smoke/array/c.rb +2 -2
  65. data/smoke/block/Steepfile +5 -0
  66. data/smoke/block/{a.rbi → a.rbs} +1 -1
  67. data/smoke/block/{c.rbi → c.rbs} +0 -0
  68. data/smoke/block/d.rb +6 -6
  69. data/smoke/case/Steepfile +4 -0
  70. data/smoke/case/a.rb +4 -3
  71. data/smoke/class/Steepfile +4 -0
  72. data/smoke/class/a.rb +1 -4
  73. data/smoke/class/a.rbs +24 -0
  74. data/smoke/class/h.rb +6 -2
  75. data/smoke/class/{h.rbi → h.rbs} +1 -2
  76. data/smoke/class/i.rb +1 -2
  77. data/smoke/class/i.rbs +9 -0
  78. data/smoke/const/Steepfile +4 -0
  79. data/smoke/dstr/Steepfile +4 -0
  80. data/smoke/ensure/Steepfile +4 -0
  81. data/smoke/ensure/a.rb +1 -1
  82. data/smoke/enumerator/Steepfile +4 -0
  83. data/smoke/enumerator/a.rb +7 -7
  84. data/smoke/enumerator/b.rb +6 -6
  85. data/smoke/extension/Steepfile +4 -0
  86. data/smoke/extension/{a.rbi → a.rbs} +2 -2
  87. data/smoke/extension/{e.rbi → e.rbs} +2 -2
  88. data/smoke/hash/Steepfile +4 -0
  89. data/smoke/hash/{a.rbi → a.rbs} +0 -0
  90. data/smoke/hash/b.rb +2 -2
  91. data/smoke/hash/c.rb +1 -1
  92. data/smoke/hash/e.rbs +3 -0
  93. data/smoke/hash/f.rb +1 -1
  94. data/smoke/hello/Steepfile +4 -0
  95. data/smoke/hello/hello.rbs +7 -0
  96. data/smoke/if/Steepfile +4 -0
  97. data/smoke/implements/Steepfile +4 -0
  98. data/smoke/implements/a.rbs +6 -0
  99. data/smoke/initialize/Steepfile +4 -0
  100. data/smoke/initialize/a.rbs +3 -0
  101. data/smoke/integer/Steepfile +4 -0
  102. data/smoke/integer/a.rb +5 -3
  103. data/smoke/interface/Steepfile +4 -0
  104. data/smoke/interface/{a.rbi → a.rbs} +0 -0
  105. data/smoke/kwbegin/Steepfile +4 -0
  106. data/smoke/lambda/Steepfile +4 -0
  107. data/smoke/lambda/a.rb +9 -2
  108. data/smoke/literal/Steepfile +4 -0
  109. data/smoke/literal/{literal_methods.rbi → literal_methods.rbs} +0 -0
  110. data/smoke/map/Steepfile +4 -0
  111. data/smoke/map/a.rb +1 -1
  112. data/smoke/method/Steepfile +4 -0
  113. data/smoke/method/{a.rbi → a.rbs} +0 -0
  114. data/smoke/method/b.rb +1 -4
  115. data/smoke/method/d.rb +1 -0
  116. data/smoke/method/d.rbs +3 -0
  117. data/smoke/module/Steepfile +4 -0
  118. data/smoke/module/a.rb +1 -1
  119. data/smoke/module/a.rbs +16 -0
  120. data/smoke/module/c.rb +1 -1
  121. data/smoke/regexp/Steepfile +4 -0
  122. data/smoke/regexp/a.rb +2 -2
  123. data/smoke/regexp/b.rb +16 -16
  124. data/smoke/regression/Steepfile +5 -0
  125. data/smoke/regression/array.rb +2 -2
  126. data/smoke/regression/hash.rb +2 -2
  127. data/smoke/regression/poly_new.rb +2 -0
  128. data/smoke/regression/poly_new.rbs +4 -0
  129. data/smoke/regression/set_divide.rb +2 -2
  130. data/smoke/rescue/Steepfile +4 -0
  131. data/smoke/rescue/a.rb +1 -1
  132. data/smoke/self/Steepfile +4 -0
  133. data/smoke/self/a.rbs +4 -0
  134. data/smoke/skip/Steepfile +4 -0
  135. data/smoke/stdout/Steepfile +4 -0
  136. data/smoke/stdout/{a.rbi → a.rbs} +1 -1
  137. data/smoke/super/Steepfile +4 -0
  138. data/smoke/super/a.rbs +10 -0
  139. data/smoke/type_case/Steepfile +4 -0
  140. data/smoke/type_case/a.rb +1 -1
  141. data/smoke/yield/Steepfile +4 -0
  142. data/smoke/yield/a.rb +2 -2
  143. data/steep.gemspec +14 -7
  144. data/vendor/ruby-signature/.github/workflows/ruby.yml +27 -0
  145. data/vendor/ruby-signature/.gitignore +12 -0
  146. data/vendor/ruby-signature/.rubocop.yml +15 -0
  147. data/vendor/ruby-signature/BSDL +22 -0
  148. data/vendor/ruby-signature/COPYING +56 -0
  149. data/vendor/ruby-signature/Gemfile +6 -0
  150. data/vendor/ruby-signature/README.md +93 -0
  151. data/vendor/ruby-signature/Rakefile +66 -0
  152. data/vendor/ruby-signature/bin/annotate-with-rdoc +156 -0
  153. data/vendor/ruby-signature/bin/console +14 -0
  154. data/vendor/ruby-signature/bin/query-rdoc +103 -0
  155. data/vendor/ruby-signature/bin/setup +10 -0
  156. data/vendor/ruby-signature/bin/sort +88 -0
  157. data/vendor/ruby-signature/bin/test_runner.rb +17 -0
  158. data/vendor/ruby-signature/docs/CONTRIBUTING.md +97 -0
  159. data/vendor/ruby-signature/docs/sigs.md +148 -0
  160. data/vendor/ruby-signature/docs/stdlib.md +152 -0
  161. data/vendor/ruby-signature/docs/syntax.md +528 -0
  162. data/vendor/ruby-signature/exe/rbs +3 -0
  163. data/vendor/ruby-signature/exe/ruby-signature +7 -0
  164. data/vendor/ruby-signature/lib/ruby/signature.rb +64 -0
  165. data/vendor/ruby-signature/lib/ruby/signature/ast/annotation.rb +29 -0
  166. data/vendor/ruby-signature/lib/ruby/signature/ast/comment.rb +29 -0
  167. data/vendor/ruby-signature/lib/ruby/signature/ast/declarations.rb +391 -0
  168. data/vendor/ruby-signature/lib/ruby/signature/ast/members.rb +364 -0
  169. data/vendor/ruby-signature/lib/ruby/signature/buffer.rb +52 -0
  170. data/vendor/ruby-signature/lib/ruby/signature/builtin_names.rb +54 -0
  171. data/vendor/ruby-signature/lib/ruby/signature/cli.rb +534 -0
  172. data/vendor/ruby-signature/lib/ruby/signature/constant.rb +28 -0
  173. data/vendor/ruby-signature/lib/ruby/signature/constant_table.rb +152 -0
  174. data/vendor/ruby-signature/lib/ruby/signature/definition.rb +172 -0
  175. data/vendor/ruby-signature/lib/ruby/signature/definition_builder.rb +921 -0
  176. data/vendor/ruby-signature/lib/ruby/signature/environment.rb +283 -0
  177. data/vendor/ruby-signature/lib/ruby/signature/environment_loader.rb +138 -0
  178. data/vendor/ruby-signature/lib/ruby/signature/environment_walker.rb +126 -0
  179. data/vendor/ruby-signature/lib/ruby/signature/errors.rb +189 -0
  180. data/vendor/ruby-signature/lib/ruby/signature/location.rb +104 -0
  181. data/vendor/ruby-signature/lib/ruby/signature/method_type.rb +125 -0
  182. data/vendor/ruby-signature/lib/ruby/signature/namespace.rb +93 -0
  183. data/vendor/ruby-signature/lib/ruby/signature/parser.y +1343 -0
  184. data/vendor/ruby-signature/lib/ruby/signature/prototype/rb.rb +441 -0
  185. data/vendor/ruby-signature/lib/ruby/signature/prototype/rbi.rb +579 -0
  186. data/vendor/ruby-signature/lib/ruby/signature/prototype/runtime.rb +383 -0
  187. data/vendor/ruby-signature/lib/ruby/signature/substitution.rb +48 -0
  188. data/vendor/ruby-signature/lib/ruby/signature/test.rb +28 -0
  189. data/vendor/ruby-signature/lib/ruby/signature/test/errors.rb +63 -0
  190. data/vendor/ruby-signature/lib/ruby/signature/test/hook.rb +290 -0
  191. data/vendor/ruby-signature/lib/ruby/signature/test/setup.rb +58 -0
  192. data/vendor/ruby-signature/lib/ruby/signature/test/spy.rb +324 -0
  193. data/vendor/ruby-signature/lib/ruby/signature/test/test_helper.rb +185 -0
  194. data/vendor/ruby-signature/lib/ruby/signature/test/type_check.rb +256 -0
  195. data/vendor/ruby-signature/lib/ruby/signature/type_name.rb +72 -0
  196. data/vendor/ruby-signature/lib/ruby/signature/types.rb +932 -0
  197. data/vendor/ruby-signature/lib/ruby/signature/variance_calculator.rb +140 -0
  198. data/vendor/ruby-signature/lib/ruby/signature/vendorer.rb +49 -0
  199. data/vendor/ruby-signature/lib/ruby/signature/version.rb +5 -0
  200. data/vendor/ruby-signature/lib/ruby/signature/writer.rb +271 -0
  201. data/vendor/ruby-signature/ruby-signature.gemspec +45 -0
  202. data/vendor/ruby-signature/stdlib/abbrev/abbrev.rbs +3 -0
  203. data/vendor/ruby-signature/stdlib/base64/base64.rbs +15 -0
  204. data/vendor/ruby-signature/stdlib/builtin/array.rbs +1997 -0
  205. data/vendor/ruby-signature/stdlib/builtin/basic_object.rbs +280 -0
  206. data/vendor/ruby-signature/stdlib/builtin/binding.rbs +177 -0
  207. data/vendor/ruby-signature/stdlib/builtin/builtin.rbs +35 -0
  208. data/vendor/ruby-signature/stdlib/builtin/class.rbs +145 -0
  209. data/vendor/ruby-signature/stdlib/builtin/comparable.rbs +116 -0
  210. data/vendor/ruby-signature/stdlib/builtin/complex.rbs +400 -0
  211. data/vendor/ruby-signature/stdlib/builtin/constants.rbs +37 -0
  212. data/vendor/ruby-signature/stdlib/builtin/data.rbs +5 -0
  213. data/vendor/ruby-signature/stdlib/builtin/deprecated.rbs +2 -0
  214. data/vendor/ruby-signature/stdlib/builtin/dir.rbs +419 -0
  215. data/vendor/ruby-signature/stdlib/builtin/encoding.rbs +606 -0
  216. data/vendor/ruby-signature/stdlib/builtin/enumerable.rbs +404 -0
  217. data/vendor/ruby-signature/stdlib/builtin/enumerator.rbs +260 -0
  218. data/vendor/ruby-signature/stdlib/builtin/errno.rbs +781 -0
  219. data/vendor/ruby-signature/stdlib/builtin/errors.rbs +582 -0
  220. data/vendor/ruby-signature/stdlib/builtin/exception.rbs +193 -0
  221. data/vendor/ruby-signature/stdlib/builtin/false_class.rbs +40 -0
  222. data/vendor/ruby-signature/stdlib/builtin/fiber.rbs +68 -0
  223. data/vendor/ruby-signature/stdlib/builtin/fiber_error.rbs +12 -0
  224. data/vendor/ruby-signature/stdlib/builtin/file.rbs +476 -0
  225. data/vendor/ruby-signature/stdlib/builtin/file_test.rbs +59 -0
  226. data/vendor/ruby-signature/stdlib/builtin/float.rbs +696 -0
  227. data/vendor/ruby-signature/stdlib/builtin/gc.rbs +121 -0
  228. data/vendor/ruby-signature/stdlib/builtin/hash.rbs +1029 -0
  229. data/vendor/ruby-signature/stdlib/builtin/integer.rbs +710 -0
  230. data/vendor/ruby-signature/stdlib/builtin/io.rbs +683 -0
  231. data/vendor/ruby-signature/stdlib/builtin/kernel.rbs +574 -0
  232. data/vendor/ruby-signature/stdlib/builtin/marshal.rbs +135 -0
  233. data/vendor/ruby-signature/stdlib/builtin/match_data.rbs +141 -0
  234. data/vendor/ruby-signature/stdlib/builtin/math.rbs +66 -0
  235. data/vendor/ruby-signature/stdlib/builtin/method.rbs +182 -0
  236. data/vendor/ruby-signature/stdlib/builtin/module.rbs +248 -0
  237. data/vendor/ruby-signature/stdlib/builtin/nil_class.rbs +82 -0
  238. data/vendor/ruby-signature/stdlib/builtin/numeric.rbs +409 -0
  239. data/vendor/ruby-signature/stdlib/builtin/object.rbs +824 -0
  240. data/vendor/ruby-signature/stdlib/builtin/proc.rbs +426 -0
  241. data/vendor/ruby-signature/stdlib/builtin/process.rbs +354 -0
  242. data/vendor/ruby-signature/stdlib/builtin/random.rbs +93 -0
  243. data/vendor/ruby-signature/stdlib/builtin/range.rbs +226 -0
  244. data/vendor/ruby-signature/stdlib/builtin/rational.rbs +424 -0
  245. data/vendor/ruby-signature/stdlib/builtin/rb_config.rbs +10 -0
  246. data/vendor/ruby-signature/stdlib/builtin/regexp.rbs +131 -0
  247. data/vendor/ruby-signature/stdlib/builtin/ruby_vm.rbs +14 -0
  248. data/vendor/ruby-signature/stdlib/builtin/signal.rbs +55 -0
  249. data/vendor/ruby-signature/stdlib/builtin/string.rbs +770 -0
  250. data/vendor/ruby-signature/stdlib/builtin/string_io.rbs +13 -0
  251. data/vendor/ruby-signature/stdlib/builtin/struct.rbs +40 -0
  252. data/vendor/ruby-signature/stdlib/builtin/symbol.rbs +230 -0
  253. data/vendor/ruby-signature/stdlib/builtin/thread.rbs +1112 -0
  254. data/vendor/ruby-signature/stdlib/builtin/thread_group.rbs +23 -0
  255. data/vendor/ruby-signature/stdlib/builtin/time.rbs +739 -0
  256. data/vendor/ruby-signature/stdlib/builtin/trace_point.rbs +91 -0
  257. data/vendor/ruby-signature/stdlib/builtin/true_class.rbs +46 -0
  258. data/vendor/ruby-signature/stdlib/builtin/unbound_method.rbs +159 -0
  259. data/vendor/ruby-signature/stdlib/builtin/warning.rbs +17 -0
  260. data/vendor/ruby-signature/stdlib/erb/erb.rbs +18 -0
  261. data/vendor/ruby-signature/stdlib/find/find.rbs +44 -0
  262. data/vendor/ruby-signature/stdlib/pathname/pathname.rbs +21 -0
  263. data/vendor/ruby-signature/stdlib/prime/integer-extension.rbs +23 -0
  264. data/vendor/ruby-signature/stdlib/prime/prime.rbs +188 -0
  265. data/vendor/ruby-signature/stdlib/securerandom/securerandom.rbs +9 -0
  266. data/vendor/ruby-signature/stdlib/set/set.rbs +77 -0
  267. data/vendor/ruby-signature/stdlib/tmpdir/tmpdir.rbs +53 -0
  268. metadata +244 -54
  269. data/.travis.yml +0 -7
  270. data/lib/steep/ast/signature/alias.rb +0 -19
  271. data/lib/steep/ast/signature/class.rb +0 -33
  272. data/lib/steep/ast/signature/const.rb +0 -17
  273. data/lib/steep/ast/signature/env.rb +0 -138
  274. data/lib/steep/ast/signature/extension.rb +0 -21
  275. data/lib/steep/ast/signature/gvar.rb +0 -17
  276. data/lib/steep/ast/signature/interface.rb +0 -31
  277. data/lib/steep/ast/signature/members.rb +0 -115
  278. data/lib/steep/ast/signature/module.rb +0 -21
  279. data/lib/steep/drivers/print_interface.rb +0 -94
  280. data/lib/steep/drivers/scaffold.rb +0 -321
  281. data/lib/steep/drivers/utils/each_signature.rb +0 -31
  282. data/lib/steep/interface/abstract.rb +0 -68
  283. data/lib/steep/interface/builder.rb +0 -637
  284. data/lib/steep/interface/instantiated.rb +0 -163
  285. data/lib/steep/interface/ivar_chain.rb +0 -26
  286. data/lib/steep/parser.y +0 -1278
  287. data/lib/steep/project/listener.rb +0 -53
  288. data/smoke/class/a.rbi +0 -24
  289. data/smoke/class/d.rb +0 -9
  290. data/smoke/class/e.rb +0 -12
  291. data/smoke/class/i.rbi +0 -9
  292. data/smoke/hash/e.rbi +0 -3
  293. data/smoke/hello/hello.rbi +0 -7
  294. data/smoke/implements/a.rbi +0 -6
  295. data/smoke/initialize/a.rbi +0 -3
  296. data/smoke/module/a.rbi +0 -16
  297. data/smoke/self/a.rbi +0 -4
  298. data/smoke/super/a.rbi +0 -10
  299. data/stdlib/builtin.rbi +0 -787
@@ -0,0 +1,56 @@
1
+ module Steep
2
+ module Drivers
3
+ class PrintProject
4
+ attr_reader :stdout
5
+ attr_reader :stderr
6
+
7
+ include Utils::DriverHelper
8
+
9
+ def initialize(stdout:, stderr:)
10
+ @stdout = stdout
11
+ @stderr = stderr
12
+ end
13
+
14
+ def run
15
+ project = load_config()
16
+
17
+ loader = Project::FileLoader.new(project: project)
18
+ loader.load_sources([])
19
+ loader.load_signatures()
20
+
21
+ project.targets.each do |target|
22
+ stdout.puts "Target:"
23
+ stdout.puts " #{target.name}:"
24
+ stdout.puts " sources:"
25
+ stdout.puts " patterns:"
26
+ target.source_patterns.each do |pattern|
27
+ stdout.puts " - #{pattern}"
28
+ end
29
+ stdout.puts " ignores:"
30
+ target.ignore_patterns.each do |pattern|
31
+ stdout.puts " - #{pattern}"
32
+ end
33
+ stdout.puts " files:"
34
+ target.source_files.each_key do |path|
35
+ stdout.puts " - #{path}"
36
+ end
37
+ stdout.puts " signatures:"
38
+ stdout.puts " patterns:"
39
+ target.signature_patterns.each do |pattern|
40
+ stdout.puts " - #{pattern}"
41
+ end
42
+ stdout.puts " files:"
43
+ target.signature_files.each_key do |path|
44
+ stdout.puts " - #{path}"
45
+ end
46
+ stdout.puts " libraries:"
47
+ target.options.libraries.each do |lib|
48
+ stdout.puts " - #{lib}"
49
+ end
50
+ end
51
+
52
+ 0
53
+ end
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,25 @@
1
+ module Steep
2
+ module Drivers
3
+ class SignatureErrorPrinter
4
+ attr_reader :stdout
5
+ attr_reader :stderr
6
+
7
+ def initialize(stdout:, stderr:)
8
+ @stdout = stdout
9
+ @stderr = stderr
10
+ end
11
+
12
+ def print_syntax_errors(errors)
13
+ errors.each do |error|
14
+ stderr.puts error.message
15
+ end
16
+ end
17
+
18
+ def print_semantic_errors(errors)
19
+ errors.each do |error|
20
+ error.puts stderr
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,25 @@
1
+ module Steep
2
+ module Drivers
3
+ class TracePrinter
4
+ attr_reader :io
5
+
6
+ def initialize(io)
7
+ @io = io
8
+ end
9
+
10
+ def print(trace, level: 0)
11
+ trace.each.with_index do |t, i|
12
+ prefix = " " * (i + level)
13
+ case t[0]
14
+ when :type
15
+ io.puts "#{prefix}#{t[1]} <: #{t[2]}"
16
+ when :method
17
+ io.puts "#{prefix}(#{t[3]}) #{t[1]} <: #{t[2]}"
18
+ when :method_type
19
+ io.puts "#{prefix}#{t[1]} <: #{t[2]}"
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,26 @@
1
+ module Steep
2
+ module Drivers
3
+ module Utils
4
+ module DriverHelper
5
+ attr_accessor :steepfile
6
+
7
+ def load_config(path: steepfile || Pathname("Steepfile"))
8
+ raise "Cannot find a configuration at #{path}: `steep init` to scaffold" unless path.file?
9
+
10
+ steep_file_path = path.absolute? ? path : Pathname.pwd + path
11
+ Project.new(base_dir: steep_file_path.parent).tap do |project|
12
+ Project::DSL.parse(project, path.read, filename: path.to_s)
13
+ end
14
+ end
15
+
16
+ def type_check(project)
17
+ project.targets.each do |target|
18
+ Steep.logger.tagged "target=#{target.name}" do
19
+ target.type_check
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -1,58 +1,38 @@
1
1
  module Steep
2
2
  module Drivers
3
3
  class Validate
4
- attr_reader :signature_dirs
5
4
  attr_reader :stdout
6
5
  attr_reader :stderr
7
6
 
8
- def initialize(signature_dirs:, stdout:, stderr:)
9
- @signature_dirs = signature_dirs
7
+ include Utils::DriverHelper
8
+
9
+ def initialize(stdout:, stderr:)
10
10
  @stdout = stdout
11
11
  @stderr = stderr
12
12
  end
13
13
 
14
- include Utils::EachSignature
15
-
16
14
  def run
17
- project = Project.new
15
+ project = load_config()
18
16
 
19
- signature_dirs.each do |path|
20
- each_file_in_path(".rbi", path) do |file_path|
21
- file = Project::SignatureFile.new(path: file_path)
22
- file.content = file_path.read
23
- project.signature_files[file_path] = file
24
- end
25
- end
17
+ loader = Project::FileLoader.new(project: project)
18
+ loader.load_signatures()
26
19
 
27
- project.type_check
20
+ type_check(project)
28
21
 
29
- case project.signature
30
- when Project::SignatureHasError
31
- project.signature.errors.each do |error|
32
- case error
33
- when Interface::Instantiated::InvalidMethodOverrideError
34
- stdout.puts "😱 #{error.message}"
35
- error.result.trace.each do |s, t|
36
- case s
37
- when Interface::Method
38
- stdout.puts " #{s.name}(#{s.type_name}) <: #{t.name}(#{t.type_name})"
39
- when Interface::MethodType
40
- stdout.puts " #{s} <: #{t} (#{s.location&.name||"?"}:#{s.location&.start_line||"?"})"
41
- else
42
- stdout.puts " #{s} <: #{t}"
43
- end
44
- end
45
- stdout.puts " 🚨 #{error.result.error.message}"
46
- when Interface::Instantiated::InvalidIvarOverrideError
47
- stdout.puts "😱 #{error.message}"
48
- else
49
- stdout.puts "😱 #{error.inspect}"
22
+ project.targets.each do |target|
23
+ Steep.logger.tagged "target=#{target.name}" do
24
+ case (status = target.status)
25
+ when Project::Target::SignatureSyntaxErrorStatus
26
+ printer = SignatureErrorPrinter.new(stdout: stdout, stderr: stderr)
27
+ printer.print_syntax_errors(status.errors)
28
+ when Project::Target::SignatureValidationErrorStatus
29
+ printer = SignatureErrorPrinter.new(stdout: stdout, stderr: stderr)
30
+ printer.print_semantic_errors(status.errors)
50
31
  end
51
32
  end
52
- 1
53
- else
54
- 0
55
33
  end
34
+
35
+ project.targets.all? {|target| target.status.is_a?(Project::Target::TypeCheckStatus) } ? 0 : 1
56
36
  end
57
37
  end
58
38
  end
@@ -0,0 +1,46 @@
1
+ module Steep
2
+ module Drivers
3
+ class Vendor
4
+ attr_reader :stdout
5
+ attr_reader :stderr
6
+ attr_reader :stdin
7
+
8
+ attr_accessor :vendor_dir
9
+ attr_accessor :clean_before
10
+
11
+ def initialize(stdout:, stderr:, stdin:)
12
+ @stdout = stdout
13
+ @stderr = stderr
14
+ @stdin = stdin
15
+
16
+ @clean_before = false
17
+ @vendor_dir = nil
18
+ end
19
+
20
+ def run
21
+ stdout.puts "Vendoring into #{vendor_dir}..."
22
+
23
+ vendorer = Ruby::Signature::Vendorer.new(vendor_dir: vendor_dir)
24
+
25
+ if clean_before
26
+ stdout.puts " Cleaning directory..."
27
+ vendorer.clean!
28
+ end
29
+
30
+ stdout.puts " Vendoring standard libraries..."
31
+ vendorer.stdlib!
32
+
33
+ if defined?(Bundler)
34
+ Bundler.locked_gems.specs.each do |spec|
35
+ if Ruby::Signature::EnvironmentLoader.gem_sig_path(spec.name, spec.version.to_s).directory?
36
+ stdout.puts " Vendoring rubygem: #{spec.full_name}..."
37
+ vendorer.gem! spec.name, spec.version.to_s
38
+ end
39
+ end
40
+ end
41
+
42
+ 0
43
+ end
44
+ end
45
+ end
46
+ end
@@ -1,187 +1,125 @@
1
1
  module Steep
2
2
  module Drivers
3
3
  class Watch
4
- class Options
5
- attr_accessor :fallback_any_is_error
6
- attr_accessor :allow_missing_definitions
7
-
8
- def initialize
9
- self.fallback_any_is_error = false
10
- self.allow_missing_definitions = true
11
- end
12
- end
13
-
14
- attr_reader :source_dirs
15
- attr_reader :signature_dirs
4
+ attr_reader :dirs
16
5
  attr_reader :stdout
17
6
  attr_reader :stderr
18
- attr_reader :options
19
7
  attr_reader :queue
20
8
 
21
- include Utils::EachSignature
9
+ include Utils::DriverHelper
22
10
 
23
- def initialize(source_dirs:, signature_dirs:, stdout:, stderr:)
24
- @source_dirs = source_dirs
25
- @signature_dirs = signature_dirs
11
+ def initialize(stdout:, stderr:)
12
+ @dirs = []
26
13
  @stdout = stdout
27
14
  @stderr = stderr
28
- @options = Options.new
29
15
  @queue = Thread::Queue.new
30
16
  end
31
17
 
32
- def project_options
33
- Project::Options.new.tap do |opt|
34
- opt.fallback_any_is_error = options.fallback_any_is_error
35
- opt.allow_missing_definitions = options.allow_missing_definitions
36
- end
37
- end
38
-
39
- def source_listener
40
- @source_listener ||= yield_self do
41
- Listen.to(*source_dirs.map(&:to_s), only: /\.rb$/) do |modified, added, removed|
42
- queue << [:source, modified, added, removed]
18
+ def listener
19
+ @listener ||= begin
20
+ Steep.logger.info "Watching #{dirs.join(", ")}..."
21
+ Listen.to(*dirs.map(&:to_s)) do |modified, added, removed|
22
+ Steep.logger.tagged "watch" do
23
+ Steep.logger.info "Received file system updates: modified=[#{modified.join(",")}], added=[#{added.join(",")}], removed=[#{removed.join(",")}]"
24
+ end
25
+ queue << [modified, added, removed]
43
26
  end
44
27
  end
45
28
  end
46
29
 
47
- def signature_listener
48
- @signature_listener ||= yield_self do
49
- Listen.to(*signature_dirs.map(&:to_s), only: /\.rbi$/) do |modified, added, removed|
50
- queue << [:signature, modified, added, removed]
51
- end
52
- end
53
- end
30
+ def type_check_loop(project)
31
+ until queue.closed?
32
+ stdout.puts "🚥 Waiting for updates..."
54
33
 
55
- def type_check_thread(project)
56
- Thread.new do
57
- until queue.closed?
58
- begin
59
- events = []
60
- events << queue.deq
61
- until queue.empty?
62
- events << queue.deq(nonblock: true)
63
- end
34
+ events = []
35
+ events << queue.deq
36
+ until queue.empty?
37
+ events << queue.deq(nonblock: true)
38
+ end
64
39
 
65
- events.compact.each do |name, modified, added, removed|
66
- case name
67
- when :source
68
- (modified + added).each do |name|
69
- path = Pathname(name).relative_path_from(Pathname.pwd)
70
- file = project.source_files[path] || Project::SourceFile.new(path: path, options: project_options)
71
- file.content = path.read
72
- project.source_files[path] = file
73
- end
74
-
75
- removed.each do |name|
76
- path = Pathname(name).relative_path_from(Pathname.pwd)
77
- project.source_files.delete(path)
78
- end
79
-
80
- when :signature
81
- (modified + added).each do |name|
82
- path = Pathname(name).relative_path_from(Pathname.pwd)
83
- file = project.signature_files[path] || Project::SignatureFile.new(path: path)
84
- file.content = path.read
85
- project.signature_files[path] = file
86
- end
87
-
88
- removed.each do |name|
89
- path = Pathname(name).relative_path_from(Pathname.pwd)
90
- project.signature_files.delete(path)
91
- end
92
- end
93
- end
40
+ events.compact.each do |modified, added, removed|
41
+ modified.each do |name|
42
+ path = Pathname(name).relative_path_from(Pathname.pwd)
94
43
 
95
- begin
96
- project.type_check
97
- rescue Racc::ParseError => exn
98
- stderr.puts exn.message
99
- project.clear
44
+ project.targets.each do |target|
45
+ target.update_source path, path.read if target.source_file?(path)
46
+ target.update_signature path, path.read if target.signature_file?(path)
100
47
  end
101
48
  end
102
- end
103
- rescue ClosedQueueError
104
- # nop
105
- end
106
- end
107
49
 
108
- class WatchListener < Project::NullListener
109
- attr_reader :stdout
110
- attr_reader :stderr
111
-
112
- def initialize(stdout:, stderr:, verbose:)
113
- @stdout = stdout
114
- @stderr = stderr
115
- end
50
+ added.each do |name|
51
+ path = Pathname(name).relative_path_from(Pathname.pwd)
116
52
 
117
- def check(project:)
118
- yield.tap do
119
- if project.success?
120
- if project.has_type_error?
121
- stdout.puts "Detected #{project.errors.size} errors... 🔥"
122
- else
123
- stdout.puts "No error detected. 🎉"
53
+ project.targets.each do |target|
54
+ target.add_source path, path.read if target.possible_source_file?(path)
55
+ target.add_signature path, path.read if target.possible_signature_file?(path)
124
56
  end
125
- else
126
- stdout.puts "Type checking failed... 🔥"
127
57
  end
128
- end
129
- end
130
58
 
131
- def type_check_source(project:, file:)
132
- yield.tap do
133
- case
134
- when file.source.is_a?(Source) && file.errors
135
- file.errors.each do |error|
136
- error.print_to stdout
59
+ removed.each do |name|
60
+ path = Pathname(name).relative_path_from(Pathname.pwd)
61
+
62
+ project.targets.each do |target|
63
+ target.remove_source path if target.source_file?(path)
64
+ target.remove_signature path if target.signature_file?(path)
137
65
  end
138
66
  end
139
67
  end
68
+
69
+ stdout.puts "🔬 Type checking..."
70
+ type_check project
71
+ print_project_result project
140
72
  end
73
+ rescue ClosedQueueError
74
+ # nop
75
+ end
141
76
 
142
- def load_signature(project:)
143
- # @type var project: Project
144
- yield.tap do
145
- case sig = project.signature
146
- when Project::SignatureHasError
147
- when Project::SignatureHasSyntaxError
148
- sig.errors.each do |path, exn|
149
- stdout.puts "#{path} has a syntax error: #{exn.inspect}"
77
+ def print_project_result(project)
78
+ project.targets.each do |target|
79
+ Steep.logger.tagged "target=#{target.name}" do
80
+ case (status = target.status)
81
+ when Project::Target::SignatureSyntaxErrorStatus
82
+ printer = SignatureErrorPrinter.new(stdout: stdout, stderr: stderr)
83
+ printer.print_syntax_errors(status.errors)
84
+ when Project::Target::SignatureValidationErrorStatus
85
+ printer = SignatureErrorPrinter.new(stdout: stdout, stderr: stderr)
86
+ printer.print_semantic_errors(status.errors)
87
+ when Project::Target::TypeCheckStatus
88
+ status.type_check_sources.each do |source_file|
89
+ source_file.errors.each do |error|
90
+ error.print_to stdout
91
+ end
150
92
  end
151
93
  end
152
94
  end
153
95
  end
154
96
  end
155
97
 
156
- def run(block: true)
157
- project = Project.new(WatchListener.new(stdout: stdout, stderr: stderr, verbose: false))
158
-
159
- source_dirs.each do |path|
160
- each_file_in_path(".rb", path) do |file_path|
161
- file = Project::SourceFile.new(path: file_path, options: options)
162
- file.content = file_path.read
163
- project.source_files[file_path] = file
164
- end
98
+ def run()
99
+ if dirs.empty?
100
+ stdout.puts "Specify directories to watch"
101
+ return 1
165
102
  end
166
103
 
167
- signature_dirs.each do |path|
168
- each_file_in_path(".rbi", path) do |file_path|
169
- file = Project::SignatureFile.new(path: file_path)
170
- file.content = file_path.read
171
- project.signature_files[file_path] = file
172
- end
173
- end
104
+ project = load_config()
174
105
 
175
- project.type_check
106
+ loader = Project::FileLoader.new(project: project)
107
+ loader.load_sources([])
108
+ loader.load_signatures()
176
109
 
177
- source_listener.start
178
- signature_listener.start
179
- t = type_check_thread(project)
110
+ type_check project
111
+ print_project_result project
180
112
 
181
- binding.pry(quiet: true) if block
113
+ listener.start
114
+
115
+ stdout.puts "👀 Watching directories, Ctrl-C to stop."
116
+ begin
117
+ type_check_loop project
118
+ rescue Interrupt
119
+ # bye
120
+ end
182
121
 
183
- queue.close
184
- t.join
122
+ 0
185
123
  end
186
124
  end
187
125
  end