in go/tools/gopackagesdriver/packageregistry.go [89:137]
func (pr *PackageRegistry) Match(patterns ...string) ([]string, []*FlatPackage) {
roots := map[string]struct{}{}
for _, pattern := range patterns {
if pattern == "." || pattern == "./..." {
for _, pkg := range pr.packagesByImportPath {
if strings.HasPrefix(pkg.ID, "//") {
roots[pkg.ID] = struct{}{}
}
}
} else if strings.HasSuffix(pattern, "/...") {
pkgPrefix := strings.TrimSuffix(pattern, "/...")
for _, pkg := range pr.packagesByImportPath {
if pkgPrefix == pkg.PkgPath || strings.HasPrefix(pkg.PkgPath, pkgPrefix+"/") {
roots[pkg.ID] = struct{}{}
}
}
} else if pattern == "builtin" || pattern == "std" {
for _, pkg := range pr.packagesByImportPath {
if pkg.Standard {
roots[pkg.ID] = struct{}{}
}
}
} else if strings.HasPrefix(pattern, "file=") {
f := ensureAbsolutePathFromWorkspace(strings.TrimPrefix(pattern, "file="))
if pkg, ok := pr.packagesByFile[f]; ok {
roots[pkg.ID] = struct{}{}
}
} else {
if pkg, ok := pr.packagesByImportPath[pattern]; ok {
roots[pkg.ID] = struct{}{}
}
}
}
walkedPackages := map[string]*FlatPackage{}
retRoots := make([]string, 0, len(roots))
for rootPkg := range roots {
retRoots = append(retRoots, rootPkg)
pr.walk(walkedPackages, rootPkg)
}
retPkgs := make([]*FlatPackage, 0, len(walkedPackages))
for _, pkg := range walkedPackages {
retPkgs = append(retPkgs, pkg)
}
return retRoots, retPkgs
}