func()

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
}