/// <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); }