mirror of
https://github.com/golang/go
synced 2024-11-19 09:54:49 -07:00
f68e2b6f23
We were recursing infinitely in cases like this: switch true { case true: go foo.F<> } There were three things that came together to cause this: 1. We recently starting recursively fixing broken go/defer statements. 2. In this case we were failing to swap in the correct ast.Node in for the *ast.BadStmt because we were only looking for *ast.BlockStmt (and *ast.CaseStmt has no block). 3. After 2), we weren't returning an error so the fix() code thought it should recurse. Fix 2) by using reflection to swap AST nodes in a generic way. Perhaps a bit overkill in this case, but I happened to have already written this for an upcoming change, so I just pulled it in to fix this bug. Fix 3) by returning an error if we fail to swap the AST nodes. Fixes golang/go#34353. Change-Id: I17ff1afd52ae165c0ba9de5820dcec4cb7d756cb Reviewed-on: https://go-review.googlesource.com/c/tools/+/196137 Run-TryBot: Rebecca Stambler <rstambler@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Rebecca Stambler <rstambler@golang.org>
26 lines
461 B
Go
26 lines
461 B
Go
package badstmt
|
|
|
|
import (
|
|
"golang.org/x/tools/internal/lsp/foo"
|
|
)
|
|
|
|
func _() {
|
|
defer foo.F //@complete(" //", Foo),diag(" //", "LSP", "function must be invoked in defer statement")
|
|
y := 1
|
|
defer foo.F //@complete(" //", Foo)
|
|
}
|
|
|
|
func _() {
|
|
switch true {
|
|
case true:
|
|
go foo.F //@complete(" //", Foo)
|
|
}
|
|
}
|
|
|
|
func _() {
|
|
defer func() {
|
|
foo.F //@complete(" //", Foo),snippet(" //", Foo, "Foo()", "Foo()")
|
|
foo. //@complete(" //", Foo, IntFoo, StructFoo)
|
|
}
|
|
}
|