blob: 5a9d0aca5e28a245cd492fd525b75a81132ab11e [file] [log] [blame]
// Copyright 2023 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// The file package defines types used for working with LSP files.
package file
import (
"context"
"fmt"
"golang.org/x/tools/gopls/internal/lsp/protocol"
)
// An Identity identifies the name and contents of a file.
//
// TODO(rfindley): Identity may not carry its weight. Consider instead just
// exposing Handle.Hash, and using an ad-hoc key type where necessary.
// Or perhaps if mod/work parsing is moved outside of the memoize cache,
// a notion of Identity simply isn't needed.
type Identity struct {
URI protocol.DocumentURI
Hash Hash // digest of file contents
}
func (id Identity) String() string {
return fmt.Sprintf("%s%s", id.URI, id.Hash)
}
// A FileHandle represents the URI, content, hash, and optional
// version of a file tracked by the LSP session.
//
// File content may be provided by the file system (for Saved files)
// or from an overlay, for open files with unsaved edits.
// A FileHandle may record an attempt to read a non-existent file,
// in which case Content returns an error.
type Handle interface {
// URI is the URI for this file handle.
URI() protocol.DocumentURI
// Identity returns an Identity for the file, even if there was an error
// reading it.
Identity() Identity
// SameContentsOnDisk reports whether the file has the same content on disk:
// it is false for files open on an editor with unsaved edits.
SameContentsOnDisk() bool
// Version returns the file version, as defined by the LSP client.
// For on-disk file handles, Version returns 0.
Version() int32
// Content returns the contents of a file.
// If the file is not available, returns a nil slice and an error.
Content() ([]byte, error)
}
// A Source maps URIs to Handles.
type Source interface {
// ReadFile returns the Handle for a given URI, either by reading the content
// of the file or by obtaining it from a cache.
//
// Invariant: ReadFile must only return an error in the case of context
// cancellation. If ctx.Err() is nil, the resulting error must also be nil.
ReadFile(ctx context.Context, uri protocol.DocumentURI) (Handle, error)
}