类 IRB::Context

一个封装 irb 会话当前状态的类,包括 IRB.conf 的配置。

常量

KEYWORD_ALIASES

因为所有输入最终都会被评估为 Ruby 代码,所以与 Ruby 关键字冲突的命令名称需要特殊的解决方法,一旦我们为 IRB 实现了一个更好的命令系统,我们就可以删除它们。

属性

ap_name[RW]

默认 IRB.conf[:AP_NAME] 的副本

auto_indent_mode[RW]

可以是默认的 IRB.conf[:AUTO_INDENT],也可以是通过 prompt_mode= 设置的模式。

在 irb 中禁用自动缩进

IRB.conf[:AUTO_INDENT] = false

或者

irb_context.auto_indent_mode = false

或者

IRB.CurrentContext.auto_indent_mode = false

有关更多信息,请参阅 IRB 中的配置

back_trace_limit[RW]

显示为前 n 行和后 n 行的回溯行数限制。

默认值为 16。

也可以使用 --back-trace-limit 命令行选项设置。

command_aliases[RW]

用户定义的 IRB 命令别名

echo[RW]

是否将返回值回显到输出。

如果可用,使用 IRB.conf[:ECHO],否则默认为 true

puts "hello"
# hello
#=> nil
IRB.CurrentContext.echo = false
puts "omg"
# omg
echo?[RW]

是否将返回值回显到输出。

如果可用,使用 IRB.conf[:ECHO],否则默认为 true

puts "hello"
# hello
#=> nil
IRB.CurrentContext.echo = false
puts "omg"
# omg
echo_on_assignment[RW]

是否为赋值表达式回显。

如果设置为 false,则不会显示赋值的值。

如果设置为 true,则会显示赋值的值。

如果设置为 :truncate,则会显示赋值的值并截断。

默认值为 :truncate

a = "omg"
#=> omg

a = "omg" * 10
#=> omgomgomgomgomgomgomg...

IRB.CurrentContext.echo_on_assignment = false
a = "omg"

IRB.CurrentContext.echo_on_assignment = true
a = "omg" * 10
#=> omgomgomgomgomgomgomgomgomgomg

要设置在 irb 中显示赋值的行为

IRB.conf[:ECHO_ON_ASSIGNMENT] = :truncate or true or false

或者

irb_context.echo_on_assignment = :truncate or true or false

或者

IRB.CurrentContext.echo_on_assignment = :truncate or true or false
echo_on_assignment?[RW]

是否为赋值表达式回显。

如果设置为 false,则不会显示赋值的值。

如果设置为 true,则会显示赋值的值。

如果设置为 :truncate,则会显示赋值的值并截断。

默认值为 :truncate

a = "omg"
#=> omg

a = "omg" * 10
#=> omgomgomgomgomgomgomg...

IRB.CurrentContext.echo_on_assignment = false
a = "omg"

IRB.CurrentContext.echo_on_assignment = true
a = "omg" * 10
#=> omgomgomgomgomgomgomgomgomgomg

要设置在 irb 中显示赋值的行为

IRB.conf[:ECHO_ON_ASSIGNMENT] = :truncate or true or false

或者

irb_context.echo_on_assignment = :truncate or true or false

或者

IRB.CurrentContext.echo_on_assignment = :truncate or true or false
eval_history[R]

命令结果历史记录限制。此方法在 eval_history= 被调用并传入非空值(直接或通过在 .irbrc 中设置 IRB.conf[:EVAL_HISTORY])之前不可用。

extra_doc_dirs[RW]

指定要显示在文档对话框中的 ri 文件的安装位置。

ignore_eof[RW]

是否忽略 ^Dcontrol-d)。

如果设置为 false^D 将退出 irb。

ignore_eof?[RW]

是否忽略 ^Dcontrol-d)。

如果设置为 false^D 将退出 irb。

ignore_sigint[RW]

是否忽略 ^Ccontrol-c)。

如果设置为 false^C 将退出 irb。

如果设置为 true

  • 在输入期间:取消输入,然后返回到顶层。

  • 在执行期间:放弃当前执行。

ignore_sigint?[RW]

是否忽略 ^Ccontrol-c)。

如果设置为 false^C 将退出 irb。

如果设置为 true

  • 在输入期间:取消输入,然后返回到顶层。

  • 在执行期间:放弃当前执行。

