我最近一直在玩flog,这非常好
用于生成ruby应用程序代码复杂性报告的工具。由于跑步
项目代码库上的flog
可以获得类似于此的输出:
1272.3: flog total
7.3: flog/method average
62.2: MyClass#foobar lib/myclass#foobar:123
... more similar lines ...
上面的示例提供了方法的分数,并引用了精确的行号 定义该方法的源代码。这可以是常规实例/类 方法或任何其他“动态”方法,例如。耙任务等。
因此,目标是从源代码中提取一段代码(很可能是一种方法)
以flog输出中定义的行号开头的文件。那片段就可以了
在某些Web UI中用于显示各种代码指标(基于flay
等其他工具)
和/或存储在数据库中。据我所知,此任务涉及解析ruby
将代码转换为AST,然后通过树查找相应的起始行和
搞清楚终点行号。我已经用这个库做了一些实验 - https://github.com/whitequark/parser,大部分时间都在工作,但它有点棘手
得到一个正确的结果。
是否还有其他解决方案可以从写入的源文件中快速提取方法代码 在红宝石?
答案 0 :(得分:4)
您可以实现按名称或行号查找方法的功能。
此示例代码显示如何按名称查找方法代码。它很脏,但它可以工作(在Ruby 2.1.2上)。这使用parser
(gem install parser
)。
# method_finder.rb
require 'parser'
require 'parser/current'
class MethodFinder
def initialize(filename)
@ast = parse(filename)
end
def find(method_name)
recursive_search_ast(@ast, method_name)
return @method_source
end
private
def parse(filename)
Parser::CurrentRuby.parse(File.open(filename, "r").read)
end
def recursive_search_ast(ast, method_name)
ast.children.each do |child|
if child.class.to_s == "Parser::AST::Node"
if (child.type.to_s == "def" or child.type.to_s == "defs") and (child.children[0].to_s == method_name or child.children[1].to_s == method_name)
@method_source = child.loc.expression.source
else
recursive_search_ast(child, method_name)
end
end
end
end
end
您可以使用下面的MethodFinder
。
mf = MethodFinder.new("./method_finder.rb")
puts mf.find("find")
=> def find(method_name)
=> recursive_search_ast(@ast, method_name)
=> return @method_source
=> end