如何使用解析器gem来提取我想要的代码片段?

我偶然发现了这个Parsergem 。

我想要做的是从长文件中提取一个特定的方法。

一个例子是来自Rails的has_many方法:

  def has_many(name, scope = nil, options = {}, &extension) reflection = Builder::HasMany.build(self, name, scope, options, &extension) Reflection.add_reflection self, name, reflection end 

唯一的问题是,我需要能够提取同一方法的另一个版本(从较早的时间开始),这更加冗长和复杂。 那个版本看起来像这样:

 def has_many(association_id, options = {}) validate_options([ :foreign_key, :class_name, :exclusively_dependent, :dependent, :conditions, :order, :finder_sql ], options.keys) association_name, association_class_name, association_class_primary_key_name = associate_identification(association_id, options[:class_name], options[:foreign_key]) require_association_class(association_class_name) if options[:dependent] and options[:exclusively_dependent] raise ArgumentError, ':dependent and :exclusively_dependent are mutually exclusive options. You may specify one or the other.' # ' ruby-mode elsif options[:dependent] module_eval "before_destroy '#{association_name}.each { |o| o.destroy }'" elsif options[:exclusively_dependent] module_eval "before_destroy { |record| #{association_class_name}.delete_all(%(#{association_class_primary_key_name} = '\#{record.id}')) }" end define_method(association_name) do |*params| force_reload = params.first unless params.empty? association = instance_variable_get("@#{association_name}") if association.nil? association = HasManyAssociation.new(self, association_name, association_class_name, association_class_primary_key_name, options) instance_variable_set("@#{association_name}", association) end association.reload if force_reload association end # deprecated api deprecated_collection_count_method(association_name) deprecated_add_association_relation(association_name) deprecated_remove_association_relation(association_name) deprecated_has_collection_method(association_name) deprecated_find_in_collection_method(association_name) deprecated_find_all_in_collection_method(association_name) deprecated_create_method(association_name) deprecated_build_method(association_name) end 

那么如何使用该gem成功提取这两种方法呢?

Gem的自述文件对于完成解析 – 新手并不是非常友好。