diff --git a/src/PowerShellEditorServices/PowerShellEditorServices.csproj b/src/PowerShellEditorServices/PowerShellEditorServices.csproj index b4726773b..aef6604ff 100644 --- a/src/PowerShellEditorServices/PowerShellEditorServices.csproj +++ b/src/PowerShellEditorServices/PowerShellEditorServices.csproj @@ -39,7 +39,7 @@ - + @@ -49,7 +49,7 @@ - + diff --git a/src/PowerShellEditorServices/Services/TextDocument/Handlers/CodeActionHandler.cs b/src/PowerShellEditorServices/Services/TextDocument/Handlers/CodeActionHandler.cs index 7a9508192..7e238e4f7 100644 --- a/src/PowerShellEditorServices/Services/TextDocument/Handlers/CodeActionHandler.cs +++ b/src/PowerShellEditorServices/Services/TextDocument/Handlers/CodeActionHandler.cs @@ -62,6 +62,7 @@ public async Task Handle(CodeActionParams request, { if (cancellationToken.IsCancellationRequested) { + _logger.LogDebug("CodeAction request canceled at range: {0}", request.Range); return Array.Empty(); } diff --git a/src/PowerShellEditorServices/Services/TextDocument/Handlers/CompletionHandler.cs b/src/PowerShellEditorServices/Services/TextDocument/Handlers/CompletionHandler.cs index ffb10178d..5c6fa9324 100644 --- a/src/PowerShellEditorServices/Services/TextDocument/Handlers/CompletionHandler.cs +++ b/src/PowerShellEditorServices/Services/TextDocument/Handlers/CompletionHandler.cs @@ -25,6 +25,7 @@ internal class CompletionHandler : ICompletionHandler, ICompletionResolveHandler { const int DefaultWaitTimeoutMilliseconds = 5000; private readonly SemaphoreSlim _completionLock = AsyncUtils.CreateSimpleLockingSemaphore(); + private readonly SemaphoreSlim _completionResolveLock = AsyncUtils.CreateSimpleLockingSemaphore(); private readonly ILogger _logger; private readonly PowerShellContextService _powerShellContextService; @@ -67,7 +68,15 @@ public async Task Handle(CompletionParams request, CancellationT ScriptFile scriptFile = _workspaceService.GetFile(request.TextDocument.Uri); - await _completionLock.WaitAsync().ConfigureAwait(false); + try + { + await _completionLock.WaitAsync(cancellationToken).ConfigureAwait(false); + } + catch (OperationCanceledException) + { + _logger.LogDebug("Completion request canceled for file: {0}", request.TextDocument.Uri); + return Array.Empty(); + } try { @@ -116,22 +125,39 @@ public async Task Handle(CompletionItem request, CancellationTok return request; } - // Get the documentation for the function - CommandInfo commandInfo = - await CommandHelpers.GetCommandInfoAsync( - request.Label, - _powerShellContextService).ConfigureAwait(false); + try + { + await _completionResolveLock.WaitAsync(cancellationToken).ConfigureAwait(false); + } + catch (OperationCanceledException) + { + _logger.LogDebug("CompletionItemResolve request canceled for item: {0}", request.Label); + return request; + } - if (commandInfo != null) + try { - request.Documentation = - await CommandHelpers.GetCommandSynopsisAsync( - commandInfo, + // Get the documentation for the function + CommandInfo commandInfo = + await CommandHelpers.GetCommandInfoAsync( + request.Label, _powerShellContextService).ConfigureAwait(false); - } - // Send back the updated CompletionItem - return request; + if (commandInfo != null) + { + request.Documentation = + await CommandHelpers.GetCommandSynopsisAsync( + commandInfo, + _powerShellContextService).ConfigureAwait(false); + } + + // Send back the updated CompletionItem + return request; + } + finally + { + _completionResolveLock.Release(); + } } public void SetCapability(CompletionCapability capability) diff --git a/src/PowerShellEditorServices/Services/TextDocument/Handlers/FoldingRangeHandler.cs b/src/PowerShellEditorServices/Services/TextDocument/Handlers/FoldingRangeHandler.cs index 657694f97..aafee5b36 100644 --- a/src/PowerShellEditorServices/Services/TextDocument/Handlers/FoldingRangeHandler.cs +++ b/src/PowerShellEditorServices/Services/TextDocument/Handlers/FoldingRangeHandler.cs @@ -43,6 +43,7 @@ public Task> Handle(FoldingRangeRequestParam request, Ca { if (cancellationToken.IsCancellationRequested) { + _logger.LogDebug("FoldingRange request canceled for file: {0}", request.TextDocument.Uri); return Task.FromResult(new Container()); } diff --git a/src/PowerShellEditorServices/Services/TextDocument/Handlers/HoverHandler.cs b/src/PowerShellEditorServices/Services/TextDocument/Handlers/HoverHandler.cs index 307aa7b46..e6094a73e 100644 --- a/src/PowerShellEditorServices/Services/TextDocument/Handlers/HoverHandler.cs +++ b/src/PowerShellEditorServices/Services/TextDocument/Handlers/HoverHandler.cs @@ -48,6 +48,12 @@ public HoverRegistrationOptions GetRegistrationOptions() public async Task Handle(HoverParams request, CancellationToken cancellationToken) { + if (cancellationToken.IsCancellationRequested) + { + _logger.LogDebug("Hover request canceled for file: {0}", request.TextDocument.Uri); + return new Hover(); + } + ScriptFile scriptFile = _workspaceService.GetFile(request.TextDocument.Uri); SymbolDetails symbolDetails = @@ -56,21 +62,21 @@ await _symbolsService.FindSymbolDetailsAtLocationAsync( (int) request.Position.Line + 1, (int) request.Position.Character + 1).ConfigureAwait(false); - List symbolInfo = new List(); - Range symbolRange = null; - - if (symbolDetails != null) + if (symbolDetails == null) { - symbolInfo.Add(new MarkedString("PowerShell", symbolDetails.DisplayString)); + return new Hover(); + } - if (!string.IsNullOrEmpty(symbolDetails.Documentation)) - { - symbolInfo.Add(new MarkedString("markdown", symbolDetails.Documentation)); - } + List symbolInfo = new List(); + symbolInfo.Add(new MarkedString("PowerShell", symbolDetails.DisplayString)); - symbolRange = GetRangeFromScriptRegion(symbolDetails.SymbolReference.ScriptRegion); + if (!string.IsNullOrEmpty(symbolDetails.Documentation)) + { + symbolInfo.Add(new MarkedString("markdown", symbolDetails.Documentation)); } + Range symbolRange = GetRangeFromScriptRegion(symbolDetails.SymbolReference.ScriptRegion); + return new Hover { Contents = new MarkedStringsOrMarkupContent(symbolInfo), diff --git a/test/PowerShellEditorServices.Test.E2E/PowerShellEditorServices.Test.E2E.csproj b/test/PowerShellEditorServices.Test.E2E/PowerShellEditorServices.Test.E2E.csproj index b3225e1b5..243ab2a1d 100644 --- a/test/PowerShellEditorServices.Test.E2E/PowerShellEditorServices.Test.E2E.csproj +++ b/test/PowerShellEditorServices.Test.E2E/PowerShellEditorServices.Test.E2E.csproj @@ -10,7 +10,7 @@ - +