private Task RefreshAvailableActions()
        {
            if (_selectedProject == null)
            {
                return(Task.FromResult(0));
            }

            _viewModel.IsLoading = true;
            _viewModel.Actions.Clear();
            var selectedProjectName = _selectedProject.Name;

            return(Task.Run(() =>
            {
                var classes = _selectedProject.GetClasses();
                foreach (CodeClass codeClass in classes)
                {
                    if (codeClass.IsDerivedFrom["Microsoft.AspNetCore.Mvc.Controller"])
                    {
                        var className = codeClass.Name;
                        var functions = VisualStudioHelper.GetAllCodeElementsOfType(codeClass.Members, vsCMElement.vsCMElementFunction, false);
                        foreach (CodeFunction function in functions)
                        {
                            var attributes = VisualStudioHelper.GetAllCodeElementsOfType(function.Attributes, vsCMElement.vsCMElementAttribute, false);
                            var parameters = VisualStudioHelper.GetAllCodeElementsOfType(function.Parameters, vsCMElement.vsCMElementParameter, false);
                            var parameterNames = new List <string>();
                            foreach (CodeParameter parameter in parameters)
                            {
                                parameterNames.Add(parameter.Name);
                            }

                            var functionName = function.Name;
                            if (parameterNames.Any())
                            {
                                functionName = functionName + "{" + string.Join(",", parameterNames) + "}";
                            }

                            foreach (CodeAttribute attribute in attributes)
                            {
                                if (_httpAttributeFullNames.Contains(attribute.FullName))
                                {
                                    ExecuteRequestToUi(() =>
                                    {
                                        _viewModel.Actions.Add(new ControllerActionViewModel
                                        {
                                            Application = selectedProjectName,
                                            Controller = className,
                                            Action = functionName,
                                            IsSelected = true,
                                            DisplayName = $"{className}/{functionName}"
                                        });
                                    });
                                }
                            }
                        }
                    }
                }

                ExecuteRequestToUi(() => _viewModel.IsLoading = false);
            }));
        }
Beispiel #2
0
 public static List <CodeElement> GetClasses(this Project project)
 {
     return(VisualStudioHelper.GetAllCodeElementsOfType(project.CodeModel.CodeElements, EnvDTE.vsCMElement.vsCMElementClass, false));
 }