steep 1.7.0.dev.3 → 1.7.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (170) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +43 -0
  3. data/README.md +18 -0
  4. data/doc/narrowing.md +1 -1
  5. data/doc/shape.md +176 -0
  6. data/guides/src/gem-rbs-collection/gem-rbs-collection.md +7 -24
  7. data/lib/steep/ast/types/factory.rb +27 -18
  8. data/lib/steep/ast/types/proc.rb +14 -9
  9. data/lib/steep/interface/block.rb +1 -1
  10. data/lib/steep/interface/builder.rb +1 -0
  11. data/lib/steep/interface/function.rb +14 -6
  12. data/lib/steep/interface/method_type.rb +15 -7
  13. data/lib/steep/project/pattern.rb +1 -2
  14. data/lib/steep/rake_task.rb +132 -0
  15. data/lib/steep/server/interaction_worker.rb +6 -0
  16. data/lib/steep/server/lsp_formatter.rb +2 -0
  17. data/lib/steep/services/completion_provider.rb +1 -1
  18. data/lib/steep/services/file_loader.rb +15 -20
  19. data/lib/steep/services/signature_help_provider.rb +11 -9
  20. data/lib/steep/signature/validator.rb +1 -1
  21. data/lib/steep/subtyping/check.rb +15 -6
  22. data/lib/steep/subtyping/variable_variance.rb +3 -3
  23. data/lib/steep/type_construction.rb +186 -149
  24. data/lib/steep/type_inference/block_params.rb +1 -1
  25. data/lib/steep/type_inference/logic_type_interpreter.rb +2 -1
  26. data/lib/steep/type_inference/method_params.rb +16 -0
  27. data/lib/steep/type_inference/send_args.rb +5 -2
  28. data/lib/steep/version.rb +1 -1
  29. data/steep.gemspec +5 -2
  30. metadata +7 -145
  31. data/.github/dependabot.yml +0 -28
  32. data/.github/workflows/ruby-windows.yml +0 -35
  33. data/.github/workflows/ruby.yml +0 -32
  34. data/.vscode/steep-shared.code-snippets +0 -41
  35. data/Gemfile +0 -14
  36. data/Gemfile.lock +0 -104
  37. data/Gemfile.steep +0 -0
  38. data/gemfile_steep/Gemfile +0 -3
  39. data/gemfile_steep/Gemfile.lock +0 -77
  40. data/rbs_collection.steep.lock.yaml +0 -108
  41. data/rbs_collection.steep.yaml +0 -23
  42. data/sig/shims/bundler.rbs +0 -3
  43. data/sig/shims/concurrent-ruby.rbs +0 -39
  44. data/sig/shims/exception.rbs +0 -4
  45. data/sig/shims/language-server_protocol.rbs +0 -450
  46. data/sig/shims/parser/comment.rbs +0 -33
  47. data/sig/shims/parser/nodes.rbs +0 -252
  48. data/sig/shims/parser/source/map.rbs +0 -146
  49. data/sig/shims/parser/source/range.rbs +0 -237
  50. data/sig/shims/parser.rbs +0 -69
  51. data/sig/shims/string.rbs +0 -4
  52. data/sig/shims/tagged_logging.rbs +0 -6
  53. data/sig/shims/yaml.rbs +0 -4
  54. data/sig/steep/annotation_parser.rbs +0 -60
  55. data/sig/steep/ast/annotation/collection.rbs +0 -78
  56. data/sig/steep/ast/annotation.rbs +0 -121
  57. data/sig/steep/ast/builtin.rbs +0 -69
  58. data/sig/steep/ast/ignore.rbs +0 -66
  59. data/sig/steep/ast/node/type_application.rbs +0 -31
  60. data/sig/steep/ast/node/type_assertion.rbs +0 -32
  61. data/sig/steep/ast/types/any.rbs +0 -29
  62. data/sig/steep/ast/types/boolean.rbs +0 -31
  63. data/sig/steep/ast/types/bot.rbs +0 -29
  64. data/sig/steep/ast/types/class.rbs +0 -33
  65. data/sig/steep/ast/types/factory.rbs +0 -110
  66. data/sig/steep/ast/types/helper.rbs +0 -24
  67. data/sig/steep/ast/types/instance.rbs +0 -33
  68. data/sig/steep/ast/types/intersection.rbs +0 -40
  69. data/sig/steep/ast/types/literal.rbs +0 -35
  70. data/sig/steep/ast/types/logic.rbs +0 -83
  71. data/sig/steep/ast/types/name.rbs +0 -84
  72. data/sig/steep/ast/types/nil.rbs +0 -31
  73. data/sig/steep/ast/types/proc.rbs +0 -53
  74. data/sig/steep/ast/types/record.rbs +0 -39
  75. data/sig/steep/ast/types/self.rbs +0 -33
  76. data/sig/steep/ast/types/top.rbs +0 -29
  77. data/sig/steep/ast/types/tuple.rbs +0 -37
  78. data/sig/steep/ast/types/union.rbs +0 -40
  79. data/sig/steep/ast/types/var.rbs +0 -42
  80. data/sig/steep/ast/types/void.rbs +0 -29
  81. data/sig/steep/ast/types.rbs +0 -16
  82. data/sig/steep/cli.rbs +0 -55
  83. data/sig/steep/diagnostic/deprecated/else_on_exhaustive_case.rbs +0 -13
  84. data/sig/steep/diagnostic/deprecated/unknown_constant_assigned.rbs +0 -15
  85. data/sig/steep/diagnostic/helper.rbs +0 -15
  86. data/sig/steep/diagnostic/lsp_formatter.rbs +0 -36
  87. data/sig/steep/diagnostic/ruby.rbs +0 -703
  88. data/sig/steep/diagnostic/signature.rbs +0 -252
  89. data/sig/steep/drivers/annotations.rbs +0 -17
  90. data/sig/steep/drivers/check.rbs +0 -33
  91. data/sig/steep/drivers/checkfile.rbs +0 -27
  92. data/sig/steep/drivers/diagnostic_printer.rbs +0 -25
  93. data/sig/steep/drivers/init.rbs +0 -19
  94. data/sig/steep/drivers/langserver.rbs +0 -36
  95. data/sig/steep/drivers/print_project.rbs +0 -15
  96. data/sig/steep/drivers/stats.rbs +0 -47
  97. data/sig/steep/drivers/utils/driver_helper.rbs +0 -25
  98. data/sig/steep/drivers/utils/jobs_option.rbs +0 -19
  99. data/sig/steep/drivers/validate.rbs +0 -15
  100. data/sig/steep/drivers/vendor.rbs +0 -19
  101. data/sig/steep/drivers/watch.rbs +0 -27
  102. data/sig/steep/drivers/worker.rbs +0 -29
  103. data/sig/steep/equatable.rbs +0 -11
  104. data/sig/steep/expectations.rbs +0 -72
  105. data/sig/steep/index/rbs_index.rbs +0 -141
  106. data/sig/steep/index/signature_symbol_provider.rbs +0 -41
  107. data/sig/steep/index/source_index.rbs +0 -63
  108. data/sig/steep/interface/block.rbs +0 -41
  109. data/sig/steep/interface/builder.rbs +0 -152
  110. data/sig/steep/interface/function.rbs +0 -270
  111. data/sig/steep/interface/method_type.rbs +0 -105
  112. data/sig/steep/interface/shape.rbs +0 -80
  113. data/sig/steep/interface/substitution.rbs +0 -51
  114. data/sig/steep/interface/type_param.rbs +0 -43
  115. data/sig/steep/method_name.rbs +0 -30
  116. data/sig/steep/module_helper.rbs +0 -16
  117. data/sig/steep/node_helper.rbs +0 -91
  118. data/sig/steep/path_helper.rbs +0 -15
  119. data/sig/steep/project/dsl.rbs +0 -108
  120. data/sig/steep/project/options.rbs +0 -47
  121. data/sig/steep/project/pattern.rbs +0 -47
  122. data/sig/steep/project/target.rbs +0 -25
  123. data/sig/steep/project.rbs +0 -26
  124. data/sig/steep/range_extension.rbs +0 -7
  125. data/sig/steep/server/base_worker.rbs +0 -49
  126. data/sig/steep/server/change_buffer.rbs +0 -38
  127. data/sig/steep/server/delay_queue.rbs +0 -37
  128. data/sig/steep/server/interaction_worker.rbs +0 -90
  129. data/sig/steep/server/lsp_formatter.rbs +0 -63
  130. data/sig/steep/server/master.rbs +0 -299
  131. data/sig/steep/server/type_check_worker.rbs +0 -141
  132. data/sig/steep/server/worker_process.rbs +0 -97
  133. data/sig/steep/services/completion_provider.rbs +0 -264
  134. data/sig/steep/services/content_change.rbs +0 -37
  135. data/sig/steep/services/file_loader.rbs +0 -21
  136. data/sig/steep/services/goto_service.rbs +0 -106
  137. data/sig/steep/services/hover_provider/rbs.rbs +0 -47
  138. data/sig/steep/services/hover_provider/ruby.rbs +0 -127
  139. data/sig/steep/services/hover_provider/singleton_methods.rbs +0 -11
  140. data/sig/steep/services/path_assignment.rbs +0 -21
  141. data/sig/steep/services/signature_help_provider.rbs +0 -51
  142. data/sig/steep/services/signature_service.rbs +0 -156
  143. data/sig/steep/services/stats_calculator.rbs +0 -41
  144. data/sig/steep/services/type_check_service.rbs +0 -112
  145. data/sig/steep/services/type_name_completion.rbs +0 -135
  146. data/sig/steep/signature/validator.rbs +0 -85
  147. data/sig/steep/source/ignore_ranges.rbs +0 -38
  148. data/sig/steep/source.rbs +0 -105
  149. data/sig/steep/subtyping/cache.rbs +0 -17
  150. data/sig/steep/subtyping/check.rbs +0 -131
  151. data/sig/steep/subtyping/constraints.rbs +0 -111
  152. data/sig/steep/subtyping/relation.rbs +0 -63
  153. data/sig/steep/subtyping/result.rbs +0 -179
  154. data/sig/steep/subtyping/variable_variance.rbs +0 -25
  155. data/sig/steep/thread_waiter.rbs +0 -13
  156. data/sig/steep/type_construction.rbs +0 -542
  157. data/sig/steep/type_inference/block_params.rbs +0 -170
  158. data/sig/steep/type_inference/case_when.rbs +0 -130
  159. data/sig/steep/type_inference/constant_env.rbs +0 -29
  160. data/sig/steep/type_inference/context.rbs +0 -216
  161. data/sig/steep/type_inference/context_array.rbs +0 -38
  162. data/sig/steep/type_inference/logic_type_interpreter.rbs +0 -108
  163. data/sig/steep/type_inference/method_call.rbs +0 -124
  164. data/sig/steep/type_inference/method_params.rbs +0 -127
  165. data/sig/steep/type_inference/multiple_assignment.rbs +0 -76
  166. data/sig/steep/type_inference/send_args.rbs +0 -243
  167. data/sig/steep/type_inference/type_env.rbs +0 -160
  168. data/sig/steep/type_inference/type_env_builder.rbs +0 -81
  169. data/sig/steep/typing.rbs +0 -75
  170. data/sig/steep.rbs +0 -45
