internal/lsp: in gc_details change command to use a temporary file.

https://go-review.googlesource.com/c/tools/+/246419/2 fixed a problem
but introduced a new one, as go build treats -o directories differently
depending on whether or not a main package is being built.
(see  https://github.com/golang/go/issues/36784)

This change explicitly constructs a temporary file for go build
to use.

Change-Id: I096748e9af5014428dab8a5aad703f062fe88d50
Reviewed-on: https://go-review.googlesource.com/c/tools/+/247899
Run-TryBot: Peter Weinberger <pjw@google.com>
Reviewed-by: Pontus Leitzler <leitzler@gmail.com>
Reviewed-by: Rebecca Stambler <rstambler@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
diff --git a/internal/lsp/source/gc_annotations.go b/internal/lsp/source/gc_annotations.go
index 82ad2bc..4eb4faf 100644
--- a/internal/lsp/source/gc_annotations.go
+++ b/internal/lsp/source/gc_annotations.go
@@ -23,11 +23,16 @@
 	if err := os.MkdirAll(outDir, 0700); err != nil {
 		return nil, err
 	}
+	tmpFile, err := ioutil.TempFile(os.TempDir(), "gopls-x")
+	if err != nil {
+		return nil, err
+	}
+	defer os.Remove(tmpFile.Name())
 	args := []string{fmt.Sprintf("-gcflags=-json=0,%s", outDir),
-		fmt.Sprintf("-o=%s", pkgDir.Filename()),
+		fmt.Sprintf("-o=%s", tmpFile.Name()),
 		pkgDir.Filename(),
 	}
-	err := snapshot.RunGoCommandDirect(ctx, "build", args)
+	err = snapshot.RunGoCommandDirect(ctx, "build", args)
 	if err != nil {
 		return nil, err
 	}