)]}'
{
  "commit": "f68e2b6f23fce7189ab5957dc378c5a068c1325f",
  "tree": "6d94db6a511467f4c518f2d068bd9b61ba0f09d4",
  "parents": [
    "7460b8e10b7e52d99c584c90f012aa07828f5d81"
  ],
  "author": {
    "name": "Muir Manders",
    "email": "muir@mnd.rs",
    "time": "Tue Sep 17 21:20:55 2019 -0700"
  },
  "committer": {
    "name": "Rebecca Stambler",
    "email": "rstambler@golang.org",
    "time": "Thu Sep 19 16:27:28 2019 +0000"
  },
  "message": "internal/lsp: fix infinite recursion while fixing AST\n\nWe were recursing infinitely in cases like this:\n\nswitch true {\ncase true:\n\tgo foo.F\u003c\u003e\n}\n\nThere were three things that came together to cause this:\n1. We recently starting recursively fixing broken go/defer statements.\n2. In this case we were failing to swap in the correct ast.Node in for\n   the *ast.BadStmt because we were only looking\n   for *ast.BlockStmt (and *ast.CaseStmt has no block).\n3. After 2), we weren\u0027t returning an error so the fix() code thought\n   it should recurse.\n\nFix 2) by using reflection to swap AST nodes in a generic way. Perhaps\na bit overkill in this case, but I happened to have already written\nthis for an upcoming change, so I just pulled it in to fix this bug.\n\nFix 3) by returning an error if we fail to swap the AST nodes.\n\nFixes golang/go#34353.\n\nChange-Id: I17ff1afd52ae165c0ba9de5820dcec4cb7d756cb\nReviewed-on: https://go-review.googlesource.com/c/tools/+/196137\nRun-TryBot: Rebecca Stambler \u003crstambler@golang.org\u003e\nTryBot-Result: Gobot Gobot \u003cgobot@golang.org\u003e\nReviewed-by: Rebecca Stambler \u003crstambler@golang.org\u003e\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "537460aa0b2a6166dbd033b7c023926ff130a067",
      "old_mode": 33188,
      "old_path": "internal/lsp/cache/parse.go",
      "new_id": "724746ae423a8cf3b4e83b30e7ba8cb8cc631fb7",
      "new_mode": 33188,
      "new_path": "internal/lsp/cache/parse.go"
    },
    {
      "type": "modify",
      "old_id": "3aae7db6793bf1ac524bd1150ac65ea88db8e7ef",
      "old_mode": 33188,
      "old_path": "internal/lsp/testdata/badstmt/badstmt.go.in",
      "new_id": "05b2c9a38d0a33ca2db3b73b61d7ee3680ba20a1",
      "new_mode": 33188,
      "new_path": "internal/lsp/testdata/badstmt/badstmt.go.in"
    },
    {
      "type": "modify",
      "old_id": "97e57095c3c8ce7d59ca6f24bcce64b53ca367f9",
      "old_mode": 33188,
      "old_path": "internal/lsp/tests/tests.go",
      "new_id": "85e54fe4ba8c9ba9ade91301f2ba70e350ad2b0b",
      "new_mode": 33188,
      "new_path": "internal/lsp/tests/tests.go"
    }
  ]
}