inspect_mode[R]

默认 IRB.conf[:INSPECT_MODE] 的副本。

io[RW]

当前输入方法。

可以是 StdioInputMethodReadlineInputMethodRelineInputMethodFileInputMethod 或在创建上下文时指定的其他方法。有关 input_method 的更多信息,请参见 ::new

irb[RW]

当前 irb 会话。

irb_name[RW]

可以是 IRB.conf[:IRB_NAME] 中的名称,也可以是 JobManager 设置的当前作业编号,例如 irb#2

irb_path[RW]

可以是 irb_name 括号包围,也可以是传递给 Context.newinput_method

last_value[R]

最后执行语句的返回值。

load_modules[RW]

默认 IRB.conf[:LOAD_MODULES] 的副本。

newline_before_multiline_output[RW]

是否在多行输出之前添加换行符。

如果可用,使用 IRB.conf[:NEWLINE_BEFORE_MULTILINE_OUTPUT],否则默认为 true

"abc\ndef"
#=>
abc
def
IRB.CurrentContext.newline_before_multiline_output = false
"abc\ndef"
#=> abc
def
newline_before_multiline_output?[RW]

是否在多行输出之前添加换行符。

如果可用,使用 IRB.conf[:NEWLINE_BEFORE_MULTILINE_OUTPUT],否则默认为 true

"abc\ndef"
#=>
abc
def
IRB.CurrentContext.newline_before_multiline_output = false
"abc\ndef"
#=> abc
def
prompt_c[RW]

IRB 继续语句的提示符。(例如,紧接在 if 之后)

有关更多信息,请参阅 自定义提示符

prompt_i[RW]

标准 IRB 提示符。

有关更多信息,请参阅 自定义提示符

prompt_mode[R]

默认 IRB.conf[:PROMPT_MODE] 的副本。

prompt_s[RW]

IRB 继续字符串的提示符。

有关更多信息,请参阅 自定义提示符

rc[RW]

默认 IRB.conf[:RC] 的副本。

rc?[RW]

默认 IRB.conf[:RC] 的副本。

return_format[RW]

返回值语句的格式,由 prompt_mode= 使用传递给设置当前 prompt_modemode 中的 :RETURN 设置。

thread[R]

此上下文中的当前线程。

use_autocomplete[R]

是否启用颜色。

默认 IRB.conf[:USE_AUTOCOMPLETE] 的副本。

use_autocomplete?[R]

是否启用颜色。

默认 IRB.conf[:USE_AUTOCOMPLETE] 的副本。

use_multiline[R]

是否启用多行编辑器模式。

默认 IRB.conf[:USE_MULTILINE] 的副本。

use_multiline?[R]

是否启用多行编辑器模式。

默认 IRB.conf[:USE_MULTILINE] 的副本。

use_readline[R]

是否启用单行编辑器模式。

默认 IRB.conf[:USE_SINGLELINE] 的副本。

use_readline?[R]

是否启用单行编辑器模式。

默认 IRB.conf[:USE_SINGLELINE] 的副本。

use_reline[R]

是否启用多行编辑器模式。

默认 IRB.conf[:USE_MULTILINE] 的副本。

use_reline?[R]

是否启用多行编辑器模式。

默认 IRB.conf[:USE_MULTILINE] 的副本。

use_singleline[R]

是否启用单行编辑器模式。

默认 IRB.conf[:USE_SINGLELINE] 的副本。

use_singleline?[R]

是否启用单行编辑器模式。

默认 IRB.conf[:USE_SINGLELINE] 的副本。

use_tracer[R]

在当前上下文中评估语句时是否使用 Tracer。

有关更多信息,请参阅 lib/tracer.rb

use_tracer?[R]

在当前上下文中评估语句时是否使用 Tracer。

有关更多信息,请参阅 lib/tracer.rb

verbose[RW]

是否显示详细消息。

默认 IRB.conf[:VERBOSE] 的副本

with_debugger[RW]
workspace[RW]

当前上下文中的 WorkSpace

workspace_home[R]

顶层工作区,请参阅 home_workspace

公共类方法

new(irb, workspace = nil, input_method = nil) 点击切换源代码

创建一个新的 IRB 上下文。

可选的 input_method 参数

nil

使用 stdin 或 RelineReadline

String

使用 File

其他

