Module: Steep

Defined in:
lib/steep.rb,
lib/steep/cli.rb,
lib/steep/daemon.rb,
lib/steep/source.rb,
lib/steep/typing.rb,
lib/steep/locator.rb,
lib/steep/project.rb,
lib/steep/version.rb,
lib/steep/equatable.rb,
lib/steep/rake_task.rb,
lib/steep/ast/ignore.rb,
lib/steep/ast/builtin.rb,
lib/steep/method_name.rb,
lib/steep/node_helper.rb,
lib/steep/path_helper.rb,
lib/steep/project/dsl.rb,
lib/steep/drivers/init.rb,
lib/steep/expectations.rb,
lib/steep/ast/types/any.rb,
lib/steep/ast/types/bot.rb,
lib/steep/ast/types/nil.rb,
lib/steep/ast/types/top.rb,
lib/steep/ast/types/var.rb,
lib/steep/daemon/server.rb,
lib/steep/drivers/check.rb,
lib/steep/drivers/query.rb,
lib/steep/drivers/stats.rb,
lib/steep/drivers/watch.rb,
lib/steep/located_value.rb,
lib/steep/module_helper.rb,
lib/steep/project/group.rb,
lib/steep/server/master.rb,
lib/steep/thread_waiter.rb,
lib/steep/ast/annotation.rb,
lib/steep/ast/types/name.rb,
lib/steep/ast/types/proc.rb,
lib/steep/ast/types/self.rb,
lib/steep/ast/types/void.rb,
lib/steep/drivers/vendor.rb,
lib/steep/drivers/worker.rb,
lib/steep/project/target.rb,
lib/steep/tagged_logging.rb,
lib/steep/ast/types/class.rb,
lib/steep/ast/types/logic.rb,
lib/steep/ast/types/tuple.rb,
lib/steep/ast/types/union.rb,
lib/steep/diagnostic/ruby.rb,
lib/steep/index/rbs_index.rb,
lib/steep/interface/block.rb,
lib/steep/interface/shape.rb,
lib/steep/project/options.rb,
lib/steep/project/pattern.rb,
lib/steep/subtyping/cache.rb,
lib/steep/subtyping/check.rb,
lib/steep/ast/types/helper.rb,
lib/steep/ast/types/record.rb,
lib/steep/subtyping/result.rb,
lib/steep/annotation_parser.rb,
lib/steep/ast/types/boolean.rb,
lib/steep/ast/types/factory.rb,
lib/steep/ast/types/literal.rb,
lib/steep/diagnostic/helper.rb,
lib/steep/drivers/checkfile.rb,
lib/steep/interface/builder.rb,
lib/steep/type_construction.rb,
lib/steep/annotations_helper.rb,
lib/steep/ast/types/instance.rb,
lib/steep/drivers/langserver.rb,
lib/steep/index/source_index.rb,
lib/steep/interface/function.rb,
lib/steep/server/base_worker.rb,
lib/steep/server/delay_queue.rb,
lib/steep/subtyping/relation.rb,
lib/steep/drivers/annotations.rb,
lib/steep/drivers/stop_server.rb,
lib/steep/signature/validator.rb,
lib/steep/daemon/configuration.rb,
lib/steep/diagnostic/signature.rb,
lib/steep/drivers/start_server.rb,
lib/steep/interface/type_param.rb,
lib/steep/server/change_buffer.rb,
lib/steep/server/lsp_formatter.rb,
lib/steep/services/file_loader.rb,
lib/steep/source/ignore_ranges.rb,
lib/steep/drivers/print_project.rb,
lib/steep/interface/method_type.rb,
lib/steep/server/custom_methods.rb,
lib/steep/server/worker_process.rb,
lib/steep/services/goto_service.rb,
lib/steep/subtyping/constraints.rb,
lib/steep/ast/types/intersection.rb,
lib/steep/interface/substitution.rb,
lib/steep/type_inference/context.rb,
lib/steep/ast/node/type_assertion.rb,
lib/steep/services/content_change.rb,
lib/steep/type_inference/type_env.rb,
lib/steep/diagnostic/lsp_formatter.rb,
lib/steep/server/type_check_worker.rb,
lib/steep/services/path_assignment.rb,
lib/steep/type_inference/case_when.rb,
lib/steep/type_inference/send_args.rb,
lib/steep/ast/annotation/collection.rb,
lib/steep/ast/node/type_application.rb,
lib/steep/ast/types/shared_instance.rb,
lib/steep/drivers/utils/jobs_option.rb,
lib/steep/server/interaction_worker.rb,
lib/steep/server/target_group_files.rb,
lib/steep/server/work_done_progress.rb,
lib/steep/services/stats_calculator.rb,
lib/steep/diagnostic/result_printer2.rb,
lib/steep/drivers/diagnostic_printer.rb,
lib/steep/services/signature_service.rb,
lib/steep/type_inference/method_call.rb,
lib/steep/drivers/utils/driver_helper.rb,
lib/steep/services/hover_provider/rbs.rb,
lib/steep/services/type_check_service.rb,
lib/steep/subtyping/variable_variance.rb,
lib/steep/type_inference/block_params.rb,
lib/steep/type_inference/constant_env.rb,
lib/steep/server/type_check_controller.rb,
lib/steep/services/completion_provider.rb,
lib/steep/services/hover_provider/ruby.rb,
lib/steep/type_inference/method_params.rb,
lib/steep/index/signature_symbol_provider.rb,
lib/steep/services/hover_provider/content.rb,
lib/steep/type_inference/type_env_builder.rb,
lib/steep/services/completion_provider/rbs.rb,
lib/steep/services/signature_help_provider.rb,
lib/steep/services/completion_provider/ruby.rb,
lib/steep/type_inference/multiple_assignment.rb,
lib/steep/server/inline_source_change_detector.rb,
lib/steep/type_inference/logic_type_interpreter.rb,
lib/steep/services/completion_provider/type_name.rb,
lib/steep/drivers/diagnostic_printer/base_formatter.rb,
lib/steep/drivers/diagnostic_printer/code_formatter.rb,
lib/steep/services/hover_provider/singleton_methods.rb,
lib/steep/diagnostic/deprecated/else_on_exhaustive_case.rb,
lib/steep/diagnostic/deprecated/unknown_constant_assigned.rb,
lib/steep/drivers/diagnostic_printer/github_actions_formatter.rb

