Module: Steep

Defined in:
lib/steep.rb,
lib/steep/cli.rb,
lib/steep/source.rb,
lib/steep/typing.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/drivers/check.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/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/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/signature/validator.rb,
lib/steep/diagnostic/signature.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/services/type_name_completion.rb,
lib/steep/index/signature_symbol_provider.rb,
lib/steep/type_inference/type_env_builder.rb,
lib/steep/services/signature_help_provider.rb,
lib/steep/type_inference/multiple_assignment.rb,
lib/steep/type_inference/logic_type_interpreter.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

Defined Under Namespace

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

Constant Summary collapse

VERSION =
"1.9.4"
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

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



220
221
222
223
224
225
226
227
# File 'lib/steep.rb', line 220

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



185
186
187
# File 'lib/steep.rb', line 185

def self.log_output
  @log_output
end

.log_output=(output) ⇒ Object



189
190
191
192
193
194
195
196
197
198
199
# File 'lib/steep.rb', line 189

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

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

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

  output
end

.loggerObject



161
162
163
# File 'lib/steep.rb', line 161

def self.logger
  @logger || raise
end

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



205
206
207
208
209
210
211
212
213
214
215
216
217
218
# File 'lib/steep.rb', line 205

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



270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
# File 'lib/steep.rb', line 270

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



169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
# File 'lib/steep.rb', line 169

def self.new_logger(output, prev_level)
  logger = Logger.new(output)
  logger.formatter = proc do |severity, datetime, progname, msg|
    # @type var severity: String
    # @type var datetime: Time
    # @type var progname: untyped
    # @type var msg: untyped
    # @type block: String
    "#{datetime.strftime('%Y-%m-%d %H:%M:%S.%L')}: #{severity}: #{msg}\n"
  end
  ActiveSupport::TaggedLogging.new(logger).tap do |logger|
    logger.push_tags "Steep #{VERSION}"
    logger.level = prev_level || Logger::ERROR
  end
end

.ui_loggerObject



165
166
167
# File 'lib/steep.rb', line 165

def self.ui_logger
  @ui_logger || raise
end