使用它作为 InputMethod

# File lib/irb/context.rb, line 23
    def initialize(irb, workspace = nil, input_method = nil)
      @irb = irb
      if workspace
        @workspace = workspace
      else
        @workspace = WorkSpace.new
      end
      @thread = Thread.current

      # copy of default configuration
      @ap_name = IRB.conf[:AP_NAME]
      @rc = IRB.conf[:RC]
      @load_modules = IRB.conf[:LOAD_MODULES]

      if IRB.conf.has_key?(:USE_SINGLELINE)
        @use_singleline = IRB.conf[:USE_SINGLELINE]
      elsif IRB.conf.has_key?(:USE_READLINE) # backward compatibility
        @use_singleline = IRB.conf[:USE_READLINE]
      else
        @use_singleline = nil
      end
      if IRB.conf.has_key?(:USE_MULTILINE)
        @use_multiline = IRB.conf[:USE_MULTILINE]
      elsif IRB.conf.has_key?(:USE_RELINE) # backward compatibility
        warn <<~MSG.strip
          USE_RELINE is deprecated, please use USE_MULTILINE instead.
        MSG
        @use_multiline = IRB.conf[:USE_RELINE]
      elsif IRB.conf.has_key?(:USE_REIDLINE)
        warn <<~MSG.strip
          USE_REIDLINE is deprecated, please use USE_MULTILINE instead.
        MSG
        @use_multiline = IRB.conf[:USE_REIDLINE]
      else
        @use_multiline = nil
      end
      @use_autocomplete = IRB.conf[:USE_AUTOCOMPLETE]
      @verbose = IRB.conf[:VERBOSE]
      @io = nil

      self.inspect_mode = IRB.conf[:INSPECT_MODE]
      self.use_tracer = IRB.conf[:USE_TRACER] if IRB.conf[:USE_TRACER]
      self.use_loader = IRB.conf[:USE_LOADER] if IRB.conf[:USE_LOADER]
      self.eval_history = IRB.conf[:EVAL_HISTORY] if IRB.conf[:EVAL_HISTORY]

      @ignore_sigint = IRB.conf[:IGNORE_SIGINT]
      @ignore_eof = IRB.conf[:IGNORE_EOF]

      @back_trace_limit = IRB.conf[:BACK_TRACE_LIMIT]

      self.prompt_mode = IRB.conf[:PROMPT_MODE]

      if IRB.conf[:SINGLE_IRB] or !defined?(IRB::JobManager)
        @irb_name = IRB.conf[:IRB_NAME]
      else
        @irb_name = IRB.conf[:IRB_NAME]+"#"+IRB.JobManager.n_jobs.to_s
      end
      @irb_path = "(" + @irb_name + ")"

      case input_method
      when nil
        @io = nil
        case use_multiline?
        when nil
          if STDIN.tty? && IRB.conf[:PROMPT_MODE] != :INF_RUBY && !use_singleline?
            # Both of multiline mode and singleline mode aren't specified.
            @io = RelineInputMethod.new(build_completor)
          else
            @io = nil
          end
        when false
          @io = nil
        when true
          @io = RelineInputMethod.new(build_completor)
        end
        unless @io
          case use_singleline?
          when nil
            if (defined?(ReadlineInputMethod) && STDIN.tty? &&
                IRB.conf[:PROMPT_MODE] != :INF_RUBY)
              @io = ReadlineInputMethod.new
            else
              @io = nil
            end
          when false
            @io = nil
          when true
            if defined?(ReadlineInputMethod)
              @io = ReadlineInputMethod.new
            else
              @io = nil
            end
          else
            @io = nil
          end
        end
        @io = StdioInputMethod.new unless @io

      when '-'
        @io = FileInputMethod.new($stdin)
        @irb_name = '-'
        @irb_path = '-'
      when String
        @io = FileInputMethod.new(input_method)
        @irb_name = File.basename(input_method)
        @irb_path = input_method
      else
        @io = input_method
      end
      @extra_doc_dirs = IRB.conf[:EXTRA_DOC_DIRS]

      @echo = IRB.conf[:ECHO]
      if @echo.nil?
        @echo = true
      end

      @echo_on_assignment = IRB.conf[:ECHO_ON_ASSIGNMENT]
      if @echo_on_assignment.nil?
        @echo_on_assignment = :truncate
      end

      @newline_before_multiline_output = IRB.conf[:NEWLINE_BEFORE_MULTILINE_OUTPUT]
      if @newline_before_multiline_output.nil?
        @newline_before_multiline_output = true
      end

      @user_aliases = IRB.conf[:COMMAND_ALIASES].dup
      @command_aliases = @user_aliases.merge(KEYWORD_ALIASES)
    end

