1
0
mirror of https://github.com/golang/go synced 2024-10-01 03:28:32 -06:00
go/internal/lsp/cache
Muir Manders f68e2b6f23 internal/lsp: fix infinite recursion while fixing AST
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>
2019-09-19 16:27:28 +00:00
..
builtin.go internal/lsp: distinguish parse errors from actual errors 2019-09-17 21:21:32 +00:00
cache.go internal/lsp: merge session and view options into one 2019-09-11 19:36:49 +00:00
check.go internal/lsp: distinguish parse errors from actual errors 2019-09-17 21:21:32 +00:00
external.go internal/lsp: split the telemetry library out 2019-08-15 21:28:02 +00:00
file.go internal/lsp: fix deadlock in type-checking 2019-09-05 03:50:54 +00:00
gofile.go internal/lsp: remove helpers for getting packages 2019-09-17 16:23:42 +00:00
load.go internal/lsp: distinguish parse errors from actual errors 2019-09-17 21:21:32 +00:00
modfile.go internal/lsp: use x/xerrors to create new errors 2019-08-06 19:46:56 +00:00
parse.go internal/lsp: fix infinite recursion while fixing AST 2019-09-19 16:27:28 +00:00
pkg.go internal/lsp: distinguish parse errors from actual errors 2019-09-17 21:21:32 +00:00
session.go internal/lsp: use ParseGoHandles for the builtin package 2019-09-16 23:04:25 +00:00
sumfile.go internal/lsp: use x/xerrors to create new errors 2019-08-06 19:46:56 +00:00
token.go internal/lsp: unlabel context, log errors when canceled 2019-08-20 20:39:21 +00:00
view.go internal/lsp: remove helpers for getting packages 2019-09-17 16:23:42 +00:00
watcher.go internal/lsp: fix deadlocks loading lots of files at once 2019-07-03 17:22:52 +00:00