@@ -0,0 +1,132 @@
1
+ require "rake"
2
+ require "rake/tasklib"
3
+ require "steep/cli"
4
+
5
+ module Steep
6
+ # Provides Rake tasks for running Steep commands.
7
+ #
8
+ # require "steep/rake_task"
9
+ # Steep::RakeTask.new do |t|
10
+ # t.check.severity_level = :error
11
+ # t.watch.verbose
12
+ # t.stats << "--format=table"
13
+ # end
14
+ class RakeTask < Rake::TaskLib # steep:ignore UnknownConstant
15
+ attr_accessor :name
16
+
17
+ def self.available_commands
18
+ %i(init check stats binstub project watch)
19
+ end
20
+
21
+ def initialize(name = :steep, cli_runner = default_cli_runner)
22
+ super()
23
+
24
+ @name = name
25
+
26
+ configuration = TaskConfiguration.new
27
+
28
+ yield configuration if block_given?
29
+
30
+ define_tasks(configuration, cli_runner)
31
+ end
32
+
33
+ private
34
+
35
+ # :nodoc:
36
+ class TaskConfiguration
37
+ def initialize
38
+ @commands = {}
39
+ end
40
+
41
+ def method_missing(command)
42
+ if respond_to?(command)
43
+ @commands[command] ||= CommandConfiguration.new
44
+ else
45
+ super
46
+ end
47
+ end
48
+
49
+ def respond_to_missing?(name, include_private = false)
50
+ RakeTask.available_commands.include?(name) || super
51
+ end
52
+
53
+ def options(command)
54
+ @commands[command]&.to_a || []
55
+ end
56
+ end
57
+
58
+ # :nodoc:
59
+ class CommandConfiguration
60
+ def initialize
61
+ @options = []
62
+ end
63
+
64
+ def method_missing(name, value = nil)
65
+ option = "--#{name.to_s.gsub(/_/, '-').gsub(/=/, '')}"
66
+ option << "=#{value}" if value
67
+
68
+ self << option
69
+ end
70
+
71
+ def respond_to_missing?(_name)
72
+ true
73
+ end
74
+
75
+ def <<(value)
76
+ @options << value
77
+ self
78
+ end
79
+
80
+ def to_a
81
+ @options
82
+ end
83
+ end
84
+
85
+ def default_cli_runner
86
+ lambda do |arguments|
87
+ require "steep"
88
+
89
+ cli = Steep::CLI.new(
90
+ stdout: $stdout,
91
+ stdin: $stdin,
92
+ stderr: $stderr,
93
+ argv: arguments
94
+ )
95
+
96
+ cli.run
97
+ end
98
+ end
99
+
100
+ def define_tasks(configuration, cli_runner)
101
+ namespace name do
102
+ RakeTask.available_commands.each do |command|
103
+ desc "Run steep #{command}"
104
+ task command do |_, args|
105
+ configured_options = configuration.options(command)
106
+
107
+ argv = [
108
+ command.to_s,
109
+ *configured_options,
110
+ *args.extras
111
+ ]
112
+
113
+ result = cli_runner[argv]
114
+
115
+ raise "Steep failed" if result.nonzero?
116
+ end
117
+ end
118
+
119
+ desc "Run steep help"
120
+ task "help" do
121
+ arguments = ["--help"]
122
+
123
+ cli_runner[arguments]
124
+ end
125
+ end
126
+
127
+ # Default steep task to steep:check
128
+ desc "Run steep check" unless ::Rake.application.last_description # steep:ignore UnknownConstant
129
+ task name => ["#{name}:check"]
130
+ end
131
+ end
132
+ end
@@ -90,6 +90,12 @@ module Steep
90
90
  collect_changes(request)
