Esempio n. 1
0
 /// <summary>
 /// Dismiss the current running completion request
 /// </summary>
 private static void DismissGetCompletionResults()
 {
     try
     {
         CommandCompletionHelper.DismissCommandCompletionListRequest();
     }
     catch
     {
         Logger.DebugFormat("Failed to stop existing completion.");
         //ServiceCommon.Log("Failed to stop the existing one.");
     }
 }
Esempio n. 2
0
 /// <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);
 }
Esempio n. 3
0
        /// <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);
                }
            });
        }