in src/Engines/CompleteRequestHandler.cs [41:97]
public async Task HandleAsync(Message message)
{
await engine.Initialized;
var request = message.Content as CompleteRequestContent;
if (request == null)
{
logger.LogError("Expected completion result content, but got {Type} instead.", message.Content.GetType());
return;
}
this.logger.LogDebug("Ask to complete code at cursor position {CursorPos}:\n{Code}", request.CursorPos, request.Code);
shellServer.NotifyBusyStatus(message, ExecutionState.Busy);
try
{
var completion = await engine.Complete(request.Code, request.CursorPos);
// If we got a completion back from the engine that was anything
// other than null, respond with it here. Note that unlike execute_request,
// it's ok to just ignore a complete request that we don't know
// how to handle.
if (completion != null)
{
this.shellServer.SendShellMessage(
new Message
{
Content = new CompleteReplyContent
{
CompleteStatus = completion.Value.Status,
Matches = completion.Value.Matches.ToList(),
CursorStart = completion.Value.CursorStart ?? request.CursorPos,
CursorEnd = completion.Value.CursorEnd ?? request.CursorPos
},
Header = new MessageHeader
{
MessageType = "complete_reply"
}
}
.AsReplyTo(message)
);
}
return;
}
catch (TaskCanceledException tce)
{
this.logger?.LogDebug(tce, "Task cancelled.");
return;
}
catch (Exception e)
{
this.logger?.LogError(e, "Unable to process CompleteRequest.");
return;
}
finally
{
shellServer.NotifyBusyStatus(message, ExecutionState.Idle);
}
}