91
91
  queue_job ApplyChangeJob.new
92
92
 
93
+ when "$/file/reset"
94
+ uri = request[:params][:uri]
95
+ text = request[:params][:content]
96
+ reset_change(uri: uri, text: text)
97
+ queue_job ApplyChangeJob.new
98
+
93
99
  when "textDocument/hover"
94
100
  id = request[:id]
95
101
 
@@ -263,6 +263,8 @@ module Steep
263
263
  <<~MD
264
264
  **Keyword argument**: `#{item.identifier}`
265
265
  MD
266
+ else
267
+ raise
266
268
  end
267
269
  end
268
270
 
@@ -740,7 +740,7 @@ module Steep
740
740
  if method = shape.methods[call.method_name]
741
741
  method.method_types.each.with_index do |method_type, i|
742
742
  defn = method_type.method_decls.to_a[0]&.method_def
743
- if defn
743
+ if defn && defn.type.type
744
744
  range = range_for(position, prefix: prefix)
745
745
  kwargs = argument_nodes.find { |arg| arg.type == :kwargs }&.children || []
746
746
  used_kwargs = kwargs.filter_map { |arg| arg.type == :pair && arg.children.first.children.first }
@@ -12,30 +12,25 @@ module Steep
12
12
  pats = commandline_patterns.empty? ? pattern.patterns : commandline_patterns
