我想得到一个在给定文件中调用的所有方法的列表。为了澄清,我指的不是更常见的任务,即找到特定 * 方法的所有用法。相反,我想收集 * 任何 * 方法的所有唯一名称,这些方法在文件中通过名称显式调用。我知道RubyMine可以检测文件代码中的实体是否是方法调用,那么RubyMine有没有办法给予我一个文件中调用的所有方法的列表?
luaexgnf1#
我试图找到显式写入给定文件的代码文本中的方法调用,因此与运行时无关假设我们有这个示例文件:(代码没有任何意义,但其语法是有效的)
# test.rb # 1 class MyClass # 2 def my_method # 3 foo # 4 self.bar # 5 baz(1) # 6 1 + 2 # 7 end # 8 end # 9
字符串对于静态代码分析,可以使用Ruby的AbstractSyntaxTree:
AbstractSyntaxTree
ast = RubyVM::AbstractSyntaxTree.parse_file('test.rb') #=> #<RubyVM::AbstractSyntaxTree::Node:SCOPE@1:0-8:22>
型返回的Node有一个children方法,可用于遍历语法树。根节点的类型为SCOPE,它表示词法范围。您正在查找的节点类型可能是:
Node
children
SCOPE
VCALL
CALL
FCALL
OPCALL
下面是一个非常简单的解析器:
def each_call(node, &block) return unless node.is_a?(RubyVM::AbstractSyntaxTree::Node) case node.type when :VCALL, :FCALL block.call(node.type, node.children[0], node.first_lineno) when :CALL, :OPCALL block.call(node.type, node.children[1], node.first_lineno) end node.children.each { |child_node| each_call(child_node, &block) } end
型使用方法:
each_call(ast) do |type, name, lineno| puts "#{type}: `#{name}' on line #{lineno}" end
型输出量:
VCALL: `foo' on line 4 CALL: `bar' on line 5 FCALL: `baz' on line 6 OPCALL: `+' on line 7
型这应该让你开始编写自己的方法调用提取器。
qacovj5a2#
这在RubyMine中是不可能的。其中一个选项是使用parse tree并获取其中所有方法的列表。
2条答案
按热度按时间luaexgnf1#
我试图找到显式写入给定文件的代码文本中的方法调用,因此与运行时无关
假设我们有这个示例文件:(代码没有任何意义,但其语法是有效的)
字符串
对于静态代码分析,可以使用Ruby的
AbstractSyntaxTree
:型
返回的
Node
有一个children
方法,可用于遍历语法树。根节点的类型为SCOPE
,它表示词法范围。您正在查找的节点类型可能是:
VCALL
-一个没有接收者或参数的方法调用CALL
-带有显式接收器的方法调用FCALL
-带参数的方法调用OPCALL
-使用运算符的方法调用下面是一个非常简单的解析器:
型
使用方法:
型
输出量:
型
这应该让你开始编写自己的方法调用提取器。
qacovj5a2#
这在RubyMine中是不可能的。其中一个选项是使用parse tree并获取其中所有方法的列表。