Exemplo n.º 1
0
        /// <summary>
        /// Processes individual project.
        /// </summary>
        /// <returns>Whether project's been processed or not.</returns>
        private bool ProcessProject(Project project, ICollection <ProjectModel> model, ProcessorFlags flags, CodeModelFilterFlags filter)
        {
            ThreadHelper.ThrowIfNotOnUIThread();

            var process  = true;
            var language = string.Empty;

            // Safety check & language retrieval
            try
            {
                var items = project.ProjectItems;
                if ((items != null) && (items.Count > 0))
                {
                    if (_shellProjectService.IsCodeModelProject(project))
                    {
                        language = _shellProjectService.GetProjectLanguage(project);
                        if (string.IsNullOrEmpty(language))
                        {
                            process = false;
                        }
                    }
                    else
                    {
                        language = _shellProjectService.GetNoCodeModelProjectLanguage(project);
                        if (string.IsNullOrEmpty(language))
                        {
                            process = false;
                        }
                    }
                }
            }
            catch (NotImplementedException)             // This is an acceptable condition - keep on going
            {
                process = false;
                _log.LogMessage($"Project '{project?.Name}' doesn't implement code model");
            }
            catch (Exception ex)             // But this is a legit problem - keep on going anyways
            {
                process = false;
                _log.LogMessage("Failed to retrieve project code model / language", ex);
            }

            string projectFullName = string.Empty;

            if (process)
            {
                _shellProjectService.GetProjectPath(project, out string projectPath, out projectFullName);
                if ((string.IsNullOrEmpty(projectPath) || string.IsNullOrEmpty(projectFullName)) && _shellProjectService.IsProject(project))
                {
                    process = false;
                    _log.LogMessage($"Project '{project?.Name}' path is not available");
                }
            }

            if (process)
            {
                var projectModel = new ProjectModel
                {
                    Project      = project,
                    Name         = project.Name,
                    FriendlyName = _shellProjectService.GetFriendlyProjectName(project),
                    FileName     = projectFullName,
                    Language     = _languageService.GetLanguage(language)
                };

                if (flags.HasFlag(ProcessorFlags.IncludeFiles))
                {
                    var files = _projectProcessor.GetFiles(project, flags, filter);
                    if (files != null)
                    {
                        projectModel.Files.AddRange(files);
                        files.ForEach(f => f.Project = projectModel);
                    }
                }

                model.Add(projectModel);
            }

            return(process);
        }