@@ -24,7 +24,7 @@ namespace Microsoft.PowerShell.EditorServices.Handlers
24
24
internal class CompletionHandler : ICompletionHandler , ICompletionResolveHandler
25
25
{
26
26
const int DefaultWaitTimeoutMilliseconds = 5000 ;
27
- private readonly CompletionItem [ ] s_emptyCompletionResult = Array . Empty < CompletionItem > ( ) ;
27
+ private readonly SemaphoreSlim _completionLock = AsyncUtils . CreateSimpleLockingSemaphore ( ) ;
28
28
29
29
private readonly ILogger _logger ;
30
30
private readonly PowerShellContextService _powerShellContextService ;
@@ -67,24 +67,39 @@ public async Task<CompletionList> Handle(CompletionParams request, CancellationT
67
67
68
68
ScriptFile scriptFile = _workspaceService . GetFile ( request . TextDocument . Uri ) ;
69
69
70
- CompletionResults completionResults =
71
- await GetCompletionsInFileAsync (
72
- scriptFile ,
73
- cursorLine ,
74
- cursorColumn ) . ConfigureAwait ( false ) ;
70
+ await _completionLock . WaitAsync ( ) . ConfigureAwait ( false ) ;
75
71
76
- CompletionItem [ ] completionItems = s_emptyCompletionResult ;
77
-
78
- if ( completionResults != null )
72
+ try
79
73
{
80
- completionItems = new CompletionItem [ completionResults . Completions . Length ] ;
74
+ if ( cancellationToken . IsCancellationRequested )
75
+ {
76
+ _logger . LogDebug ( "Completion request canceled for file: {0}" , request . TextDocument . Uri ) ;
77
+ return Array . Empty < CompletionItem > ( ) ;
78
+ }
79
+
80
+ CompletionResults completionResults =
81
+ await GetCompletionsInFileAsync (
82
+ scriptFile ,
83
+ cursorLine ,
84
+ cursorColumn ) . ConfigureAwait ( false ) ;
85
+
86
+ if ( completionResults == null )
87
+ {
88
+ return Array . Empty < CompletionItem > ( ) ;
89
+ }
90
+
91
+ CompletionItem [ ] completionItems = new CompletionItem [ completionResults . Completions . Length ] ;
81
92
for ( int i = 0 ; i < completionItems . Length ; i ++ )
82
93
{
83
94
completionItems [ i ] = CreateCompletionItem ( completionResults . Completions [ i ] , completionResults . ReplacedRange , i + 1 ) ;
84
95
}
85
- }
86
96
87
- return new CompletionList ( completionItems ) ;
97
+ return completionItems ;
98
+ }
99
+ finally
100
+ {
101
+ _completionLock . Release ( ) ;
102
+ }
88
103
}
89
104
90
105
public bool CanResolve ( CompletionItem value )
0 commit comments