x/tools/gopls:在命名参数上查找所有引用应显示返回值

g6ll5ycj  于 6个月前  发布在  Go
关注(0)|答案(4)|浏览(47)

您的功能请求是否与问题相关?请描述。

在使用 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 中显示返回行。

omtl5h9j

omtl5h9j1#

嗯,这是一个有趣的想法。既然这是gopls的功能请求,我会将其转移到Go问题跟踪器。
@adonovan和我讨论过的一个扩展是“查找引用”,以查找变量的所有分配(这是我经常想要的)。这可以作为分析的一部分。

kd3sttzy

kd3sttzy2#

当前的悬停功能几乎完全实现了这个功能:如果你将光标定位在函数返回类型元素内,它会高亮显示函数体中所有相应的返回操作数。反之,如果你将光标定位在一个返回操作数上,它会高亮显示所有其他操作数以及函数返回类型的相应元素。无论返回变量是否命名,该功能都能正常工作。

6pp0gazn

6pp0gazn3#

在语法中还有其他一些地方可以在没有标识符的情况下隐式引用,最明显的例子是S{x}是对结构体S的字段的隐式引用。但事情变得模糊了:如果return 1是对命名结果变量的赋值,那么f(1)是否不是对参数变量的赋值?(关于别名呢?给定ptr := &x,*ptr = 1是对x的赋值吗?)
让FindAllReferences返回隐式引用可能会让人感到困惑,而且我不认为这是值得做的,因为上面提到的悬停功能为解决眼前的问题提供了一个简单的解决方案。

fwzugrvs

fwzugrvs4#

这似乎是对microsoft/language-server-protocol#1911的隐式请求,也就是说,能够请求各种"类似引用"的东西,这些都是使用相同的UI呈现的。

相关问题