13
13
 
14
14
  pats.each do |path|
15
- absolute_path = base_dir + path
16
-
17
- if absolute_path.file?
18
- relative_path = absolute_path.relative_path_from(base_dir)
19
- if pattern =~ relative_path
20
- yield relative_path
21
- end
22
- else
23
- files = if absolute_path.directory?
24
- Pathname.glob("#{absolute_path}/**/*#{pattern.ext}")
25
- else
26
- Pathname.glob(absolute_path.to_s)
27
- end
28
-
29
- files.sort.each do |source_path|
30
- if source_path.file?
31
- relative_path = source_path.relative_path_from(base_dir)
32
- unless pattern.ignore?(relative_path)
33
- yield relative_path
15
+ Pathname.glob((base_dir + path).to_s).each do |absolute_path|
16
+ if absolute_path.file?
17
+ relative_path = absolute_path.relative_path_from(base_dir)
18
+ if pattern =~ relative_path
19
+ yield relative_path
20
+ end
21
+ else
22
+ files = Pathname.glob("#{absolute_path}/**/*#{pattern.ext}")
23
+
24
+ files.sort.each do |source_path|
25
+ if source_path.file?
26
+ relative_path = source_path.relative_path_from(base_dir)
27
+ unless pattern.ignore?(relative_path)
28
+ yield relative_path
29
+ end
34
30
  end
