class AutoAttrInit::DetectParams

classを静的解析して、initializeのparamsを抽出する。

Public Class Methods

new(klass) click to toggle source

@param klass [Class]

# File lib/auto_attr_init/detect_params.rb, line 9
def initialize klass
  @klass = klass
end

Public Instance Methods

detect() click to toggle source

@return [Array] [param type, param name, default value|nil][]

# File lib/auto_attr_init/detect_params.rb, line 14
def detect
  initialize_method = @klass.instance_method :initialize
  if initialize_method
    params = initialize_method.parameters
    params = analyze_opt_params initialize_method, params
    params = params.select{|param| param[0] != :block }
  else
    params = []
  end
  params
end

Private Instance Methods

analyze_opt_params(method, params) click to toggle source

opt paramとkey paramのdefault値を解析し、其れを含めたparamsを返却。

# File lib/auto_attr_init/detect_params.rb, line 28
def analyze_opt_params method, params
  params_sexp = detect_params_sexp method
  params_sexp.zip params do |sexp, param|
    next unless [:opt, :key].include?(param[0])
    param << sorcerer(sexp)
  end
  params
end
detect_params_sexp(method) click to toggle source

methodの、params部のS式 (SExp) を取得する。

# File lib/auto_attr_init/detect_params.rb, line 38
def detect_params_sexp method
  params_sexp =
    Ripper.sexp_raw(method.source_code).
    find_deep{|sexp| sexp.has_method?(:[]) && sexp[0] == :params }.
    select{|sexp| sexp != nil }
  params_sexp = params_sexp[1..-1].inject [] do |accm, sexp|
    if sexp[0].is_a? Symbol
      accm << sexp
    else
      accm += sexp
    end
    accm
  end
end
sorcerer(sexp) click to toggle source

S式からsource code文字列を復元する。

# File lib/auto_attr_init/detect_params.rb, line 54
def sorcerer sexp
  Sorcerer.source sexp[1]
end