公共实例方法

__exit__(ret = 0)
别名:exit
_set_last_value(value)

请参阅 set_last_value

别名:set_last_value
change_workspace(*_main) 点击切换源代码

将当前工作区更改为给定对象或绑定。

如果省略可选参数,则工作区将是 home_workspace,它从 TOPLEVEL_BINDING 或主对象 IRB.conf[:MAIN_CONTEXT](当 irb 初始化时)继承而来。

有关更多信息,请参阅 IRB::WorkSpace.new

# File lib/irb/ext/change-ws.rb, line 26
def change_workspace(*_main)
  if _main.empty?
    @workspace = home_workspace
    return main
  end

  @workspace = WorkSpace.new(_main[0])

  if !(class<<main;ancestors;end).include?(ExtendCommandBundle)
    main.extend ExtendCommandBundle
  end
end
eval_history=(no) 点击切换源代码

设置命令结果历史记录限制。默认值从 IRB.conf[:EVAL_HISTORY] 设置。

noIntegernil

如果历史记录项的数量大于 0,则返回 no

如果 no 为 0,则历史记录项的数量不受限制。

如果 nonil,则不使用执行结果历史记录(默认值)。

EvalHistory 值可通过 __ 变量访问,请参阅 IRB::EvalHistory

# File lib/irb/ext/eval_history.rb, line 45
def eval_history=(no)
  if no
    if defined?(@eval_history) && @eval_history
      @eval_history_values.size(no)
    else
      @eval_history_values = EvalHistory.new(no)
      IRB.conf[:__TMP__EHV__] = @eval_history_values
      @workspace.evaluate("__ = IRB.conf[:__TMP__EHV__]")
      IRB.conf.delete(:__TMP_EHV__)
    end
  else
    @eval_history_values = nil
  end
  @eval_history = no
end
exit(ret = 0) 点击切换源代码

退出当前会话,请参阅 IRB.irb_exit

调用超类方法 Kernel#exit
# File lib/irb/context.rb, line 578
def exit(ret = 0)
  IRB.irb_exit(@irb, ret)
rescue UncaughtThrowError
  super
end
也称为:__exit__
file_input?() 点击切换源代码

是否 io 使用 File 作为创建当前上下文时传递的 input_method,请参阅 ::new

# File lib/irb/context.rb, line 487
def file_input?
  @io.class == FileInputMethod
end
history_file() 点击切换源代码

默认 IRB.conf[:HISTORY_FILE] 的副本

# File lib/irb/context.rb, line 206
def history_file
  IRB.conf[:HISTORY_FILE]
end
history_file=(hist) 点击切换源代码

Set IRB.conf[:HISTORY_FILE] 设置为给定的 hist

# File lib/irb/context.rb, line 211
def history_file=(hist)
  IRB.conf[:HISTORY_FILE] = hist
end
home_workspace() 点击切换源代码

继承自 TOPLEVEL_BINDING

# File lib/irb/ext/change-ws.rb, line 11
def home_workspace
  if defined? @home_workspace
    @home_workspace
  else
    @home_workspace = @workspace
  end
end
inspect?() 点击切换源代码

是否设置了 inspect_mode,请参阅 inspect_mode= 以了解更多详细信息。

# File lib/irb/context.rb, line 481
def inspect?
  @inspect_mode.nil? or @inspect_mode
end
inspect_mode=(opt) 点击切换源代码

使用 opt 指定检查模式

true

显示 inspect

false

显示 to_s

nil

非数学模式下的检查模式,数学模式下的非检查模式

有关更多信息,请参阅 IRB::Inspector

也可以使用 --inspect--noinspect 命令行选项设置。

