Example #1
0
        public void GetParameterCompletionData(Token token, string completionWord, long triggerTag)
        {
            if (_requestTrigger != 0 || triggerTag <= _requestTrigger)
            {
                return;
            }

            lock (_syncLock)
            {
                _requestTrigger = triggerTag;
            }

            Task.Run(() =>
            {
                var runbook = _backendContext.Runbooks.FirstOrDefault(item => (item.Tag as RunbookModelProxy).RunbookName.Equals(token.Text, StringComparison.InvariantCultureIgnoreCase));

                if (runbook == null)
                {
                    return;
                }

                var runbookViewModel = (runbook.Tag as RunbookModelProxy).GetViewModel <RunbookViewModel>();
                var parameters       = runbookViewModel.GetParameters(completionWord);

                var completionData = parameters.ToList();

                OnCompletionCompleted?.Invoke(this, new CompletionEventArgs(completionData));

                // Reset trigger
                lock (_syncLock)
                {
                    _requestTrigger = 0;
                }
            });
        }
Example #2
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);
                }
            });
        }