您的功能请求是否与问题相关?请描述。
在使用 Find All References
时,我希望找到所有变量被使用或赋值的引用。
如果我使用了命名返回参数,那么最终的返回值不会包含在引用中。
x := func() (other string) {
defer func() {
fmt.Println("I got: " + other)
}()
other = "abc"
return "def"
}
xx := x()
fmt.Println(xx)
在上面的代码中搜索变量 other
将无法给我最终的 def
使用情况。
描述您希望的解决方案
请在 References 中显示返回行。
4条答案
按热度按时间omtl5h9j1#
嗯,这是一个有趣的想法。既然这是gopls的功能请求,我会将其转移到Go问题跟踪器。
@adonovan和我讨论过的一个扩展是“查找引用”,以查找变量的所有分配(这是我经常想要的)。这可以作为分析的一部分。
kd3sttzy2#
当前的悬停功能几乎完全实现了这个功能:如果你将光标定位在函数返回类型元素内,它会高亮显示函数体中所有相应的返回操作数。反之,如果你将光标定位在一个返回操作数上,它会高亮显示所有其他操作数以及函数返回类型的相应元素。无论返回变量是否命名,该功能都能正常工作。
6pp0gazn3#
在语法中还有其他一些地方可以在没有标识符的情况下隐式引用,最明显的例子是S{x}是对结构体S的字段的隐式引用。但事情变得模糊了:如果return 1是对命名结果变量的赋值,那么f(1)是否不是对参数变量的赋值?(关于别名呢?给定
ptr := &x
,*ptr = 1
是对x的赋值吗?)让FindAllReferences返回隐式引用可能会让人感到困惑,而且我不认为这是值得做的,因为上面提到的悬停功能为解决眼前的问题提供了一个简单的解决方案。
fwzugrvs4#
这似乎是对microsoft/language-server-protocol#1911的隐式请求,也就是说,能够请求各种"类似引用"的东西,这些都是使用相同的UI呈现的。