35
31
  end
36
32
  end
37
33
  end
38
-
39
34
  end
40
35
  else
41
36
  enum_for :each_path_in_patterns, pattern, commandline_patterns
@@ -7,15 +7,17 @@ module Steep
7
7
  # @implements Item
8
8
 
9
9
  def parameters
10
- arguments = [] #: Array[String]
11
- arguments.push(*method_type.type.required_positionals.map(&:to_s))
12
- arguments.push(*method_type.type.optional_positionals.map {|p| "?#{p}"})
13
- arguments.push("*#{self.method_type.type.rest_positionals}") if method_type.type.rest_positionals
14
- arguments.push(*method_type.type.trailing_positionals.map(&:to_s))
15
- arguments.push(*method_type.type.required_keywords.map {|name, param| "#{name}: #{param}" })
16
- arguments.push(*method_type.type.optional_keywords.map {|name, param| "?#{name}: #{param}" })
17
- arguments.push("**#{method_type.type.rest_keywords}") if method_type.type.rest_keywords
18
- arguments
10
+ if method_type.type.is_a?(RBS::Types::Function)
11
+ arguments = [] #: Array[String]
12
+ arguments.push(*method_type.type.required_positionals.map(&:to_s))
13
+ arguments.push(*method_type.type.optional_positionals.map {|p| "?#{p}"})
14
+ arguments.push("*#{self.method_type.type.rest_positionals}") if method_type.type.rest_positionals
15
+ arguments.push(*method_type.type.trailing_positionals.map(&:to_s))
16
+ arguments.push(*method_type.type.required_keywords.map {|name, param| "#{name}: #{param}" })
17
+ arguments.push(*method_type.type.optional_keywords.map {|name, param| "?#{name}: #{param}" })
18
+ arguments.push("**#{method_type.type.rest_keywords}") if method_type.type.rest_keywords
19
+ arguments
20
+ end
19
21
  end
