Nearly 100% accurate completion for any editors!!
by rubikitch <rubikitch@ruby-lang.org>
String completion begins with this.
# File lib/rcodetools/completion.rb, line 205 def self.run(code, opts) new(opts).completion_code(code, opts[:lineno], opts[:column]) end
# 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
# 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
# File lib/rcodetools/completion.rb, line 294 def candidates(code, lineno, column=nil) candidates_with_class(code, lineno, column)[1] end
# 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 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
# File lib/rcodetools/completion.rb, line 209 def magic_help_code(recv, meth) oneline_ize __magic_help_code("#{VAR}_result", recv, meth) end
# 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
# 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
# File lib/rcodetools/completion.rb, line 220 def split_method_info(minfo) minfo.split(/\0/,2) end