Documentation ¶
Overview ¶
Package cache is the core of gopls: it is concerned with state management, dependency analysis, and invalidation; and it holds the machinery of type checking and modular static analysis. Its principal types are Session, Folder, View, Snapshot, Cache, and Package.
Index ¶
- Constants
- Variables
- func BuildLink(target, path, anchor string) protocol.URI
- func BundledLazyFixes(diag protocol.Diagnostic) ([]protocol.CodeAction, error)
- func CheckPathValid(dir string) error
- func GetEnv(snapshot *Snapshot, key string) string
- func RelevantViews[V viewDefiner](ctx context.Context, fs file.Source, uri protocol.DocumentURI, views []V) ([]V, error)
- func TempModDir(ctx context.Context, fs file.Source, modURI protocol.DocumentURI) (dir string, _ func(), rerr error)
- type AllowNetwork
- type Cache
- type CodeLensSourceFunc
- type Diagnostic
- type DiagnosticSource
- type Filterer
- type Folder
- type GoEnv
- type ImportPath
- type InitializationError
- type LabelDuration
- type Package
- func (p *Package) CompiledGoFiles() []*parsego.File
- func (p *Package) DependencyTypes(path PackagePath) *types.Package
- func (p *Package) File(uri protocol.DocumentURI) (*parsego.File, error)
- func (p *Package) FileSet() *token.FileSet
- func (p *Package) Metadata() *metadata.Package
- func (p *Package) ParseErrors() []scanner.ErrorList
- func (p *Package) String() string
- func (p *Package) Syntax() []*ast.File
- func (p *Package) TypeErrors() []types.Error
- func (p *Package) Types() *types.Package
- func (p *Package) TypesInfo() *types.Info
- func (p *Package) TypesSizes() types.Sizes
- type PackageID
- type PackageName
- type PackagePath
- type ParsedModule
- type ParsedWorkFile
- type Session
- func (s *Session) Cache() *Cache
- func (s *Session) DidModifyFiles(ctx context.Context, modifications []file.Modification) (map[*View][]protocol.DocumentURI, error)
- func (s *Session) ExpandModificationsToDirectories(ctx context.Context, changes []file.Modification) []file.Modification
- func (s *Session) FileWatchingGlobPatterns(ctx context.Context) map[protocol.RelativePattern]unit
- func (s *Session) GoCommandRunner() *gocommand.Runner
- func (s *Session) ID() string
- func (s *Session) InvalidateView(ctx context.Context, view *View, changed StateChange) (*Snapshot, func(), error)
- func (s *Session) NewView(ctx context.Context, folder *Folder) (*View, *Snapshot, func(), error)
- func (s *Session) OrphanedFileDiagnostics(ctx context.Context) (map[protocol.DocumentURI][]*Diagnostic, error)
- func (fs Session) Overlays() []*overlay
- func (fs Session) ReadFile(ctx context.Context, uri protocol.DocumentURI) (file.Handle, error)
- func (s *Session) RemoveView(ctx context.Context, dir protocol.DocumentURI) bool
- func (s *Session) ResetView(ctx context.Context, uri protocol.DocumentURI) (*View, error)
- func (s *Session) Shutdown(ctx context.Context)
- func (s *Session) SnapshotOf(ctx context.Context, uri protocol.DocumentURI) (*Snapshot, func(), error)
- func (s *Session) String() string
- func (s *Session) UpdateFolders(ctx context.Context, newFolders []*Folder) error
- func (s *Session) View(id string) (*View, error)
- func (s *Session) Views() []*View
- type SessionKey
- type Snapshot
- func (s *Snapshot) Acquire() func()
- func (s *Snapshot) AllMetadata(ctx context.Context) ([]*metadata.Package, error)
- func (s *Snapshot) Analyze(ctx context.Context, pkgs map[PackageID]*metadata.Package, ...) ([]*Diagnostic, error)
- func (s *Snapshot) AwaitInitialized(ctx context.Context)
- func (s *Snapshot) BackgroundContext() context.Context
- func (s *Snapshot) BuiltinFile(ctx context.Context) (*parsego.File, error)
- func (s *Snapshot) FileKind(fh file.Handle) file.Kind
- func (s *Snapshot) FindFile(uri protocol.DocumentURI) file.Handle
- func (s *Snapshot) Folder() protocol.DocumentURI
- func (s *Snapshot) GoCommandInvocation(allowNetwork AllowNetwork, dir, verb string, args []string, env ...string) (_ *gocommand.Invocation, cleanup func(), _ error)
- func (s *Snapshot) GoModForFile(uri protocol.DocumentURI) protocol.DocumentURI
- func (s *Snapshot) GoVersionString() string
- func (s *Snapshot) IgnoredFile(uri protocol.DocumentURI) bool
- func (s *Snapshot) InitializationError() *InitializationError
- func (s *Snapshot) IsBuiltin(uri protocol.DocumentURI) bool
- func (s *Snapshot) IsGoPrivatePath(target string) bool
- func (s *Snapshot) IsOpen(uri protocol.DocumentURI) bool
- func (s *Snapshot) IsWorkspacePackage(ctx context.Context, id PackageID) bool
- func (s *Snapshot) Labels() []label.Label
- func (s *Snapshot) Metadata(id PackageID) *metadata.Package
- func (s *Snapshot) MetadataForFile(ctx context.Context, uri protocol.DocumentURI) ([]*metadata.Package, error)
- func (s *Snapshot) MetadataGraph() *metadata.Graph
- func (s *Snapshot) MethodSets(ctx context.Context, ids ...PackageID) ([]*methodsets.Index, error)
- func (s *Snapshot) ModTidy(ctx context.Context, pm *ParsedModule) (*TidiedModule, error)
- func (s *Snapshot) ModVuln(ctx context.Context, modURI protocol.DocumentURI) (*vulncheck.Result, error)
- func (s *Snapshot) ModWhy(ctx context.Context, fh file.Handle) (map[string]string, error)
- func (s *Snapshot) ModuleUpgrades(modfile protocol.DocumentURI) map[string]string
- func (s *Snapshot) Options() *settings.Options
- func (s *Snapshot) Overlays() []*overlay
- func (s *Snapshot) PackageDiagnostics(ctx context.Context, ids ...PackageID) (map[protocol.DocumentURI][]*Diagnostic, error)
- func (s *Snapshot) ParseGo(ctx context.Context, fh file.Handle, mode parser.Mode) (*parsego.File, error)
- func (s *Snapshot) ParseMod(ctx context.Context, fh file.Handle) (*ParsedModule, error)
- func (s *Snapshot) ParseWork(ctx context.Context, fh file.Handle) (*ParsedWorkFile, error)
- func (s *Snapshot) ReadFile(ctx context.Context, uri protocol.DocumentURI) (file.Handle, error)
- func (s *Snapshot) References(ctx context.Context, ids ...PackageID) ([]xrefIndex, error)
- func (s *Snapshot) ReverseDependencies(ctx context.Context, id PackageID, transitive bool) (map[PackageID]*metadata.Package, error)
- func (s *Snapshot) RunGoModUpdateCommands(ctx context.Context, modURI protocol.DocumentURI, ...) ([]byte, []byte, error)
- func (s *Snapshot) RunProcessEnvFunc(ctx context.Context, fn func(context.Context, *imports.Options) error) error
- func (s *Snapshot) SequenceID() uint64
- func (s *Snapshot) Symbols(ctx context.Context, workspaceOnly bool) (map[protocol.DocumentURI][]Symbol, error)
- func (s *Snapshot) Templates() map[protocol.DocumentURI]file.Handle
- func (s *Snapshot) Tests(ctx context.Context, ids ...PackageID) ([]*testfuncs.Index, error)
- func (s *Snapshot) TypeCheck(ctx context.Context, ids ...PackageID) ([]*Package, error)
- func (s *Snapshot) View() *View
- func (s *Snapshot) Vulnerabilities(modfiles ...protocol.DocumentURI) map[protocol.DocumentURI]*vulncheck.Result
- func (s *Snapshot) WantGCDetails(id metadata.PackageID) bool
- func (s *Snapshot) WorkspaceMetadata(ctx context.Context) ([]*metadata.Package, error)
- type StateChange
- type SuggestedFix
- type Symbol
- type TidiedModule
- type View
- func (v *View) Env() []string
- func (d View) EnvOverlay() []string
- func (v *View) Folder() *Folder
- func (d View) GOARCH() string
- func (d View) GOOS() string
- func (v *View) GoCommandRunner() *gocommand.Runner
- func (d View) GoMod() protocol.DocumentURI
- func (v *View) GoVersion() int
- func (v *View) GoVersionString() string
- func (d View) GoWork() protocol.DocumentURI
- func (v *View) ID() string
- func (d View) ModFiles() []protocol.DocumentURI
- func (d View) Root() protocol.DocumentURI
- func (v *View) ScanImports()
- func (v *View) Snapshot() (*Snapshot, func(), error)
- func (d View) Type() ViewType
- type ViewType
Constants ¶
const AnalysisProgressTitle = "Analyzing Dependencies"
AnalysisProgressTitle is the title of the progress report for ongoing analysis. It is sought by regression tests for the progress reporting feature.
const GoVersionForVulnTest = "_GOPLS_TEST_VULNCHECK_GOVERSION"
GoVersionForVulnTest is an internal environment variable used in gopls testing to examine govulncheck behavior with a go version different than what `go version` returns in the system.
Variables ¶
var ( KeyCreateSession = NewSessionKey("create_session", "A new session was added") KeyUpdateSession = NewSessionKey("update_session", "Updated information about a session") KeyShutdownSession = NewSessionKey("shutdown_session", "A session was shut down") )
var ErrNoModOnDisk = errors.New("go.mod file is not on disk")
This error is sought by mod diagnostics.
var ErrViewExists = errors.New("view already exists for session")
TODO(rfindley): is the logic surrounding this error actually necessary?
var MaxGovulncheckResultAge = 1 * time.Hour
MaxGovulncheckResultsAge defines the maximum vulnerability age considered valid by gopls.
Mutable for testing.
Functions ¶
func BundledLazyFixes ¶ added in v0.16.0
func BundledLazyFixes(diag protocol.Diagnostic) ([]protocol.CodeAction, error)
BundledLazyFixes extracts any bundled codeActions from the diag.Data field.
func CheckPathValid ¶
CheckPathValid checks whether a directory is suitable as a workspace folder.
func RelevantViews ¶ added in v0.16.0
func RelevantViews[V viewDefiner](ctx context.Context, fs file.Source, uri protocol.DocumentURI, views []V) ([]V, error)
RelevantViews returns the views that may contain the given URI, or nil if none exist. A view is "relevant" if, ignoring build constraints, it may have a workspace package containing uri. Therefore, the definition of relevance depends on the view type.
func TempModDir ¶ added in v0.16.0
func TempModDir(ctx context.Context, fs file.Source, modURI protocol.DocumentURI) (dir string, _ func(), rerr error)
TempModDir creates a temporary directory with the contents of the provided modURI, as well as its corresponding go.sum file, if it exists. On success, it is the caller's responsibility to call the cleanup function to remove the directory when it is no longer needed.
Types ¶
type AllowNetwork ¶
type AllowNetwork bool
AllowNetwork determines whether Go commands are permitted to use the network. (Controlled via GOPROXY=off.)
const ( NoNetwork AllowNetwork = false NetworkOK AllowNetwork = true )
type Cache ¶
type Cache struct {
// contains filtered or unexported fields
}
A Cache holds content that is shared across multiple gopls sessions.
func New ¶
New Creates a new cache for gopls operation results, using the given file set, shared store, and session options.
Both the fset and store may be nil, but if store is non-nil so must be fset (and they must always be used together), otherwise it may be possible to get cached data referencing token.Pos values not mapped by the FileSet.
type CodeLensSourceFunc ¶ added in v0.16.0
A CodeLensSourceFunc is a function that reports CodeLenses (range-associated commands) for a given file.
type Diagnostic ¶
type Diagnostic struct { URI protocol.DocumentURI // of diagnosed file (not diagnostic documentation) Range protocol.Range Severity protocol.DiagnosticSeverity Code string // analysis.Diagnostic.Category (or "default" if empty) or hidden go/types error code CodeHref string // Source is a human-readable description of the source of the error. // Diagnostics generated by an analysis.Analyzer set it to Analyzer.Name. Source DiagnosticSource Message string Tags []protocol.DiagnosticTag Related []protocol.DiagnosticRelatedInformation // Fields below are used internally to generate lazy fixes. They aren't // part of the LSP spec and historically didn't leave the server. // // Update(2023-05): version 3.16 of the LSP spec included support for the // Diagnostic.data field, which holds arbitrary data preserved in the // diagnostic for codeAction requests. This field allows bundling additional // information for lazy fixes, and gopls can (and should) use this // information to avoid re-evaluating diagnostics in code-action handlers. // // In order to stage this transition incrementally, the 'BundledFixes' field // may store a 'bundled' (=json-serialized) form of the associated // SuggestedFixes. Not all diagnostics have their fixes bundled. BundledFixes *json.RawMessage SuggestedFixes []SuggestedFix }
An Diagnostic corresponds to an LSP Diagnostic. https://microsoft.github.io/language-server-protocol/specification#diagnostic
It is (effectively) gob-serializable; see {encode,decode}Diagnostics.
func (*Diagnostic) Hash ¶ added in v0.17.0
func (d *Diagnostic) Hash() file.Hash
Hash computes a hash to identify the diagnostic. The hash is for deduplicating within a file, so does not incorporate d.URI.
func (*Diagnostic) String ¶
func (d *Diagnostic) String() string
type DiagnosticSource ¶
type DiagnosticSource string
const ( UnknownError DiagnosticSource = "<Unknown source>" ListError DiagnosticSource = "go list" ParseError DiagnosticSource = "syntax" TypeError DiagnosticSource = "compiler" ModTidyError DiagnosticSource = "go mod tidy" OptimizationDetailsError DiagnosticSource = "optimizer details" UpgradeNotification DiagnosticSource = "upgrade available" Vulncheck DiagnosticSource = "vulncheck imports" Govulncheck DiagnosticSource = "govulncheck" TemplateError DiagnosticSource = "template" WorkFileError DiagnosticSource = "go.work file" ConsistencyInfo DiagnosticSource = "consistency" )
type Filterer ¶
type Filterer struct {
// contains filtered or unexported fields
}
func NewFilterer ¶
NewFilterer computes regular expression form of all raw filters
type Folder ¶
type Folder struct { Dir protocol.DocumentURI Name string // decorative name for UI; not necessarily unique Options *settings.Options Env GoEnv }
A Folder represents an LSP workspace folder, together with its per-folder options and environment variables that affect build configuration.
Folders (Name and Dir) are specified by the 'initialize' and subsequent 'didChangeWorkspaceFolders' requests; their options come from didChangeConfiguration.
Folders must not be mutated, as they may be shared across multiple views.
type GoEnv ¶
type GoEnv struct { // Go environment variables. These correspond directly with the Go env var of // the same name. GOOS string GOARCH string GOCACHE string GOMODCACHE string GOPATH string GOPRIVATE string GOFLAGS string GO111MODULE string GOTOOLCHAIN string GOROOT string // Go version output. GoVersion int // The X in Go 1.X GoVersionOutput string // complete go version output // ExplicitGOWORK is the GOWORK value set explicitly in the environment. This // may differ from `go env GOWORK` when the GOWORK value is implicit from the // working directory. ExplicitGOWORK string // EffectiveGOPACKAGESDRIVER is the effective go/packages driver binary that // will be used. This may be set via GOPACKAGESDRIVER, or may be discovered // via os.LookPath("gopackagesdriver"). The latter functionality is // undocumented and may be removed in the future. // // If GOPACKAGESDRIVER is set to "off", EffectiveGOPACKAGESDRIVER is "". EffectiveGOPACKAGESDRIVER string }
GoEnv holds the environment variables and data from the Go command that is required for operating on a workspace folder.
func FetchGoEnv ¶
func FetchGoEnv(ctx context.Context, folder protocol.DocumentURI, opts *settings.Options) (*GoEnv, error)
FetchGoEnv queries the environment and Go command to collect environment variables necessary for the workspace folder.
type ImportPath ¶
type ImportPath = metadata.ImportPath
Convenient aliases for very heavily used types.
type InitializationError ¶
type InitializationError struct { // MainError is the primary error. Must be non-nil. MainError error // Diagnostics contains any supplemental (structured) diagnostics extracted // from the load error. Diagnostics map[protocol.DocumentURI][]*Diagnostic }
A InitializationError is an error that causes snapshot initialization to fail. It is either the error returned from go/packages.Load, or an error parsing a workspace go.work or go.mod file.
Such an error generally indicates that the View is malformed, and will never be usable.
type LabelDuration ¶
func AnalyzerRunTimes ¶
func AnalyzerRunTimes() []LabelDuration
AnalyzerRunTimes returns the accumulated time spent in each Analyzer's Run function since process start, in descending order.
type Package ¶
type Package struct {
// contains filtered or unexported fields
}
A Package is the union of package metadata and type checking results.
TODO(rfindley): for now, we do not persist the post-processing of loadDiagnostics, because the value of the snapshot.packages map is just the package handle. Fix this.
func (*Package) CompiledGoFiles ¶
func (*Package) DependencyTypes ¶
func (p *Package) DependencyTypes(path PackagePath) *types.Package
DependencyTypes returns the type checker's symbol for the specified package. It returns nil if path is not among the transitive dependencies of p, or if no symbols from that package were referenced during the type-checking of p.
func (*Package) FileSet ¶
FileSet returns the FileSet describing this package's positions.
The returned FileSet is guaranteed to describe all Syntax, but may also describe additional files.
func (*Package) ParseErrors ¶ added in v0.16.0
ParseErrors returns a slice containing all non-empty parse errors produces while parsing p.Syntax, or nil if the package contains no parse errors.
func (*Package) Syntax ¶ added in v0.16.0
Syntax returns parsed compiled Go files contained in this package.
func (*Package) TypeErrors ¶ added in v0.16.0
TypeErrors returns the go/types.Errors produced during type checking this package, if any.
func (*Package) TypesInfo ¶ added in v0.16.0
TypesInfo returns the go/types.Info annotating the Syntax of this package with type information.
All fields in the resulting Info are populated.
func (*Package) TypesSizes ¶ added in v0.16.0
TypesSizes returns the sizing function used for types in this package.
type PackageName ¶
type PackageName = metadata.PackageName
Convenient aliases for very heavily used types.
type PackagePath ¶
type PackagePath = metadata.PackagePath
Convenient aliases for very heavily used types.
type ParsedModule ¶
type ParsedModule struct { URI protocol.DocumentURI File *modfile.File Mapper *protocol.Mapper ParseErrors []*Diagnostic }
A ParsedModule contains the results of parsing a go.mod file.
type ParsedWorkFile ¶
type ParsedWorkFile struct { URI protocol.DocumentURI File *modfile.WorkFile Mapper *protocol.Mapper ParseErrors []*Diagnostic }
A ParsedWorkFile contains the results of parsing a go.work file.
type Session ¶
type Session struct {
// contains filtered or unexported fields
}
A Session holds the state (views, file contents, parse cache, memoized computations) of a gopls server process.
It implements the file.Source interface.
func NewSession ¶
NewSession creates a new gopls session with the given cache.
func (*Session) DidModifyFiles ¶
func (s *Session) DidModifyFiles(ctx context.Context, modifications []file.Modification) (map[*View][]protocol.DocumentURI, error)
DidModifyFiles reports a file modification to the session. It returns the new snapshots after the modifications have been applied, paired with the affected file URIs for those snapshots. On success, it returns a release function that must be called when the snapshots are no longer needed.
TODO(rfindley): what happens if this function fails? It must leave us in a broken state, which we should surface to the user, probably as a request to restart gopls.
func (*Session) ExpandModificationsToDirectories ¶
func (s *Session) ExpandModificationsToDirectories(ctx context.Context, changes []file.Modification) []file.Modification
ExpandModificationsToDirectories returns the set of changes with the directory changes removed and expanded to include all of the files in the directory.
func (*Session) FileWatchingGlobPatterns ¶
func (s *Session) FileWatchingGlobPatterns(ctx context.Context) map[protocol.RelativePattern]unit
FileWatchingGlobPatterns returns a set of glob patterns that the client is required to watch for changes, and notify the server of them, in order to keep the server's state up to date.
This set includes
- all go.mod and go.work files in the workspace; and
- for each Snapshot, its modules (or directory for ad-hoc views). In module mode, this is the set of active modules (and for VS Code, all workspace directories within them, due to golang/go#42348).
The watch for workspace go.work and go.mod files in (1) is sufficient to capture changes to the repo structure that may affect the set of views. Whenever this set changes, we reload the workspace and invalidate memoized files.
The watch for workspace directories in (2) should keep each View up to date, as it should capture any newly added/modified/deleted Go files.
Patterns are returned as a set of protocol.RelativePatterns, since they can always be later translated to glob patterns (i.e. strings) if the client lacks relative pattern support. By convention, any pattern returned with empty baseURI should be served as a glob pattern.
In general, we prefer to serve relative patterns, as they work better on most clients that support both, and do not have issues with Windows driver letter casing: https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#relativePattern
TODO(golang/go#57979): we need to reset the memoizedFS when a view changes. Consider the case where we incidentally read a file, then it moved outside of an active module, and subsequently changed: we would still observe the original file state.
func (*Session) GoCommandRunner ¶
GoCommandRunner returns the gocommand Runner for this session.
func (*Session) InvalidateView ¶
func (s *Session) InvalidateView(ctx context.Context, view *View, changed StateChange) (*Snapshot, func(), error)
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 (*Session) NewView ¶
NewView creates a new View, returning it and its first snapshot. If a non-empty tempWorkspace directory is provided, the View will record a copy of its gopls workspace module in that directory, so that client tooling can execute in the same main module. On success it also returns a release function that must be called when the Snapshot is no longer needed.
func (*Session) OrphanedFileDiagnostics ¶
func (s *Session) OrphanedFileDiagnostics(ctx context.Context) (map[protocol.DocumentURI][]*Diagnostic, error)
OrphanedFileDiagnostics reports diagnostics describing why open files have no packages or have only command-line-arguments packages.
If the resulting diagnostic is nil, the file is either not orphaned or we can't produce a good diagnostic.
The caller must not mutate the result.
func (Session) Overlays ¶
func (fs Session) Overlays() []*overlay
Overlays returns a new unordered array of overlays.
func (*Session) RemoveView ¶
RemoveView removes from the session the view rooted at the specified directory. It reports whether a view of that directory was removed.
func (*Session) SnapshotOf ¶
func (s *Session) SnapshotOf(ctx context.Context, uri protocol.DocumentURI) (*Snapshot, func(), error)
SnapshotOf returns a Snapshot corresponding to the given URI.
In the case where the file can be can be associated with a View by bestViewForURI (based on directory information alone, without package metadata), SnapshotOf returns the current Snapshot for that View. Otherwise, it awaits loading package metadata and returns a Snapshot for the first View containing a real (=not command-line-arguments) package for the file.
If that also fails to find a View, SnapshotOf returns a Snapshot for the first view in s.views that is not shut down (i.e. s.views[0] unless we lose a race), for determinism in tests and so that we tend to aggregate the resulting command-line-arguments packages into a single view.
SnapshotOf returns an error if a failure occurs along the way (most likely due to context cancellation), or if there are no Views in the Session.
On success, the caller must call the returned function to release the snapshot.
func (*Session) UpdateFolders ¶
UpdateFolders updates the set of views for the new folders.
Calling this causes each view to be reinitialized.
type SessionKey ¶
type SessionKey struct {
// contains filtered or unexported fields
}
SessionKey represents an event label key that has a *Session value.
func NewSessionKey ¶
func NewSessionKey(name, description string) *SessionKey
NewSessionKey creates a new Key for *Session values.
func (*SessionKey) Description ¶
func (k *SessionKey) Description() string
func (*SessionKey) From ¶
func (k *SessionKey) From(t label.Label) *Session
From can be used to get the session value from a Label.
func (*SessionKey) Get ¶
func (k *SessionKey) Get(lm label.Map) *Session
Get can be used to get the session for the key from a label.Map.
func (*SessionKey) Name ¶
func (k *SessionKey) Name() string
type Snapshot ¶
type Snapshot struct {
// contains filtered or unexported fields
}
A Snapshot represents the current state for a given view.
It is first and foremost an idempotent implementation of file.Source whose ReadFile method returns consistent information about the existence and content of each file throughout its lifetime.
However, the snapshot also manages additional state (such as parsed files and packages) that are derived from file content.
Snapshots are responsible for bookkeeping and invalidation of this state, implemented in Snapshot.clone.
func (*Snapshot) Acquire ¶
func (s *Snapshot) Acquire() func()
Acquire prevents the snapshot from being destroyed until the returned function is called.
(s.Acquire().release() could instead be expressed as a pair of method calls s.IncRef(); s.DecRef(). The latter has the advantage that the DecRefs are fungible and don't require holding anything in addition to the refcounted object s, but paradoxically that is also an advantage of the current approach, which forces the caller to consider the release function at every stage, making a reference leak more obvious.)
func (*Snapshot) AllMetadata ¶
AllMetadata returns a new unordered array of metadata for all packages known to this snapshot, which includes the packages of all workspace modules plus their transitive import dependencies.
It may also contain ad-hoc packages for standalone files. It includes all test variants.
TODO(rfindley): Replace this with s.MetadataGraph().
func (*Snapshot) Analyze ¶
func (s *Snapshot) Analyze(ctx context.Context, pkgs map[PackageID]*metadata.Package, reporter *progress.Tracker) ([]*Diagnostic, error)
Analyze applies the set of enabled analyzers to the packages in the pkgs map, and returns their diagnostics.
Notifications of progress may be sent to the optional reporter.
func (*Snapshot) AwaitInitialized ¶
AwaitInitialized waits until the snapshot's view is initialized.
func (*Snapshot) BackgroundContext ¶
BackgroundContext returns a context used for all background processing on behalf of this snapshot.
func (*Snapshot) BuiltinFile ¶
BuiltinFile returns the pseudo-source file builtins.go, parsed with legacy ast.Object resolution.
func (*Snapshot) FileKind ¶
FileKind returns the kind of a file.
We can't reliably deduce the kind from the file name alone, as some editors can be told to interpret a buffer as language different from the file name heuristic, e.g. that an .html file actually contains Go "html/template" syntax, or even that a .go file contains Python.
func (*Snapshot) FindFile ¶
func (s *Snapshot) FindFile(uri protocol.DocumentURI) file.Handle
FindFile returns the FileHandle for the given URI, if it is already in the given snapshot. TODO(adonovan): delete this operation; use ReadFile instead.
func (*Snapshot) Folder ¶
func (s *Snapshot) Folder() protocol.DocumentURI
Folder returns the folder at the base of this snapshot.
func (*Snapshot) GoCommandInvocation ¶ added in v0.16.0
func (s *Snapshot) GoCommandInvocation(allowNetwork AllowNetwork, dir, verb string, args []string, env ...string) (_ *gocommand.Invocation, cleanup func(), _ error)
GoCommandInvocation populates inv with configuration for running go commands on the snapshot.
On success, the caller must call the cleanup function exactly once when the invocation is no longer needed.
TODO(rfindley): although this function has been simplified significantly, additional refactoring is still required: the responsibility for Env and BuildFlags should be more clearly expressed in the API.
If allowNetwork is NoNetwork, set GOPROXY=off.
func (*Snapshot) GoModForFile ¶
func (s *Snapshot) GoModForFile(uri protocol.DocumentURI) protocol.DocumentURI
GoModForFile returns the URI of the go.mod file for the given URI.
TODO(rfindley): clarify that this is only active modules. Or update to just use findRootPattern.
func (*Snapshot) GoVersionString ¶
GoVersionString is temporarily available from the snapshot.
TODO(rfindley): refactor so that this method is not necessary.
func (*Snapshot) IgnoredFile ¶
func (s *Snapshot) IgnoredFile(uri protocol.DocumentURI) bool
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 (*Snapshot) InitializationError ¶
func (s *Snapshot) InitializationError() *InitializationError
InitializationError returns the last error from initialization.
func (*Snapshot) IsBuiltin ¶
func (s *Snapshot) IsBuiltin(uri protocol.DocumentURI) bool
IsBuiltin reports whether uri is part of the builtin package.
func (*Snapshot) IsGoPrivatePath ¶
IsGoPrivatePath reports whether target is a private import path, as identified by the GOPRIVATE environment variable.
func (*Snapshot) IsOpen ¶
func (s *Snapshot) IsOpen(uri protocol.DocumentURI) bool
IsOpen returns whether the editor currently has a file open.
func (*Snapshot) IsWorkspacePackage ¶ added in v0.15.2
IsWorkspacePackage reports whether id points to a workspace package in s.
Currently, the result depends on the current set of loaded packages, and so is not guaranteed to be stable.
func (*Snapshot) Labels ¶
SnapshotLabels returns a new slice of labels that should be used for events related to a snapshot.
func (*Snapshot) Metadata ¶
Metadata returns the metadata for the specified package, or nil if it was not found.
func (*Snapshot) MetadataForFile ¶
func (s *Snapshot) MetadataForFile(ctx context.Context, uri protocol.DocumentURI) ([]*metadata.Package, error)
MetadataForFile returns a new slice containing metadata for each package containing the Go file identified by uri, ordered by the number of CompiledGoFiles (i.e. "narrowest" to "widest" package), and secondarily by IsIntermediateTestVariant (false < true). The result may include tests and intermediate test variants of importable packages. It returns an error if the context was cancelled.
func (*Snapshot) MetadataGraph ¶
MetadataGraph returns the current metadata graph for the Snapshot.
func (*Snapshot) MethodSets ¶
MethodSets returns method-set indexes for the specified packages.
If these indexes cannot be loaded from cache, the requested packages may be type-checked.
func (*Snapshot) ModTidy ¶
func (s *Snapshot) ModTidy(ctx context.Context, pm *ParsedModule) (*TidiedModule, error)
ModTidy returns the go.mod file that would be obtained by running "go mod tidy". Concurrent requests are combined into a single command.
func (*Snapshot) ModVuln ¶
func (s *Snapshot) ModVuln(ctx context.Context, modURI protocol.DocumentURI) (*vulncheck.Result, error)
ModVuln returns import vulnerability analysis for the given go.mod URI. Concurrent requests are combined into a single command.
func (*Snapshot) ModWhy ¶
ModWhy returns the "go mod why" result for each module named in a require statement in the go.mod file. TODO(adonovan): move to new mod_why.go file.
func (*Snapshot) ModuleUpgrades ¶
func (s *Snapshot) ModuleUpgrades(modfile protocol.DocumentURI) map[string]string
ModuleUpgrades returns known module upgrades for the dependencies of modfile.
func (*Snapshot) Overlays ¶
func (s *Snapshot) Overlays() []*overlay
Overlays returns the set of overlays at this snapshot.
Note that this may differ from the set of overlays on the server, if the snapshot observed a historical state.
func (*Snapshot) PackageDiagnostics ¶
func (s *Snapshot) PackageDiagnostics(ctx context.Context, ids ...PackageID) (map[protocol.DocumentURI][]*Diagnostic, error)
PackageDiagnostics returns diagnostics for files contained in specified packages.
If these diagnostics cannot be loaded from cache, the requested packages may be type-checked.
func (*Snapshot) ParseGo ¶
func (s *Snapshot) ParseGo(ctx context.Context, fh file.Handle, mode parser.Mode) (*parsego.File, error)
ParseGo parses the file whose contents are provided by fh. The resulting tree may have been fixed up. If the file is not available, returns nil and an error.
func (*Snapshot) ParseMod ¶
ParseMod parses a go.mod file, using a cache. It may return partial results and an error.
func (*Snapshot) ParseWork ¶
ParseWork parses a go.work file, using a cache. It may return partial results and an error. TODO(adonovan): move to new work.go file.
func (*Snapshot) ReadFile ¶
ReadFile returns a File for the given URI. If the file is unknown it is added to the managed set.
ReadFile succeeds even if the file does not exist. A non-nil error return indicates some type of internal error, for example if ctx is cancelled.
func (*Snapshot) References ¶
References returns cross-reference indexes for the specified packages.
If these indexes cannot be loaded from cache, the requested packages may be type-checked.
func (*Snapshot) ReverseDependencies ¶
func (s *Snapshot) ReverseDependencies(ctx context.Context, id PackageID, transitive bool) (map[PackageID]*metadata.Package, error)
ReverseDependencies returns a new mapping whose entries are the ID and Metadata of each package in the workspace that directly or transitively depend on the package denoted by id, excluding id itself.
func (*Snapshot) RunGoModUpdateCommands ¶
func (s *Snapshot) RunGoModUpdateCommands(ctx context.Context, modURI protocol.DocumentURI, run func(invoke func(...string) (*bytes.Buffer, error)) error) ([]byte, []byte, error)
RunGoModUpdateCommands runs a series of `go` commands that updates the go.mod and go.sum file for wd, and returns their updated contents.
TODO(rfindley): the signature of RunGoModUpdateCommands is very confusing, and is the only thing forcing the ModFlag and ModFile indirection. Simplify it.
func (*Snapshot) RunProcessEnvFunc ¶
func (s *Snapshot) RunProcessEnvFunc(ctx context.Context, fn func(context.Context, *imports.Options) error) error
RunProcessEnvFunc runs fn with the process env for this snapshot's view. Note: the process env contains cached module and filesystem state.
func (*Snapshot) SequenceID ¶
SequenceID is the sequence id of this snapshot within its containing view.
Relative to their view sequence ids are monotonically increasing, but this does not hold globally: when new views are created their initial snapshot has sequence ID 0.
func (*Snapshot) Symbols ¶
func (s *Snapshot) Symbols(ctx context.Context, workspaceOnly bool) (map[protocol.DocumentURI][]Symbol, error)
Symbols extracts and returns symbol information for every file contained in a loaded package. It awaits snapshot loading.
If workspaceOnly is set, this only includes symbols from files in a workspace package. Otherwise, it returns symbols from all loaded packages.
TODO(rfindley): move to symbols.go.
func (*Snapshot) Templates ¶
func (s *Snapshot) Templates() map[protocol.DocumentURI]file.Handle
Templates returns the .tmpl files.
func (*Snapshot) Tests ¶ added in v0.17.0
Tests returns test-set indexes for the specified packages. There is a one-to-one correspondence between ID and Index.
If these indexes cannot be loaded from cache, the requested packages may be type-checked.
func (*Snapshot) TypeCheck ¶
TypeCheck parses and type-checks the specified packages, and returns them in the same order as the ids. The resulting packages' types may belong to different importers, so types from different packages are incommensurable.
The resulting packages slice always contains len(ids) entries, though some of them may be nil if (and only if) the resulting error is non-nil.
An error is returned if any of the requested packages fail to type-check. This is different from having type-checking errors: a failure to type-check indicates context cancellation or otherwise significant failure to perform the type-checking operation.
In general, clients should never need to type-checked syntax for an intermediate test variant (ITV) package. Callers should apply RemoveIntermediateTestVariants (or equivalent) before this method, or any of the potentially type-checking methods below.
func (*Snapshot) Vulnerabilities ¶
func (s *Snapshot) Vulnerabilities(modfiles ...protocol.DocumentURI) map[protocol.DocumentURI]*vulncheck.Result
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 (*Snapshot) WantGCDetails ¶
WantGCDetails reports whether to compute GC optimization details for the specified package.
func (*Snapshot) WorkspaceMetadata ¶
WorkspaceMetadata returns a new, unordered slice containing metadata for all ordinary and test packages (but not intermediate test variants) in the workspace.
The workspace is the set of modules typically defined by a go.work file. It is not transitively closed: for example, the standard library is not usually part of the workspace even though every module in the workspace depends on it.
Operations that must inspect all the dependencies of the workspace packages should instead use AllMetadata.
type StateChange ¶
type StateChange struct { Modifications []file.Modification // if set, the raw modifications originating this change Files map[protocol.DocumentURI]file.Handle ModuleUpgrades map[protocol.DocumentURI]map[string]string Vulns map[protocol.DocumentURI]*vulncheck.Result GCDetails map[metadata.PackageID]bool // package -> whether or not we want details }
A StateChange describes external state changes that may affect a snapshot.
By far the most common of these is a change to file state, but a query of module upgrade information or vulnerabilities also affects gopls' behavior.
type SuggestedFix ¶
type SuggestedFix struct { Title string Edits map[protocol.DocumentURI][]protocol.TextEdit Command *protocol.Command ActionKind protocol.CodeActionKind }
A SuggestedFix represents a suggested fix (for a diagnostic) produced by analysis, in protocol form.
The fixes are reported to the client as a set of code actions in response to a CodeAction query for a set of diagnostics. Multiple SuggestedFixes may be produced for the same logical fix, varying only in ActionKind. For example, a fix may be both a Refactor (which should appear on the refactoring menu) and a SourceFixAll (a clear fix that can be safely applied without explicit consent).
func SuggestedFixFromCommand ¶
func SuggestedFixFromCommand(cmd *protocol.Command, kind protocol.CodeActionKind) SuggestedFix
SuggestedFixFromCommand returns a suggested fix to run the given command.
type Symbol ¶
type Symbol struct { Name string Kind protocol.SymbolKind Range protocol.Range }
Symbol holds a precomputed symbol value. Note: we avoid using the protocol.SymbolInformation struct here in order to reduce the size of each symbol.
type TidiedModule ¶
type TidiedModule struct { // Diagnostics representing changes made by `go mod tidy`. Diagnostics []*Diagnostic // The bytes of the go.mod file after it was tidied. TidiedContent []byte }
A TidiedModule contains the results of running `go mod tidy` on a module.
type View ¶
type View struct {
// contains filtered or unexported fields
}
View represents a single build for a workspace.
A View is a logical build (the viewDefinition) along with a state of that build (the Snapshot).
func (*View) Env ¶ added in v0.17.0
Env returns the environment to use for running go commands in this view.
func (View) EnvOverlay ¶
func (d View) EnvOverlay() []string
EnvOverlay returns a new sorted slice of environment variables (in the form "k=v") for this view definition's env overlay.
func (View) GOARCH ¶
func (d View) GOARCH() string
GOARCH returns the effective GOARCH value for this view definition, accounting for its env overlay.
func (View) GOOS ¶
func (d View) GOOS() string
GOOS returns the effective GOOS value for this view definition, accounting for its env overlay.
func (*View) GoCommandRunner ¶ added in v0.16.0
GoCommandRunner returns the shared gocommand.Runner for this view.
func (View) GoMod ¶
func (d View) GoMod() protocol.DocumentURI
GoMod returns the nearest go.mod file for this view's root, or "".
func (*View) GoVersion ¶
GoVersion returns the effective release Go version (the X in go1.X) for this view.
func (*View) GoVersionString ¶
GoVersionString returns the effective Go version string for this view.
Unlike [GoVersion], this encodes the minor version and commit hash information.
func (View) GoWork ¶
func (d View) GoWork() protocol.DocumentURI
GoWork returns the nearest go.work file for this view's root, or "".
func (View) ModFiles ¶
func (d View) ModFiles() []protocol.DocumentURI
ModFiles are the go.mod files enclosed in the snapshot's view and known to the snapshot.
func (View) Root ¶
func (d View) Root() protocol.DocumentURI
Root returns the view root, which determines where packages are loaded from.
func (*View) ScanImports ¶ added in v0.16.0
func (v *View) ScanImports()
ScanImports scans the module cache synchronously. For use in tests.
type ViewType ¶
type ViewType int
A ViewType describes how we load package information for a view.
This is used for constructing the go/packages.Load query, and for interpreting missing packages, imports, or errors.
See the documentation for individual ViewType values for details.
const ( // GoPackagesDriverView is a view with a non-empty GOPACKAGESDRIVER // environment variable. // // Load: ./... from the workspace folder. GoPackagesDriverView ViewType = iota // GOPATHView is a view in GOPATH mode. // // I.e. in GOPATH, with GO111MODULE=off, or GO111MODULE=auto with no // go.mod file. // // Load: ./... from the workspace folder. GOPATHView // GoModView is a view in module mode with a single Go module. // // Load: <modulePath>/... from the module root. GoModView // GoWorkView is a view in module mode with a go.work file. // // Load: <modulePath>/... from the workspace folder, for each module. GoWorkView // An AdHocView is a collection of files in a given directory, not in GOPATH // or a module. // // Load: . from the workspace folder. AdHocView )
Source Files ¶
Directories ¶
Path | Synopsis |
---|---|
The metadata package defines types and functions for working with package metadata, which describes Go packages and their relationships.
|
The metadata package defines types and functions for working with package metadata, which describes Go packages and their relationships. |
Package methodsets defines an incremental, serializable index of method-set information that allows efficient 'implements' queries across packages of the workspace without using the type checker.
|
Package methodsets defines an incremental, serializable index of method-set information that allows efficient 'implements' queries across packages of the workspace without using the type checker. |
The parsego package defines the File type, a wrapper around a go/ast.File that is useful for answering LSP queries.
|
The parsego package defines the File type, a wrapper around a go/ast.File that is useful for answering LSP queries. |
Package typerefs extracts symbol-level reachability information from the syntax of a Go package.
|
Package typerefs extracts symbol-level reachability information from the syntax of a Go package. |
Package xrefs defines the serializable index of cross-package references that is computed during type checking.
|
Package xrefs defines the serializable index of cross-package references that is computed during type checking. |