Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从基于Ruby的源文件中提取代码片段_Ruby_Parsing_Abstract Syntax Tree_Code Complexity - Fatal编程技术网

从基于Ruby的源文件中提取代码片段

从基于Ruby的源文件中提取代码片段,ruby,parsing,abstract-syntax-tree,code-complexity,Ruby,Parsing,Abstract Syntax Tree,Code Complexity,我最近一直在玩,这是个不错的游戏 用于生成ruby应用程序代码复杂性报告的工具。由于跑步 flog在项目代码库上,您会得到一个类似以下内容的输出: 1272.3: flog total 7.3: flog/method average 62.2: MyClass#foobar lib/myclass#foobar:123 ... more similar lines ... 上面的示例提供了方法的分数,并引用了 定义该方法的源代码。这可能是一个常规实例/类 方法

我最近一直在玩,这是个不错的游戏 用于生成ruby应用程序代码复杂性报告的工具。由于跑步
flog
在项目代码库上,您会得到一个类似以下内容的输出:

  1272.3: flog total
     7.3: flog/method average

    62.2: MyClass#foobar lib/myclass#foobar:123
    ... more similar lines ...
上面的示例提供了方法的分数,并引用了 定义该方法的源代码。这可能是一个常规实例/类 方法或任何其他“动态”方法,如rake任务等

所以目标是从源代码中提取一段代码(很可能是一个方法) 以flog输出中定义的行号开头的文件。那一段话就可以了 可以在某些web UI中使用,以显示各种代码度量(基于其他工具,如
flay
) 和/或存储在数据库中。据我所知,这项任务涉及解析ruby 将代码转换成AST,然后遍历树以找到相应的起始行和 算出终点线号码。我已经用这个库做了一些实验-,大部分时间都有效,但要想实现它有点困难 得到正确的结果

有没有其他解决方案可以从编写的源文件中快速提取方法代码
在ruby?

中,您可以实现按名称或行号查找方法的功能

此示例代码显示如何按名称查找方法代码。它是脏的,但可以工作(在Ruby 2.1.2上)。这将使用
解析器
gem安装解析器

您可以像下面这样使用
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

您可以实现按名称或行号查找方法的功能

此示例代码显示如何按名称查找方法代码。它是脏的,但可以工作(在Ruby 2.1.2上)。这将使用
解析器
gem安装解析器

您可以像下面这样使用
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

谢谢,我实现了一个非常类似的解决方案,除了我按行号匹配块,而不是方法名。谢谢,我实现了一个非常类似的解决方案,除了我按行号匹配块,而不是方法名。