Defined Under Namespace

Modules: AST, AnnotationsHelper, Daemon, Diagnostic, Drivers, Equatable, Index, Interface, ModuleHelper, NodeHelper, PathHelper, Server, Services, Signature, Subtyping, TypeInference Classes: AnnotationParser, CLI, Expectations, LocatedValue, Locator, Project, RakeTask, Sampler, Source, TaggedLogging, ThreadWaiter, TypeConstruction, Typing

Constant Summary collapse

VERSION =
"2.0.0.0.beta1"
InstanceMethodName =
_ = Struct.new(:type_name, :method_name, keyword_init: true) do
  # @implements InstanceMethodName
  def to_s
    "#{type_name}##{method_name}"
  end

  def relative
    InstanceMethodName.new(type_name: type_name.relative!, method_name: method_name)
  end
end
SingletonMethodName =
_ = Struct.new(:type_name, :method_name, keyword_init: true) do
  # @implements SingletonMethodName
  def to_s
    "#{type_name}.#{method_name}"
  end

  def relative
    SingletonMethodName.new(type_name: type_name.relative!, method_name: method_name)
  end
end

Class Method Summary collapse

Class Method Details

.can_fork?Boolean

Returns:

  • (Boolean)


237
238
239
240
241
242
243
244
245
246
247
# File 'lib/steep.rb', line 237

def self.can_fork?
  return @can_fork if defined?(@can_fork)

  @can_fork = begin
    pid = fork { exit!(0) }
    Process.waitpid(pid) if pid
    true
  rescue NotImplementedError
    false
  end
end

.log_error(exn, message: "Unexpected error: #{exn.inspect}") ⇒ Object



228
229
230
231
232
233
234
235
# File 'lib/steep.rb', line 228

def self.log_error(exn, message: "Unexpected error: #{exn.inspect}")
  Steep.logger.fatal message
  if backtrace = exn.backtrace
    backtrace.each do |loc|
      Steep.logger.error "  #{loc}"
    end
  end
end

.log_outputObject



187
188
189
# File 'lib/steep.rb', line 187

def self.log_output
  @log_output
end

.log_output=(output) ⇒ Object



191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
# File 'lib/steep.rb', line 191

def self.log_output=(output)
  @log_output = output

  if output.is_a?(String)
    io = File.open(output, "a")
  else
    io = output
  end

  prev_level = @logger&.level
  @logger = new_logger(io, prev_level)

  prev_level = @ui_logger&.level
  @ui_logger = new_logger(io, prev_level)

  output
end

.loggerObject



175
176
177
# File 'lib/steep.rb', line 175

def self.logger
  @logger || raise
end

.measure(message, level: :warn, threshold: 0.0) ⇒ Object



213
214
215
216
217
218
219
220
221
222
223
224
225
226
# File 'lib/steep.rb', line 213

def self.measure(message, level: :warn, threshold: 0.0)
  start = Time.now
  begin
    yield
  ensure
    time = Time.now - start
    if level.is_a?(Symbol)
      level = Logger.const_get(level.to_s.upcase)
    end
    if time > threshold
      self.logger.log(level) { "#{message} took #{time} seconds" }
    end
  end
end

.measure2(message, level: :warn) ⇒ Object



290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
# File 'lib/steep.rb', line 290

def self.measure2(message, level: :warn)
  sampler = Sampler.new
  result = yield(sampler)

  if level.is_a?(Symbol)
    level = Logger.const_get(level.to_s.upcase)
  end
  logger.log(level) { "#{sampler.total}secs for \"#{message}\"" }
  logger.log(level) { "  Average: #{sampler.average}secs"}
  logger.log(level) { "  Median: #{sampler.percentile(50)}secs"}
  logger.log(level) { "  Samples: #{sampler.count}"}
  logger.log(level) { "  99 percentile: #{sampler.percentile(99)}secs"}
  logger.log(level) { "  90 percentile: #{sampler.percentile(90)}secs"}
  logger.log(level) { "  10 Slowests:"}
  sampler.slowests(10).each do |message, time|
    logger.log(level) { "    #{message} (#{time}secs)"}
  end

  result
end

.new_logger(output, prev_level) ⇒ Object



183
184
185
# File 'lib/steep.rb', line 183

def self.new_logger(output, prev_level)
  TaggedLogging.new(output, level: prev_level || Logger::ERROR)
end

.ui_loggerObject



179
180
181
# File 'lib/steep.rb', line 179

def self.ui_logger
  @ui_logger || raise
end