]> Cypherpunks.ru repositories - gostls13.git/blobdiff - src/cmd/go/internal/test/testflag.go
[dev.fuzz] all: merge master (65f0d24) into dev.fuzz
[gostls13.git] / src / cmd / go / internal / test / testflag.go
index e3eca9249be859cf71a78a355b75f659d627c2a6..aca0dbd67b4988f1e2d646ddb411547f27ca6c12 100644 (file)
@@ -5,6 +5,10 @@
 package test
 
 import (
+       "cmd/go/internal/base"
+       "cmd/go/internal/cfg"
+       "cmd/go/internal/cmdflag"
+       "cmd/go/internal/work"
        "errors"
        "flag"
        "fmt"
@@ -13,11 +17,6 @@ import (
        "strconv"
        "strings"
        "time"
-
-       "cmd/go/internal/base"
-       "cmd/go/internal/cfg"
-       "cmd/go/internal/cmdflag"
-       "cmd/go/internal/work"
 )
 
 //go:generate go run ./genflags.go
@@ -29,6 +28,7 @@ import (
 
 func init() {
        work.AddBuildFlags(CmdTest, work.OmitVFlag)
+       base.AddWorkfileFlag(&CmdTest.Flag)
 
        cf := CmdTest.Flag
        cf.BoolVar(&testC, "c", false, "")
@@ -137,6 +137,7 @@ type outputdirFlag struct {
 func (f *outputdirFlag) String() string {
        return f.abs
 }
+
 func (f *outputdirFlag) Set(value string) (err error) {
        if value == "" {
                f.abs = ""
@@ -145,6 +146,7 @@ func (f *outputdirFlag) Set(value string) (err error) {
        }
        return err
 }
+
 func (f *outputdirFlag) getAbs() string {
        if f.abs == "" {
                return base.Cwd()
@@ -153,8 +155,12 @@ func (f *outputdirFlag) getAbs() string {
 }
 
 // vetFlag implements the special parsing logic for the -vet flag:
-// a comma-separated list, with a distinguished value "off" and
-// a boolean tracking whether it was set explicitly.
+// a comma-separated list, with distinguished values "all" and
+// "off", plus a boolean tracking whether it was set explicitly.
+//
+// "all" is encoded as vetFlag{true, false, nil}, since it will
+// pass no flags to the vet binary, and by default, it runs all
+// analyzers.
 type vetFlag struct {
        explicit bool
        off      bool
@@ -162,7 +168,10 @@ type vetFlag struct {
 }
 
 func (f *vetFlag) String() string {
-       if f.off {
+       switch {
+       case !f.off && !f.explicit && len(f.flags) == 0:
+               return "all"
+       case f.off:
                return "off"
        }
 
@@ -177,32 +186,38 @@ func (f *vetFlag) String() string {
 }
 
 func (f *vetFlag) Set(value string) error {
-       if value == "" {
+       switch {
+       case value == "":
                *f = vetFlag{flags: defaultVetFlags}
                return nil
-       }
-
-       if value == "off" {
-               *f = vetFlag{
-                       explicit: true,
-                       off:      true,
-               }
-               return nil
-       }
-
-       if strings.Contains(value, "=") {
+       case strings.Contains(value, "="):
                return fmt.Errorf("-vet argument cannot contain equal signs")
-       }
-       if strings.Contains(value, " ") {
+       case strings.Contains(value, " "):
                return fmt.Errorf("-vet argument is comma-separated list, cannot contain spaces")
        }
        *f = vetFlag{explicit: true}
+       var single string
        for _, arg := range strings.Split(value, ",") {
-               if arg == "" {
+               switch arg {
+               case "":
                        return fmt.Errorf("-vet argument contains empty list element")
+               case "all":
+                       single = arg
+                       *f = vetFlag{explicit: true}
+                       continue
+               case "off":
+                       single = arg
+                       *f = vetFlag{
+                               explicit: true,
+                               off:      true,
+                       }
+                       continue
                }
                f.flags = append(f.flags, "-"+arg)
        }
+       if len(f.flags) > 1 && single != "" {
+               return fmt.Errorf("-vet does not accept %q in a list with other analyzers", single)
+       }
        return nil
 }