20
22
  end
21
23
 
@@ -134,7 +134,7 @@ module Steep
134
134
  end
135
135
 
136
136
  def validate_type(type)
137
- Steep.logger.debug "#{Location.to_string type.location}: Validating #{type}..."
137
+ Steep.logger.debug { "#{Location.to_string type.location}: Validating #{type}..." }
138
138
 
139
139
  validator.validate_type(type, context: nil)
140
140
  validate_type_application(type)
@@ -850,8 +850,10 @@ module Steep
850
850
  relation.function!
851
851
 
852
852
  All(relation) do |result|
853
- result.add(relation.map {|fun| fun.params }) do |rel|
854
- check_method_params(name, rel)
853
+ if relation.sub_type.params && relation.super_type.params
854
+ result.add(relation.map {|fun| _ = fun.params }) do |rel|
855
+ check_method_params(name, rel)
856
+ end
855
857
  end
856
858
 
857
859
  result.add(relation.map {|fun| fun.return_type }) do |rel|
@@ -906,16 +908,23 @@ module Steep
906
908
  end
907
909
 
908
910
  def match_method_type_fails?(name, type1, type2)
909
- match_params(name, Relation(type1.type.params, type2.type.params)).tap do |param_pairs|
910
- return param_pairs unless param_pairs.is_a?(Array)
911
+ if type1.type.params && type2.type.params
912
+ match_params(name, Relation(type1.type.params, type2.type.params)).tap do |param_pairs|
913
+ return param_pairs unless param_pairs.is_a?(Array)
914
+ end
911
915
  end
912
916
 
913
917
  case result = expand_block_given(name, Relation(type1.block, type2.block))
914
918
  when Result::Base
915
919
  return result
916
920
  when Relation
917
- match_params(name, result.map {|m| m.type.params }).tap do |param_pairs|
918
- return param_pairs unless param_pairs.is_a?(Array)
921
+ type1.block or raise
922
+ type2.block or raise
923
+
924
+ if type1.block.type.params && type2.block.type.params
925
+ match_params(name, result.map {|m| _ = m.type.params }).tap do |param_pairs|
926
+ return param_pairs unless param_pairs.is_a?(Array)
927
+ end
919
928
  end
920
929
  end
921
930
 
@@ -46,7 +46,7 @@ module Steep
46
46
  end
47
47
 
48
48
  def self.add_params(params, block:, covariants:, contravariants:)
49
- params.each_type do |type|
49
+ params&.each_type do |type|
50
50
  add_type(type, variance: block ? :contravariant : :covariant, covariants: covariants, contravariants: contravariants)
51
51
  end
52
52
  end
@@ -64,12 +64,12 @@ module Steep
64
64
  contravariants << type.name
65
65
  end
66
66
  when AST::Types::Proc
67
- type.type.params.each_type do |type|
67
+ type.type.params&.each_type do |type|
68
68
  add_type(type, variance: variance, covariants: contravariants, contravariants: covariants)
69
69
  end
70
70
  add_type(type.type.return_type, variance: variance, covariants: covariants, contravariants: contravariants)
71
71
  if type.block
72
- type.block.type.params.each_type do |type|
72
+ type.block.type.params&.each_type do |type|
73
73
  add_type(type, variance: variance, covariants: covariants, contravariants: contravariants)
74
74
  end
75
75
  add_type(type.type.return_type, variance: variance, covariants: contravariants, contravariants: covariants)