var (
_ ImportPathError = (*importError)(nil)
+ _ ImportPathError = (*mainPackageError)(nil)
_ ImportPathError = (*modload.ImportMissingError)(nil)
_ ImportPathError = (*modload.ImportMissingSumError)(nil)
_ ImportPathError = (*modload.DirectImportFromImplicitDependencyError)(nil)
// mainPackagesOnly filters out non-main packages matched only by arguments
// containing "..." and returns the remaining main packages.
//
-// mainPackagesOnly sets a package's error if it is named by a literal argument.
+// mainPackagesOnly sets a non-main package's Error field and returns it if it
+// is named by a literal argument.
//
// mainPackagesOnly prints warnings for non-literal arguments that only match
// non-main packages.
}
}
- mainPkgs := make([]*Package, 0, len(pkgs))
+ matchedPkgs := make([]*Package, 0, len(pkgs))
mainCount := make([]int, len(patterns))
nonMainCount := make([]int, len(patterns))
for _, pkg := range pkgs {
if pkg.Name == "main" {
- mainPkgs = append(mainPkgs, pkg)
+ matchedPkgs = append(matchedPkgs, pkg)
for i := range patterns {
if matchers[i] != nil && matchers[i](pkg.ImportPath) {
mainCount[i]++
}
} else {
for i := range patterns {
- if matchers[i] == nil && patterns[i] == pkg.ImportPath && pkg.Error == nil {
- pkg.Error = &PackageError{Err: ImportErrorf(pkg.ImportPath, "package %s is not a main package", pkg.ImportPath)}
+ if matchers[i] == nil && patterns[i] == pkg.ImportPath {
+ if pkg.Error == nil {
+ pkg.Error = &PackageError{Err: &mainPackageError{importPath: pkg.ImportPath}}
+ }
+ matchedPkgs = append(matchedPkgs, pkg)
} else if matchers[i] != nil && matchers[i](pkg.ImportPath) {
nonMainCount[i]++
}
}
}
- return mainPkgs
+ return matchedPkgs
+}
+
+type mainPackageError struct {
+ importPath string
+}
+
+func (e *mainPackageError) Error() string {
+ return fmt.Sprintf("package %s is not a main package", e.importPath)
+}
+
+func (e *mainPackageError) ImportPath() string {
+ return e.importPath
}
func setToolFlags(pkgs ...*Package) {
}
}
+ if opts.MainOnly && pkg.Name != "main" && pkg.Error == nil {
+ pkg.Error = &PackageError{Err: &mainPackageError{importPath: pkg.ImportPath}}
+ }
setToolFlags(pkg)
return pkg
for i < len(args) && strings.HasSuffix(args[i], ".go") {
i++
}
+ pkgOpts := load.PackageOpts{MainOnly: true}
var p *load.Package
if i > 0 {
files := args[:i]
base.Fatalf("go run: cannot run *_test.go files (%s)", file)
}
}
- p = load.GoFilesPackage(ctx, load.PackageOpts{}, files)
+ p = load.GoFilesPackage(ctx, pkgOpts, files)
} else if len(args) > 0 && !strings.HasPrefix(args[0], "-") {
arg := args[0]
- pkgOpts := load.PackageOpts{MainOnly: true}
var pkgs []*load.Package
if strings.Contains(arg, "@") && !build.IsLocalImport(arg) && !filepath.IsAbs(arg) {
var err error
base.Fatalf("go run: no go files listed")
}
cmdArgs := args[i:]
- if p.Name != "main" {
- base.Fatalf("go run: cannot run non-main package")
- }
load.CheckPackageErrors([]*load.Package{p})
p.Internal.OmitDebug = true