imports: fix reading from stdin on Windows

Don't panic when reading from stdin on Windows. This is a regression
from https://golang.org/cl/43454

Also fix some weird behavior with stdin processing I noticed during
reviewing the code: don't allow the -w (write) flag, and adust the
filename shown with the -d (diff) flag.

Fixes golang/go#20941

Change-Id: I73d0a1dc74c919238a3bb72823585bbf1b7daba1
Reviewed-on: https://go-review.googlesource.com/47810
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Brad Jones <rbjones@google.com>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
diff --git a/cmd/goimports/goimports.go b/cmd/goimports/goimports.go
index b722c6a..16e3083 100644
--- a/cmd/goimports/goimports.go
+++ b/cmd/goimports/goimports.go
@@ -144,12 +144,19 @@
 			fmt.Fprintln(out, filename)
 		}
 		if *write {
+			if argType == fromStdin {
+				// filename is "<standard input>"
+				return errors.New("can't use -w on stdin")
+			}
 			err = ioutil.WriteFile(filename, res, 0)
 			if err != nil {
 				return err
 			}
 		}
 		if *doDiff {
+			if argType == fromStdin {
+				filename = "stdin.go" // because <standard input>.orig looks silly
+			}
 			data, err := diff(src, res, filename)
 			if err != nil {
 				return fmt.Errorf("computing diff: %s", err)
diff --git a/imports/fix.go b/imports/fix.go
index f26414a..ac7f4b0 100644
--- a/imports/fix.go
+++ b/imports/fix.go
@@ -254,10 +254,12 @@
 	results := make(chan result)
 	for pkgName, symbols := range refs {
 		go func(pkgName string, symbols map[string]bool) {
-			sibling := packageInfo.Imports[pkgName]
-			if sibling.Path != "" {
-				results <- result{ipath: sibling.Path, name: sibling.Alias}
-				return
+			if packageInfo != nil {
+				sibling := packageInfo.Imports[pkgName]
+				if sibling.Path != "" {
+					results <- result{ipath: sibling.Path, name: sibling.Alias}
+					return
+				}
 			}
 			ipath, rename, err := findImport(pkgName, symbols, filename)
 			r := result{ipath: ipath, err: err}
diff --git a/imports/fix_test.go b/imports/fix_test.go
index 2026d5c..ffab390 100644
--- a/imports/fix_test.go
+++ b/imports/fix_test.go
@@ -1803,3 +1803,14 @@
 		}
 	}
 }
+
+// Issue 20941: this used to panic on Windows.
+func TestProcessStdin(t *testing.T) {
+	got, err := Process("<standard input>", []byte("package main\nfunc main() {\n\tfmt.Println(123)\n}\n"), nil)
+	if err != nil {
+		t.Fatal(err)
+	}
+	if !strings.Contains(string(got), `"fmt"`) {
+		t.Errorf("expected fmt import; got: %s", got)
+	}
+}