# File lib/irb/context.rb, line 502
def inspect_mode=(opt)

  if i = Inspector::INSPECTORS[opt]
    @inspect_mode = opt
    @inspect_method = i
    i.init
  else
    case opt
    when nil
      if Inspector.keys_with_inspector(Inspector::INSPECTORS[true]).include?(@inspect_mode)
        self.inspect_mode = false
      elsif Inspector.keys_with_inspector(Inspector::INSPECTORS[false]).include?(@inspect_mode)
        self.inspect_mode = true
      else
        puts "Can't switch inspect mode."
        return
      end
    when /^\s*\{.*\}\s*$/
      begin
        inspector = eval "proc#{opt}"
      rescue Exception
        puts "Can't switch inspect mode(#{opt})."
        return
      end
      self.inspect_mode = inspector
    when Proc
      self.inspect_mode = IRB::Inspector(opt)
    when Inspector
      prefix = "usr%d"
      i = 1
      while Inspector::INSPECTORS[format(prefix, i)]; i += 1; end
      @inspect_mode = format(prefix, i)
      @inspect_method = opt
      Inspector.def_inspector(format(prefix, i), @inspect_method)
    else
      puts "Can't switch inspect mode(#{opt})."
      return
    end
  end
  print "Switch to#{unless @inspect_mode; ' non';end} inspect mode.\n" if verbose?
  @inspect_mode
end
irb_level() 点击切换源代码

当前 WorkSpace 堆栈的大小

# File lib/irb/ext/workspaces.rb, line 11
def irb_level
  workspace_stack.size
end
main() 点击切换源代码

顶层工作区,参见 WorkSpace#main

# File lib/irb/context.rb, line 216
def main
  @workspace.main
end
pop_workspace() 点击切换源代码

从当前 workspaces 栈中移除最后一个元素并返回它,如果当前工作区栈为空则返回 nil

另请参见 push_workspace

# File lib/irb/ext/workspaces.rb, line 52
def pop_workspace
  if workspaces.empty?
    print "workspace stack empty\n"
    return
  end
  @workspace = workspaces.pop
end
prompt_mode=(mode) 点击切换源代码

设置此上下文中的提示符的 mode

有关更多信息,请参阅 自定义提示符

# File lib/irb/context.rb, line 465
def prompt_mode=(mode)
  @prompt_mode = mode
  pconf = IRB.conf[:PROMPT][mode]
  @prompt_i = pconf[:PROMPT_I]
  @prompt_s = pconf[:PROMPT_S]
  @prompt_c = pconf[:PROMPT_C]
  @return_format = pconf[:RETURN]
  @return_format = "%s\n" if @return_format == nil
  if ai = pconf.include?(:AUTO_INDENT)
    @auto_indent_mode = ai
  else
    @auto_indent_mode = IRB.conf[:AUTO_INDENT]
  end
end
prompt_n() 点击切换源代码

TODO: 开发 v2.0 时删除此项

# File lib/irb/context.rb, line 279
def prompt_n
  warn "IRB::Context#prompt_n is deprecated and will be removed in the next major release."
  ""
end
prompt_n=(_) 点击切换源代码

TODO: 开发 v2.0 时删除此项

# File lib/irb/context.rb, line 285
def prompt_n=(_)
  warn "IRB::Context#prompt_n= is deprecated and will be removed in the next major release."
  ""
end
prompting?() 点击切换源代码

是否 verbose?true,并且 input_methodStdioInputMethodRelineInputMethodReadlineInputMethod,有关更多信息,请参见 io

# File lib/irb/context.rb, line 446
def prompting?
  verbose? || (STDIN.tty? && @io.kind_of?(StdioInputMethod) ||
               @io.kind_of?(RelineInputMethod) ||
               (defined?(ReadlineInputMethod) && @io.kind_of?(ReadlineInputMethod)))
end
push_workspace(*_main) 点击切换源代码

使用给定的对象或绑定创建一个新的工作区,并将其追加到当前 workspaces 栈中。

有关更多信息,请参见 IRB::Context#change_workspaceIRB::WorkSpace.new

# File lib/irb/ext/workspaces.rb, line 29
def push_workspace(*_main)
  if _main.empty?
    if workspaces.empty?
      print "No other workspace\n"
      return nil
    end
    ws = workspaces.pop
    workspaces.push @workspace
    @workspace = ws
    return workspaces
  end

  workspaces.push @workspace
  @workspace = WorkSpace.new(@workspace.binding, _main[0])
  if !(class<<main;ancestors;end).include?(ExtendCommandBundle)
    main.extend ExtendCommandBundle
  end
