internal/langserver/handlers/complete.go (44 lines of code) (raw):
package handlers
import (
"context"
lsctx "github.com/Azure/azapi-lsp/internal/context"
"github.com/Azure/azapi-lsp/internal/langserver/handlers/complete"
ilsp "github.com/Azure/azapi-lsp/internal/lsp"
lsp "github.com/Azure/azapi-lsp/internal/protocol"
)
func (svc *service) TextDocumentComplete(ctx context.Context, params lsp.CompletionParams) (lsp.CompletionList, error) {
var list lsp.CompletionList
fs, err := lsctx.DocumentStorage(ctx)
if err != nil {
return list, err
}
_, err = ilsp.ClientCapabilities(ctx)
if err != nil {
return list, err
}
doc, err := fs.GetDocument(ilsp.FileHandlerFromDocumentURI(params.TextDocument.URI))
if err != nil {
return list, err
}
fPos, err := ilsp.FilePositionFromDocumentPosition(params.TextDocumentPositionParams, doc)
if err != nil {
return list, err
}
svc.logger.Printf("Looking for candidates at %q -> %#v", doc.Filename(), fPos.Position())
data, err := doc.Text()
if err != nil {
return list, err
}
candidates := lsp.CompletionList{
IsIncomplete: false,
Items: complete.CandidatesAtPos(data, doc.Filename(), fPos.Position(), svc.logger),
}
if len(candidates.Items) > 0 {
telemetrySender, err := lsctx.Telemetry(ctx)
if err != nil {
return candidates, err
}
telemetrySender.SendEvent(ctx, "textDocument/completion", nil)
}
return candidates, err
}