如何在VSCode中导航到Ruby/RSpec `shared_examples`?

izj3ouym  于 2023-04-11  发布在  Ruby
关注(0)|答案(1)|浏览(103)

在使用VSCode的Ruby/RSpec中,假设我有一个shared_examples

shared_examples "foo bar" do |blah|
   ...
end

那么如果我在别的地方

it_should_behave_like 'foo bar', blah do

我希望能够把我的光标放在那一行,并使用“转到定义”功能(F12左右)转到shared_examples代码。
我已经安装了'Ruby','Ruby Solargraph'和'VSCode Ruby'扩展,但无法正常工作。但是对于普通的Ruby函数和类,'Go to Definition'可以工作。
我目前的解决方法是搜索“foo bar”,然后在搜索结果中找到并单击shared_examples,但这效率很低。
有人知道如何在VSCode中实现这一点吗?像这样的代码浏览在RubyMine中是可能的...

uqxowvwt

uqxowvwt1#

简短的回答是(目前)不可能(因为还没有人编写该扩展)。
长的答案是。。
“Go to Definition”需要知道代码的结构才能工作。通常,这是通过解析代码中的文件来查找类和方法的定义来完成的。但是...
Ruby是一种动态语言,这意味着你可以在运行时使用元编程来改变程序的结构。因此,并不总是可以查看磁盘上的文件并确定函数的位置。事实上,它可能根本不存在。代码可能在运行时定义它。
RSpec广泛使用元编程。这就是允许它调用共享示例的原因,只需使用字符串即可找到它。因此,当您调用this时:

shared_examples "foo bar" do
  ...
end

Ruby调用了一个名为shared_examples的方法,该方法的名称为("foo bar"),块为(do ... end)。在该方法中,RSpec使用名称作为键在注册表中注册该块(可能是一个哈希)。
所以,当你称之为:

it_should_behave_like "foo bar" do
  ...
end

RSpec在调用shared_examples之前,需要通过字符串"foo bar"来查找调用shared_examples所定义的块。因此,共享的示例在磁盘上从来没有真正作为一个具有def foo_bar定义的实际方法存在。这意味着读取Ruby文件并将其转换为可单击方法定义的通用工具永远不会找到这个方法。
唉,我们需要一个RSpec特定的插件来遵循一个共享的例子。我不知道任何这样的插件的时刻。
下面是RSpec的源代码。

相关问题