type Folder … type GoEnv … type View … // definition implements the viewDefiner interface. func (v *View) definition() *viewDefinition { … } type viewDefinition … // definition implements the viewDefiner interface. func (d *viewDefinition) definition() *viewDefinition { … } // Type returns the ViewType type, which determines how go/packages are loaded // for this View. func (d *viewDefinition) Type() ViewType { … } // Root returns the view root, which determines where packages are loaded from. func (d *viewDefinition) Root() protocol.DocumentURI { … } // GoMod returns the nearest go.mod file for this view's root, or "". func (d *viewDefinition) GoMod() protocol.DocumentURI { … } // GoWork returns the nearest go.work file for this view's root, or "". func (d *viewDefinition) GoWork() protocol.DocumentURI { … } // EnvOverlay returns a new sorted slice of environment variables (in the form // "k=v") for this view definition's env overlay. func (d *viewDefinition) EnvOverlay() []string { … } // GOOS returns the effective GOOS value for this view definition, accounting // for its env overlay. func (d *viewDefinition) GOOS() string { … } // GOARCH returns the effective GOARCH value for this view definition, accounting // for its env overlay. func (d *viewDefinition) GOARCH() string { … } // adjustedGO111MODULE is the value of GO111MODULE to use for loading packages. // It is adjusted to default to "auto" rather than "on", since if we are in // GOPATH and have no module, we may as well allow a GOPATH view to work. func (d viewDefinition) adjustedGO111MODULE() string { … } // ModFiles are the go.mod files enclosed in the snapshot's view and known // to the snapshot. func (d viewDefinition) ModFiles() []protocol.DocumentURI { … } // viewDefinitionsEqual reports whether x and y are equivalent. func viewDefinitionsEqual(x, y *viewDefinition) bool { … } type ViewType … const GoPackagesDriverView … const GOPATHView … const GoModView … const GoWorkView … const AdHocView … func (t ViewType) String() string { … } // usesModules reports whether the view uses Go modules. func (typ ViewType) usesModules() bool { … } // ID returns the unique ID of this View. func (v *View) ID() string { … } // GoCommandRunner returns the shared gocommand.Runner for this view. func (v *View) GoCommandRunner() *gocommand.Runner { … } // Folder returns the folder at the base of this view. func (v *View) Folder() *Folder { … } // Env returns the environment to use for running go commands in this view. func (v *View) Env() []string { … } // UpdateFolders updates the set of views for the new folders. // // Calling this causes each view to be reinitialized. func (s *Session) UpdateFolders(ctx context.Context, newFolders []*Folder) error { … } // RunProcessEnvFunc runs fn with the process env for this snapshot's view. // Note: the process env contains cached module and filesystem state. func (s *Snapshot) RunProcessEnvFunc(ctx context.Context, fn func(context.Context, *imports.Options) error) error { … } // separated out from its sole use in locateTemplateFiles for testability func fileHasExtension(path string, suffixes []string) bool { … } // locateTemplateFiles ensures that the snapshot has mapped template files // within the workspace folder. func (s *Snapshot) locateTemplateFiles(ctx context.Context) { … } // filterFunc returns a func that reports whether uri is filtered by the currently configured // directoryFilters. func (v *View) filterFunc() func(protocol.DocumentURI) bool { … } // shutdown releases resources associated with the view. func (v *View) shutdown() { … } // ScanImports scans the module cache synchronously. // For use in tests. func (v *View) ScanImports() { … } // IgnoredFile reports if a file would be ignored by a `go list` of the whole // workspace. // // While go list ./... skips directories starting with '.', '_', or 'testdata', // gopls may still load them via file queries. Explicitly filter them out. func (s *Snapshot) IgnoredFile(uri protocol.DocumentURI) bool { … } type ignoreFilter … // newIgnoreFilter returns a new ignoreFilter implementing exclusion rules // relative to the provided directories. func newIgnoreFilter(dirs []string) *ignoreFilter { … } func (f *ignoreFilter) ignored(filename string) bool { … } // checkIgnored implements go list's exclusion rules. // Quoting “go help list”: // // Directory and file names that begin with "." or "_" are ignored // by the go tool, as are directories named "testdata". func checkIgnored(suffix string) bool { … } // Snapshot returns the current snapshot for the view, and a // release function that must be called when the Snapshot is // no longer needed. // // The resulting error is non-nil if and only if the view is shut down, in // which case the resulting release function will also be nil. func (v *View) Snapshot() (*Snapshot, func(), error) { … } // initialize loads the metadata (and currently, file contents, due to // golang/go#57558) for the main package query of the View, which depends on // the view type (see ViewType). If s.initialized is already true, initialize // is a no op. // // The first attempt--which populates the first snapshot for a new view--must // be allowed to run to completion without being cancelled. // // Subsequent attempts are triggered by conditions where gopls can't enumerate // specific packages that require reloading, such as a change to a go.mod file. // These attempts may be cancelled, and then retried by a later call. // // Postcondition: if ctx was not cancelled, s.initialized is true, s.initialErr // holds the error resulting from initialization, if any, and s.metadata holds // the resulting metadata graph. func (s *Snapshot) initialize(ctx context.Context, firstAttempt bool) { … } type StateChange … // InvalidateView processes the provided state change, invalidating any derived // results that depend on the changed state. // // The resulting snapshot is non-nil, representing the outcome of the state // change. The second result is a function that must be called to release the // snapshot when the snapshot is no longer needed. // // An error is returned if the given view is no longer active in the session. func (s *Session) InvalidateView(ctx context.Context, view *View, changed StateChange) (*Snapshot, func(), error) { … } // invalidateViewLocked invalidates the content of the given view. // (See [Session.InvalidateView]). // // The resulting bool reports whether the View needs to be re-diagnosed. // (See [Snapshot.clone]). // // s.viewMu must be held while calling this method. func (s *Session) invalidateViewLocked(ctx context.Context, v *View, changed StateChange) (*Snapshot, func(), bool) { … } // defineView computes the view definition for the provided workspace folder // and URI. // // If forURI is non-empty, this view should be the best view including forURI. // Otherwise, it is the default view for the folder. // // defineView only returns an error in the event of context cancellation. // // Note: keep this function in sync with bestView. // // TODO(rfindley): we should be able to remove the error return, as // findModules is going away, and all other I/O is memoized. // // TODO(rfindley): pass in a narrower interface for the file.Source // (e.g. fileExists func(DocumentURI) bool) to make clear that this // process depends only on directory information, not file contents. func defineView(ctx context.Context, fs file.Source, folder *Folder, forFile file.Handle) (*viewDefinition, error) { … } // FetchGoEnv queries the environment and Go command to collect environment // variables necessary for the workspace folder. func FetchGoEnv(ctx context.Context, folder protocol.DocumentURI, opts *settings.Options) (*GoEnv, error) { … } // loadGoEnv loads `go env` values into the provided map, keyed by Go variable // name. func loadGoEnv(ctx context.Context, dir string, configEnv []string, runner *gocommand.Runner, vars map[string]*string) error { … } // findRootPattern looks for files with the given basename in dir or any parent // directory of dir, using the provided FileSource. It returns the first match, // starting from dir and search parents. // // The resulting string is either the file path of a matching file with the // given basename, or "" if none was found. // // findRootPattern only returns an error in the case of context cancellation. func findRootPattern(ctx context.Context, dirURI protocol.DocumentURI, basename string, fs file.Source) (protocol.DocumentURI, error) { … } var checkPathValid … // CheckPathValid checks whether a directory is suitable as a workspace folder. func CheckPathValid(dir string) error { … } func defaultCheckPathValid(path string) error { … } // IsGoPrivatePath reports whether target is a private import path, as identified // by the GOPRIVATE environment variable. func (s *Snapshot) IsGoPrivatePath(target string) bool { … } // ModuleUpgrades returns known module upgrades for the dependencies of // modfile. func (s *Snapshot) ModuleUpgrades(modfile protocol.DocumentURI) map[string]string { … } var MaxGovulncheckResultAge … // Vulnerabilities returns known vulnerabilities for the given modfile. // // Results more than an hour old are excluded. // // TODO(suzmue): replace command.Vuln with a different type, maybe // https://pkg.go.dev/golang.org/x/vuln/cmd/govulncheck/govulnchecklib#Summary? // // TODO(rfindley): move to snapshot.go func (s *Snapshot) Vulnerabilities(modfiles ...protocol.DocumentURI) map[protocol.DocumentURI]*vulncheck.Result { … } // GoVersion returns the effective release Go version (the X in go1.X) for this // view. func (v *View) GoVersion() int { … } // GoVersionString returns the effective Go version string for this view. // // Unlike [GoVersion], this encodes the minor version and commit hash information. func (v *View) GoVersionString() string { … } // GoVersionString is temporarily available from the snapshot. // // TODO(rfindley): refactor so that this method is not necessary. func (s *Snapshot) GoVersionString() string { … } // Copied from // https://cs.opensource.google/go/go/+/master:src/cmd/go/internal/str/path.go;l=58;drc=2910c5b4a01a573ebc97744890a07c1a3122c67a func globsMatchPath(globs, target string) bool { … } var modFlagRegexp … // TODO(rfindley): clean up the redundancy of allFilesExcluded, // pathExcludedByFilterFunc, pathExcludedByFilter, view.filterFunc... func allFilesExcluded(files []string, filterFunc func(protocol.DocumentURI) bool) bool { … } func relPathExcludedByFilter(path string, filterer *Filterer) bool { … }