end
save_history() 点击切换源代码
# File lib/irb/context.rb, line 201
def save_history
  IRB.conf[:SAVE_HISTORY]
end
save_history=(val) 点击切换源代码
# File lib/irb/context.rb, line 197
def save_history=(val)
  IRB.conf[:SAVE_HISTORY] = val
end
set_last_value(value) 点击切换源代码

将此上下文中最后一个执行语句的返回值设置为 last_value

# File lib/irb/context.rb, line 457
def set_last_value(value)
  @last_value = value
  @workspace.local_variable_set :_, value
end
也称为:_set_last_value
symbol_alias?(command) 点击切换源代码

如果它是从参数别名而来且不是标识符,则返回 true。

# File lib/irb/context.rb, line 616
def symbol_alias?(command)
  return nil if command.match?(/\A\w+\z/)
  command_aliases.key?(command.to_sym)
end
transform_args?(command) 点击切换源代码

如果命令支持转换参数,则返回 true。

# File lib/irb/context.rb, line 622
def transform_args?(command)
  command = command_aliases.fetch(command.to_sym, command)
  ExtendCommandBundle.load_command(command)&.respond_to?(:transform_args)
end
use_loader() 点击切换源代码

返回 irb 的文件读取器方法是否被 load/require 使用。

此模式在全局范围内生效(整个 irb)。

# File lib/irb/ext/use-loader.rb, line 37
def use_loader
  IRB.conf[:USE_LOADER]
end
也称为:use_loader?
use_loader=(opt) 点击切换源代码

设置 IRB.conf[:USE_LOADER]

有关更多信息,请参阅 use_loader

# File lib/irb/ext/use-loader.rb, line 47
def use_loader=(opt)

  if IRB.conf[:USE_LOADER] != opt
    IRB.conf[:USE_LOADER] = opt
    if opt
      if !$".include?("irb/cmd/load")
      end
      (class<<@workspace.main;self;end).instance_eval {
        alias_method :load, :irb_load
        alias_method :require, :irb_require
      }
    else
      (class<<@workspace.main;self;end).instance_eval {
        alias_method :load, :__original__load__IRB_use_loader__
        alias_method :require, :__original__require__IRB_use_loader__
      }
    end
  end
  print "Switch to load/require#{unless use_loader; ' non';end} trace mode.\n" if verbose?
  opt
end
use_loader?()
别名:use_loader
use_tracer=(opt) 点击切换源代码
# File lib/irb/ext/tracer.rb, line 13
def use_tracer=(opt)
  # do nothing
end
verbose?() 点击切换源代码

返回是否显示消息。

# File lib/irb/context.rb, line 427
def verbose?
  if @verbose.nil?
    if @io.kind_of?(RelineInputMethod)
      false
    elsif defined?(ReadlineInputMethod) && @io.kind_of?(ReadlineInputMethod)
      false
    elsif !STDIN.tty? or @io.kind_of?(FileInputMethod)
      true
    else
      false
    end
  else
    @verbose
  end
end
workspaces() 点击切换源代码

当前堆栈中的工作区

# File lib/irb/ext/workspaces.rb, line 16
def workspaces
  if defined? @workspaces
    @workspaces
  else
    @workspaces = []
  end
end

私有实例方法

build_completor() 点击切换源代码
# File lib/irb/context.rb, line 164
        def build_completor
  completor_type = IRB.conf[:COMPLETOR]
  case completor_type
  when :regexp
    return RegexpCompletor.new
  when :type
    completor = build_type_completor
    return completor if completor
  else
    warn "Invalid value for IRB.conf[:COMPLETOR]: #{completor_type}"
  end
  # Fallback to RegexpCompletor
  RegexpCompletor.new
end
build_type_completor() 点击切换源代码
# File lib/irb/context.rb, line 179
        def build_type_completor
  if RUBY_ENGINE == 'truffleruby'
    # Avoid SynatxError. truffleruby does not support endless method definition yet.
    warn 'TypeCompletor is not supported on TruffleRuby yet'
    return
  end

  begin
    require 'repl_type_completor'
  rescue LoadError => e
    warn "TypeCompletor requires `gem repl_type_completor`: #{e.message}"
    return
  end

  ReplTypeCompletor.preload_rbs
  TypeCompletor.new(self)
end