x/tools/gopls: 语法错误导致补全失败

brvekthn  于 6个月前  发布在  Go
关注(0)|答案(7)|浏览(42)

你正在使用的Go版本、VS Code和VS Code Go扩展的版本是什么?

  • 运行go version以获取Go的版本
  • go version go1.14.3 darwin/amd64
  • 运行code -vcode-insiders -v以获取VS Code或VS Code Insiders的版本
  • 1.46.0
  • a5d1cc28bb5da32ec67e86cc50f84c67cc690321
  • x64
  • 检查已安装的扩展以获取VS Code Go扩展的版本
  • 0.14.4

完整代码:

package main

import "fmt"

type result struct {
	value interface{}
	err   error
}

func getResult() (interface{}, error) {
	return "test", nil
}

func main() {
	var res result
	res.value, res.err = getResult()
	fmt.Println(res)
}

当我输入"res."时,我希望出现"err"。
但现在代码补全停止工作了,我不得不手动输入"err"。
请修复这个bug,谢谢。

vnjpjtjt

vnjpjtjt1#

另一个问题:当我在这里输入tab时,我希望出现"getResult()",但现在只出现了"getResult"。

8yparm6h

8yparm6h2#

感谢您的报错报告。
您能否运行 Preferences: Open Settings (JSON) 命令和 Preferences: Open Workspace Settings (JSON),并与 go.["go"]gopls 前缀共享所有设置?

elcex8rz

elcex8rz3#

"files.autoSave": "afterDelay",
    "files.autoSaveDelay": 300,
    "[golang]": {
        "editor.tabSize": 4,
        "editor.detectIndentation": false,
        "editor.insertSpaces": false,
    },
    "go.delveConfig": {
        "dlvLoadConfig": {
            "followPointers": true,
            "maxVariableRecurse": 1,
            "maxStringLen": 100000,
            "maxArrayValues": 1000,
            "maxStructFields": -1
        },
        "apiVersion": 2,
        "showGlobalVariables": true
    },
    "go.formatTool": "goimports",
    "go.useLanguageServer": true,
    "go.testFlags": [
        "-v"
    ],
    "go.languageServerFlags": [
        "-rpc.trace",
    ],
    "[go]": {
        "editor.formatOnSave": true,
        "editor.codeActionsOnSave": {
            "source.organizeImports": true,
        },
    },
    "[go.mod]": {
        "editor.formatOnSave": true,
        "editor.codeActionsOnSave": {
            "source.organizeImports": true,
        },
    },
    "gopls": {
        "usePlaceholders": true,
        "completeUnimported": true
    },
koaltpgm

koaltpgm5#

感谢@kzhui125!
/cc @stamblerre 你能帮忙看一下并在gopls问题追踪器中进行分类吗?这个问题讨论了两个症状,我想底层问题与#38600相似。

  1. 缺失补全。
  2. 尽管选择了"usePlaceholders": true,但仍然缺失()
anhgbhbe

anhgbhbe6#

刚刚看了一下。与其他许多可以通过改进解析器错误恢复来解决的完成问题不同,我认为这不能仅靠go/parser来实现。没有明显的方法将这种(无效)语法表示为有效的语法树。
也许我们可以有一些基本的回退机制,在标识符上查找前一个选择器,然后在适当的范围内评估该标识符。我不确定这种技术能推广到多大程度,所以我不确定它是否值得去做。

mwyxok5s

mwyxok5s7#

我预计这种情况非常常见,因此在gopl的附加恢复(fixAST)中值得特别处理。在上面的示例中,序列[period, newline, "outdent"]是一个很好的迹象,表明当前行不完整。它可以修复为SelectorExpr(Ident("res"), Ident(""))

相关问题