type ModuleResolver … // newModuleResolver returns a new module-aware goimports resolver. // // Note: use caution when modifying this constructor: changes must also be // reflected in ModuleResolver.ClearForNewScan. func newModuleResolver(e *ProcessEnv, moduleCacheCache *DirInfoCache) (*ModuleResolver, error) { … } // gomodcacheForEnv returns the GOMODCACHE value to use based on the given env // map, which must have GOMODCACHE and GOPATH populated. // // TODO(rfindley): this is defensive refactoring. // 1. Is this even relevant anymore? Can't we just read GOMODCACHE. // 2. Use this to separate module cache scanning from other scanning. func gomodcacheForEnv(goenv map[string]string) string { … } func (r *ModuleResolver) initAllMods() error { … } // ClearForNewScan invalidates the last scan. // // It preserves the set of roots, but forgets about the set of directories. // Though it forgets the set of module cache directories, it remembers their // contents, since they are assumed to be immutable. func (r *ModuleResolver) ClearForNewScan() Resolver { … } // ClearModuleInfo invalidates resolver state that depends on go.mod file // contents (essentially, the output of go list -m -json ...). // // Notably, it does not forget directory contents, which are reset // asynchronously via ClearForNewScan. // // If the ProcessEnv is a GOPATH environment, ClearModuleInfo is a no op. // // TODO(rfindley): move this to a new env.go, consolidating ProcessEnv methods. func (e *ProcessEnv) ClearModuleInfo() { … } // UpdateResolver sets the resolver for the ProcessEnv to use in imports // operations. Only for use with the result of [Resolver.ClearForNewScan]. // // TODO(rfindley): this awkward API is a result of the (arguably) inverted // relationship between configuration and state described in the doc comment // for [ProcessEnv]. func (e *ProcessEnv) UpdateResolver(r Resolver) { … } // findPackage returns the module and directory from within the main modules // and their dependencies that contains the package at the given import path, // or returns nil, "" if no module is in scope. func (r *ModuleResolver) findPackage(importPath string) (*gocommand.ModuleJSON, string) { … } func (r *ModuleResolver) cacheLoad(dir string) (directoryPackageInfo, bool) { … } func (r *ModuleResolver) cacheStore(info directoryPackageInfo) { … } // cachePackageName caches the package name for a dir already in the cache. func (r *ModuleResolver) cachePackageName(info directoryPackageInfo) (string, error) { … } func (r *ModuleResolver) cacheExports(ctx context.Context, env *ProcessEnv, info directoryPackageInfo) (string, []stdlib.Symbol, error) { … } // findModuleByDir returns the module that contains dir, or nil if no such // module is in scope. func (r *ModuleResolver) findModuleByDir(dir string) *gocommand.ModuleJSON { … } // dirIsNestedModule reports if dir is contained in a nested module underneath // mod, not actually in mod. func (r *ModuleResolver) dirIsNestedModule(dir string, mod *gocommand.ModuleJSON) bool { … } func readModName(modFile string) string { … } func (r *ModuleResolver) modInfo(dir string) (modDir, modName string) { … } func (r *ModuleResolver) dirInModuleCache(dir string) bool { … } func (r *ModuleResolver) loadPackageNames(importPaths []string, srcDir string) (map[string]string, error) { … } func (r *ModuleResolver) scan(ctx context.Context, callback *scanCallback) error { … } func (r *ModuleResolver) scoreImportPath(ctx context.Context, path string) float64 { … } func modRelevance(mod *gocommand.ModuleJSON) float64 { … } // canonicalize gets the result of canonicalizing the packages using the results // of initializing the resolver from 'go list -m'. func (r *ModuleResolver) canonicalize(info directoryPackageInfo) (*pkg, error) { … } func (r *ModuleResolver) loadExports(ctx context.Context, pkg *pkg, includeTest bool) (string, []stdlib.Symbol, error) { … } func (r *ModuleResolver) scanDirForPackage(root gopathwalk.Root, dir string) directoryPackageInfo { … } var modCacheRegexp … var slashSlash … var moduleStr … // modulePath returns the module path from the gomod file text. // If it cannot find a module path, it returns an empty string. // It is tolerant of unrelated problems in the go.mod file. // // Copied from cmd/go/internal/modfile. func modulePath(mod []byte) string { … }