class Rcodetools::XMPCompletionFilter

Nearly 100% accurate completion for any editors!!

by rubikitch <rubikitch@ruby-lang.org>

Attributes

candidates_with_description_flag[RW]
prefix[R]

String completion begins with this.

Public Class Methods

run(code, opts) click to toggle source
# File lib/rcodetools/completion.rb, line 205
def self.run(code, opts)
  new(opts).completion_code(code, opts[:lineno], opts[:column])
end

Public Instance Methods

___prepare_line(recv, all_completion_expr) click to toggle source
# File lib/rcodetools/completion.rb, line 273
  def ___prepare_line(recv, all_completion_expr)
    v = "#{VAR}"
    rcv = "#{VAR}_recv"
    idx = 1
    oneline_ize("#{rcv} = (#{recv})
#{v} = (#{all_completion_expr}).map{|x| x.to_s}.grep(/^#{Regexp.quote(@prefix)}/)
#{rcv} = Module === #{rcv} ? #{rcv} : #{rcv}.class
$stderr.puts("#{MARKER}[#{idx}] => " + #{rcv}.to_s  + " " + #{v}.join(" ")) || #{v}
exit
")
  end
__prepare_line(recv, all_completion_expr, all_completion_expr_verbose) click to toggle source
# File lib/rcodetools/completion.rb, line 264
def __prepare_line(recv, all_completion_expr, all_completion_expr_verbose)
  if self.class.candidates_with_description_flag
    ___prepare_line(recv, all_completion_expr_verbose.gsub(/%n/, '('+all_completion_expr+')'))
  else
    ___prepare_line(recv, all_completion_expr) 
  end

end
candidates(code, lineno, column=nil) click to toggle source
# File lib/rcodetools/completion.rb, line 294
def candidates(code, lineno, column=nil)
  candidates_with_class(code, lineno, column)[1]
end
candidates_with_class(code, lineno, column=nil) click to toggle source
# File lib/rcodetools/completion.rb, line 286
def candidates_with_class(code, lineno, column=nil)
  klass, methods = runtime_data_with_class(code, lineno, column) rescue ["", ""]
  raise NoCandidates, "No candidates." if methods.nil? or methods.empty?
  [klass, methods.split(/ /).sort]
end
completion_code(code, lineno, column=nil) click to toggle source

Completion code for editors.

# File lib/rcodetools/completion.rb, line 299
def completion_code(code, lineno, column=nil)
  candidates(code, lineno, column).join("\n") rescue "\n"
end
magic_help_code(recv, meth) click to toggle source
# File lib/rcodetools/completion.rb, line 209
def magic_help_code(recv, meth)
  oneline_ize __magic_help_code("#{VAR}_result", recv, meth)
end
methods_map_code(recv) click to toggle source
# File lib/rcodetools/completion.rb, line 213
def methods_map_code(recv)
  # delimiter is \0
  m = "#{VAR}_m"
  mhc = magic_help_code((recv), m)
  %Q[map{|%s| "\#{%s}\\0" + %s}] % [m, m, mhc]
end
prepare_line(expr, column) click to toggle source
# File lib/rcodetools/completion.rb, line 224
def prepare_line(expr, column)
  set_expr_and_postfix!(expr, column){|c| /^.{#{c}}/ }
  @prefix = expr
  case expr
  when /^\$\w*$/              # global variable
    __prepare_line 'nil', 'global_variables', '%n'
  when /^@@\w*$/              # class variable
    __prepare_line 'nil', 'Module === self ? class_variables : self.class.class_variables', '%n'
  when /^@\w*$/               # instance variable
    __prepare_line 'nil', 'instance_variables', '%n'
  when /^([A-Z].*)::([^.]*)$/    # nested constants / class methods
    @prefix = $2
    __prepare_line $1, "#$1.constants | #$1.methods(true)",
    %Q[#$1.constants + #$1.methods(true).#{methods_map_code($1)}]
  when /^[A-Z]\w*$/           # normal constants
    __prepare_line 'nil', 'Module.constants', '%n'
  when /^(.*::.+)\.(.*)$/       # toplevel class methods
    @prefix = $2
    __prepare_line $1, "#$1.methods",
    %Q[%n.#{methods_map_code($1)}]
  when /^(::.+)::(.*)$/       # toplevel nested constants
    @prefix = $2
    __prepare_line $1, "#$1.constants | #$1.methods",
    %Q[#$1.constants + #$1.methods.#{methods_map_code($1)}]
  when /^::(.*)/              # toplevel constant
    @prefix = $1
    __prepare_line 'nil', 'Object.constants', '%n'
  when /^(:[^:.]*)$/          # symbol
    __prepare_line 'nil', 'Symbol.all_symbols.map{|s| ":" + s.id2name}', '%n'
  when /\.([^.]*)$/           # method call
    @prefix = $1
    recv = Regexp.last_match.pre_match
    __prepare_line recv, "(#{recv}).methods(true)",
    %Q[%n.#{methods_map_code(recv)}]
  else                        # bare words
    __prepare_line 'self', "methods | private_methods | local_variables | self.class.constants",
    %Q[(methods | private_methods).#{methods_map_code('self')} + local_variables | self.class.constants]
  end
end
split_method_info(minfo) click to toggle source
# File lib/rcodetools/completion.rb, line 220
def split_method_info(minfo)
  minfo.split(/\0/,2)
end