/// <summary> /// Initializes the Powershell code completion engine, since it takes quite a while /// for the first completion to complete. /// </summary> public void Initialize() { CommandCompletionHelper.GetCommandCompletionList("Write-", 6, _runspace); }
/// <summary> /// Processes a completion request by sending it to the powershell completion engine. /// </summary> /// <param name="content">Script to complete</param> /// <param name="completionWord">Word to complete</param> /// <param name="position">Caret offset</param> /// <param name="triggerTag">Counter</param> private void ProcessCompletion(string content, char?triggerChar, string completionWord, Token runbookToken, int position, long triggerTag) { lock (_syncLock) { _requestTrigger = triggerTag; } Task.Run(() => { try { CommandCompletion commandCompletion = null; lock (_syncLock) { if (_runspace.RunspaceAvailability == RunspaceAvailability.Available /*&& (completionWord.StartsWith("$") || (triggerChar.HasValue || && triggerChar.Value.Equals("-")) || )*/ ) { commandCompletion = CommandCompletionHelper.GetCommandCompletionList(content, position, _runspace); } } var completionData = new List <ICompletionData>(); if (!string.IsNullOrEmpty(completionWord)) { // Add snippets completionData.AddRange(_snippetsCollection.Snippets.Where(item => item.Name.StartsWith(completionWord, StringComparison.InvariantCultureIgnoreCase)).Select(item => new SnippetCompletionData(item))); // Add SMA cmdlets completionData.AddRange(_smaCmdlets.Where(item => item.StartsWith(completionWord, StringComparison.InvariantCultureIgnoreCase)).Select(item => new KeywordCompletionData(item))); // Add runbooks matching the completion word completionData.AddRange(_backendContext.Runbooks.Where(item => (item.Tag as RunbookModelProxy).RunbookName.StartsWith(completionWord, StringComparison.InvariantCultureIgnoreCase)).Select(item => new KeywordCompletionData((item.Tag as RunbookModelProxy).RunbookName)).ToList()); // Add runbook parameters if the completionWord is a runbook name if (runbookToken != null) { var runbook = _backendContext.Runbooks.FirstOrDefault(r => (r.Tag as RunbookModelProxy).RunbookName.Equals(runbookToken.Text, StringComparison.InvariantCultureIgnoreCase)); if (runbook != null) { var runbookViewModel = (runbook.Tag as RunbookModelProxy).GetViewModel <RunbookViewModel>(); var parameters = runbookViewModel.GetParameters(completionWord); completionData.AddRange(parameters); } } if (completionWord.Contains("$Using:")) { // Since the built in code completion doesn't handle $Using: variables, we'll help it by providing it ourself :) // TODO somehow... } } //if (commandCompletion == null) // return; if (commandCompletion == null && completionData.Count == 0) { return; } // Add powershell completions if (commandCompletion != null) { foreach (var item in commandCompletion.CompletionMatches) { switch (item.ResultType) { case CompletionResultType.Type: case CompletionResultType.Keyword: completionData.Add(new KeywordCompletionData(item.CompletionText, Glyph.Keyword, item.ToolTip)); break; case CompletionResultType.Command: if (item.CompletionText.Contains("-")) { completionData.Add(new KeywordCompletionData(item.CompletionText, Glyph.MethodPublic, item.ToolTip)); } break; case CompletionResultType.ParameterName: completionData.Add(new ParameterCompletionData(item.CompletionText, string.Empty, item.ToolTip)); break; case CompletionResultType.ParameterValue: completionData.Add(new ParameterValueCompletionData(item.CompletionText, item.ToolTip)); break; case CompletionResultType.Property: completionData.Add(new ParameterCompletionData(item.CompletionText, string.Empty, item.ToolTip, false)); break; case CompletionResultType.Variable: completionData.Add(new VariableCompletionData(item.CompletionText, string.Empty)); break; } } } // Is this inferring performance penalties? completionData = completionData.OrderBy(item => item.Text).ToList(); OnCompletionCompleted?.Invoke(this, new CompletionEventArgs(completionData)); // Reset trigger lock (_syncLock) { _requestTrigger = 0; } } catch (Exception ex) { Logger.Error("Failed to retrieve the completion list per request due to exception: " + ex.Message, ex); } }); }