internal/langserver/handlers/did_change.go (54 lines of code) (raw):
package handlers
import (
"context"
"fmt"
lsctx "github.com/Azure/azapi-lsp/internal/context"
"github.com/Azure/azapi-lsp/internal/langserver/handlers/validate"
ilsp "github.com/Azure/azapi-lsp/internal/lsp"
lsp "github.com/Azure/azapi-lsp/internal/protocol"
)
func TextDocumentDidChange(ctx context.Context, params lsp.DidChangeTextDocumentParams) error {
p := lsp.DidChangeTextDocumentParams{
TextDocument: lsp.VersionedTextDocumentIdentifier{
TextDocumentIdentifier: lsp.TextDocumentIdentifier{
URI: params.TextDocument.URI,
},
Version: params.TextDocument.Version,
},
ContentChanges: params.ContentChanges,
}
fs, err := lsctx.DocumentStorage(ctx)
if err != nil {
return err
}
fh := ilsp.VersionedFileHandler(p.TextDocument)
f, err := fs.GetDocument(fh)
if err != nil {
return err
}
// Versions don't have to be consecutive, but they must be increasing
if int(p.TextDocument.Version) <= f.Version() {
_ = fs.CloseAndRemoveDocument(fh)
return fmt.Errorf("old version (%d) received, current version is %d. "+
"Unable to update %s. This is likely a bug, please report it",
int(p.TextDocument.Version), f.Version(), p.TextDocument.URI)
}
changes, err := ilsp.DocumentChanges(params.ContentChanges, f)
if err != nil {
return err
}
err = fs.ChangeDocument(fh, changes)
if err != nil {
return err
}
notifier, err := lsctx.DiagnosticsNotifier(ctx)
if err != nil {
return err
}
src, err := f.Text()
if err != nil {
return err
}
diags := validate.NewDiagnostics(src, f.Filename())
notifier.PublishHCLDiags(ctx, f.Dir(), diags)
return nil
}