x/tools/gopls: 如果 err != nil,提取函数是不规范的

f8rj6qna  于 7个月前  发布在  Go
关注(0)|答案(1)|浏览(76)

gopls版本

golang.org/x/tools/gopls v0.15.2

go env

.

你做了什么?

// selection start// selection end 包围的代码块上执行提取函数代码操作。

func F() error {
	// selection start
	a, err := json.Marshal(0)
	if err != nil {
		return fmt.Errorf("1: %w", err)
	}
	b, err := json.Marshal(0)
	if err != nil {
		return fmt.Errorf("2: %w", err)
	}
	// selection end
	fmt.Println(a, b)
	return nil
}

你看到了什么?

func F() error {
	// selection start
	a, b, shouldReturn, returnValue := newFunction()
	if shouldReturn {
		return returnValue
	}
	// selection end
	fmt.Println(a, b)
	return nil
}

func newFunction() ([]byte, []byte, bool, error) {
	a, err := json.Marshal(0)
	if err != nil {
		return nil, nil, true, fmt.Errorf("2: %w", err)
	}
	b, err := json.Marshal(0)
	if err != nil {
		return nil, nil, true, fmt.Errorf("2: %w", err)
	}
	return a, b, false, nil
}

你期望看到什么?

func F() error {
	// selection start
	a, b, err := newFunction()
	if err != nil {
		return err
	}
	// selection end
	fmt.Println(a, b)
	return nil
}

func newFunction() ([]byte, []byte, error) {
	a, err := json.Marshal(0)
	if err != nil {
		return nil, nil, fmt.Errorf("2: %w", err)
	}
	b, err := json.Marshal(0)
	if err != nil {
		return nil, nil, fmt.Errorf("2: %w", err)
	}
	return a, b, nil
}

启发式方法是当选择中的每个返回语句都是错误处理返回时的特殊情况。详细启发式:
让 f 成为作用域中具有错误返回值作为最后一个返回值的函数。特殊情况是,如果每个返回语句的形式为 return zeros..., expr,其中 expr 是已知的非空值。在这种情况下,修改后的调用站点为 values..., err := newFunction(...); if err != nil { return zeros..., err },提取的函数应在此末尾添加一个 return values..., nil
此重构将返回与之前相同的值,因为当它确实返回时,值是正确的,而当它确实不返回时,if err != nil 将确保不会执行 return 语句。

编辑器和设置

  • 无响应*

日志

  • 无响应*
niknxzdl

niknxzdl1#

同意。我们正在努力改进重构,并将修复这个问题。

相关问题