playground: show consistent formatting of errors for gofmt mode

Fixed playground for the source.Format to append prog.go before the
error. This fixes the error highlighting on the web page.

Fixes golang/go#23201
Fixes golang/go#17187

Change-Id: I72b58190eb1edaf1b79ad61b5a4530b7d4fb73ee
Reviewed-on: https://go-review.googlesource.com/99118
Reviewed-by: Andrew Bonventre <andybons@golang.org>
diff --git a/fmt.go b/fmt.go
index 571c68a..09f50f2 100644
--- a/fmt.go
+++ b/fmt.go
@@ -6,8 +6,10 @@
 
 import (
 	"encoding/json"
+	"fmt"
 	"go/format"
 	"net/http"
+	"strings"
 
 	"golang.org/x/tools/imports"
 )
@@ -24,13 +26,17 @@
 		err error
 	)
 	if r.FormValue("imports") != "" {
-		out, err = imports.Process("prog.go", in, nil)
+		out, err = imports.Process(progName, in, nil)
 	} else {
 		out, err = format.Source(in)
 	}
 	var resp fmtResponse
 	if err != nil {
 		resp.Error = err.Error()
+		// Prefix the error returned by format.Source.
+		if !strings.HasPrefix(resp.Error, progName) {
+			resp.Error = fmt.Sprintf("%v:%v", progName, resp.Error)
+		}
 	} else {
 		resp.Body = string(out)
 	}
diff --git a/sandbox.go b/sandbox.go
index cf1ea8c..dbc54f1 100644
--- a/sandbox.go
+++ b/sandbox.go
@@ -30,7 +30,12 @@
 	"github.com/bradfitz/gomemcache/memcache"
 )
 
-const maxRunTime = 2 * time.Second
+const (
+	maxRunTime = 2 * time.Second
+
+	// progName is the program name in compiler errors
+	progName = "prog.go"
+)
 
 type request struct {
 	Body string
@@ -113,9 +118,9 @@
 		if _, ok := err.(*exec.ExitError); ok {
 			// Return compile errors to the user.
 
-			// Rewrite compiler errors to refer to 'prog.go'
+			// Rewrite compiler errors to refer to progName
 			// instead of '/tmp/sandbox1234/main.go'.
-			errs := strings.Replace(string(out), in, "prog.go", -1)
+			errs := strings.Replace(string(out), in, progName, -1)
 
 			// "go build", invoked with a file name, puts this odd
 			// message before any compile errors; strip it.
@@ -285,7 +290,7 @@
 package test
 
 func main() {
-    println("test")
+	println("test")
 }
 `, want: "", errors: "package name must be main"},
 	{prog: `