// processGolistOverlay provides rudimentary support for adding // files that don't exist on disk to an overlay. The results can be // sometimes incorrect. // TODO(matloob): Handle unsupported cases, including the following: // - determining the correct package to add given a new import path func (state *golistState) processGolistOverlay(response *responseDeduper) (modifiedPkgs, needPkgs []string, err error) { … } // resolveImport finds the ID of a package given its import path. // In particular, it will find the right vendored copy when in GOPATH mode. func (state *golistState) resolveImport(sourceDir, importPath string) (string, error) { … } func hasTestFiles(p *Package) bool { … } // determineRootDirs returns a mapping from absolute directories that could // contain code to their corresponding import path prefixes. func (state *golistState) determineRootDirs() (map[string]string, error) { … } func (state *golistState) determineRootDirsModules() (map[string]string, error) { … } func (state *golistState) determineRootDirsGOPATH() (map[string]string, error) { … } func extractImports(filename string, contents []byte) ([]string, error) { … } // reclaimPackage attempts to reuse a package that failed to load in an overlay. // // If the package has errors and has no Name, GoFiles, or Imports, // then it's possible that it doesn't yet exist on disk. func reclaimPackage(pkg *Package, id string, filename string, contents []byte) bool { … } func extractPackageName(filename string, contents []byte) (string, bool) { … } // commonDir returns the directory that all files are in, "" if files is empty, // or an error if they aren't in the same directory. func commonDir(files []string) (string, error) { … } // It is possible that the files in the disk directory dir have a different package // name from newName, which is deduced from the overlays. If they all have a different // package name, and they all have the same package name, then that name becomes // the package name. // It returns true if it changes the package name, false otherwise. func maybeFixPackageName(newName string, isTestFile bool, pkgsOfDir []*Package) { … } // This function is copy-pasted from // https://github.com/golang/go/blob/9706f510a5e2754595d716bd64be8375997311fb/src/cmd/go/internal/search/search.go#L360. // It should be deleted when we remove support for overlays from go/packages. // // NOTE: This does not handle any ./... or ./ style queries, as this function // doesn't know the working directory. // // matchPattern(pattern)(name) reports whether // name matches pattern. Pattern is a limited glob // pattern in which '...' means 'any string' and there // is no other special syntax. // Unfortunately, there are two special cases. Quoting "go help packages": // // First, /... at the end of the pattern can match an empty string, // so that net/... matches both net and packages in its subdirectories, like net/http. // Second, any slash-separated pattern element containing a wildcard never // participates in a match of the "vendor" element in the path of a vendored // package, so that ./... does not match packages in subdirectories of // ./vendor or ./mycode/vendor, but ./vendor/... and ./mycode/vendor/... do. // Note, however, that a directory named vendor that itself contains code // is not a vendored package: cmd/vendor would be a command named vendor, // and the pattern cmd/... matches it. func matchPattern(pattern string) func(name string) bool { … } // replaceVendor returns the result of replacing // non-trailing vendor path elements in x with repl. func replaceVendor(x, repl string) string { … }