RubyMine:列出文件中调用的所有方法?

dvtswwa3  于 2023-08-04  发布在  Ruby
关注(0)|答案(2)|浏览(103)

我想得到一个在给定文件中调用的所有方法的列表。为了澄清,我指的不是更常见的任务,即找到特定 * 方法的所有用法。相反,我想收集 * 任何 * 方法的所有唯一名称,这些方法在文件中通过名称显式调用。我知道RubyMine可以检测文件代码中的实体是否是方法调用,那么RubyMine有没有办法给予我一个文件中调用的所有方法的列表?

luaexgnf

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

ast = RubyVM::AbstractSyntaxTree.parse_file('test.rb')
#=> #<RubyVM::AbstractSyntaxTree::Node:SCOPE@1:0-8:22>


返回的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


这应该让你开始编写自己的方法调用提取器。

qacovj5a

qacovj5a2#

这在RubyMine中是不可能的。其中一个选项是使用parse tree并获取其中所有方法的列表。

相关问题