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