class Rcodetools::XMPDocFilter

Public Class Methods

new(opts = {}) click to toggle source
Calls superclass method
# File lib/rcodetools/doc.rb, line 9
def initialize(opts = {})
  super
  @filename = opts[:filename]
  extend UseMethodAnalyzer if opts[:use_method_analyzer]
end
run(code, opts) click to toggle source
# File lib/rcodetools/doc.rb, line 15
def self.run(code, opts)
  new(opts).doc(code, opts[:lineno], opts[:column])
end

Public Instance Methods

__prepare_line(x) click to toggle source
# File lib/rcodetools/doc.rb, line 49
  def __prepare_line(x)
    v = "#{VAR}"
    result = "#{VAR}_result"
    klass = "#{VAR}_klass"
    flag = "#{VAR}_flag"
    which_methods = "#{VAR}_methods"
    ancestor_class = "#{VAR}_ancestor_class"
    idx = 1
    recv = x[:recv] || x[:klass] || raise(ArgumentError, "need :recv or :klass")
    meth = x[:meth_or_constant] || x[:meth]
    debugprint "recv=#{recv}", "meth=#{meth}"
    if meth
      # imported from fastri/MagicHelp
      code = <<-EOC
#{v} = (#{recv})
$stderr.print("#{MARKER}[#{idx}] => " + #{v}.class.to_s  + " ")

if Module === #{v} and '#{meth}' =~ /^[A-Z]/ and #{v}.const_defined?('#{meth}')
  #{result} = #{v}.to_s + "::#{meth}"
else
  #{__magic_help_code result, v, meth.dump}
end

$stderr.puts(#{result})
exit
      EOC
    else
      code = <<-EOC
#{v} = (#{recv})
$stderr.print("#{MARKER}[#{idx}] => " + #{v}.class.to_s  + " ")
$stderr.puts(#{v}.to_s)
exit
      EOC
    end
    oneline_ize(code)
  end
_doc(code, lineno, column) click to toggle source

overridable by module

# File lib/rcodetools/doc.rb, line 87
def _doc(code, lineno, column)
end
doc(code, lineno, column=nil) click to toggle source
# File lib/rcodetools/doc.rb, line 90
def doc(code, lineno, column=nil)
  _doc(code, lineno, column) or runtime_data(code, lineno, column).to_s
end
prepare_line(expr, column) click to toggle source
# File lib/rcodetools/doc.rb, line 19
def prepare_line(expr, column)
  set_expr_and_postfix!(expr, column){|c| 
    withop_re = /^.{#{c-1}}[#{OPERATOR_CHARS}]+/
    if expr =~ withop_re
      withop_re
    else
      /^.{#{c}}[\w#{OPERATOR_CHARS}]*/
    end
  }
  recv = expr

  # When expr already knows receiver and method,
  return(__prepare_line :recv => expr.eval_string, :meth => expr.meth) if expr.eval_string

  case expr
  when /^(?:::)?([A-Z].*)(?:::|\.)(.*)$/    # nested constants / class methods
    __prepare_line :klass => $1, :meth_or_constant => $2
  when /^(?:::)?[A-Z]/               # normal constants
    __prepare_line :klass => expr
  when /\.([^.]*)$/             # method call
    __prepare_line :recv => Regexp.last_match.pre_match, :meth => $1
  when /^(.+)(\[\]=?)$/                   # [], []=
    __prepare_line :recv => $1, :meth => $2
  when /[#{OPERATOR_CHARS}]+$/                   # operator
    __prepare_line :recv => Regexp.last_match.pre_match, :meth => $&
  else                        # bare words
    __prepare_line :recv => "self", :meth => expr
  end
end