private IEnumerable <(string, ProjectIdInfo)> GetProjectPathsAndIdsFromSolution(string solutionFilePath) { _logger.LogInformation($"Detecting projects in '{solutionFilePath}'."); var solutionFile = SolutionFile.ParseFile(solutionFilePath); var processedProjects = new HashSet <string>(StringComparer.OrdinalIgnoreCase); var result = new List <(string, ProjectIdInfo)>(); foreach (var project in solutionFile.Projects) { if (project.IsNotSupported) { continue; } // Solution files are assumed to contain relative paths to project files with Windows-style slashes. var projectFilePath = project.RelativePath.Replace('\\', Path.DirectorySeparatorChar); projectFilePath = Path.Combine(_environment.TargetDirectory, projectFilePath); projectFilePath = Path.GetFullPath(projectFilePath); // Have we seen this project? If so, move on. if (processedProjects.Contains(projectFilePath)) { continue; } if (string.Equals(Path.GetExtension(projectFilePath), ".csproj", StringComparison.OrdinalIgnoreCase)) { var projectIdInfo = new ProjectIdInfo(ProjectId.CreateFromSerialized(new Guid(project.ProjectGuid)), true); result.Add((projectFilePath, projectIdInfo)); } processedProjects.Add(projectFilePath); } return(result); }
private IEnumerable <(string, ProjectIdInfo)> GetProjectPathsAndIdsFromSolution(string solutionFilePath) { _logger.LogInformation($"Detecting projects in '{solutionFilePath}'."); var solutionFile = SolutionFile.ParseFile(solutionFilePath); var processedProjects = new HashSet <string>(StringComparer.OrdinalIgnoreCase); var result = new List <(string, ProjectIdInfo)>(); var solutionConfigurations = new Dictionary <ProjectId, Dictionary <string, string> >(); foreach (var globalSection in solutionFile.GlobalSections) { // Try parse project configurations if they are remapped in solution file if (globalSection.Name == "ProjectConfigurationPlatforms") { _logger.LogDebug($"Parsing ProjectConfigurationPlatforms of '{solutionFilePath}'."); foreach (var entry in globalSection.Properties) { var guid = Guid.Parse(entry.Name.Substring(0, 38)); var projId = ProjectId.CreateFromSerialized(guid); var solutionConfig = entry.Name.Substring(39); if (!solutionConfigurations.TryGetValue(projId, out var dict)) { dict = new Dictionary <string, string>(); solutionConfigurations.Add(projId, dict); } dict.Add(solutionConfig, entry.Value); } } } foreach (var project in solutionFile.Projects) { if (project.IsNotSupported) { continue; } // Solution files are assumed to contain relative paths to project files with Windows-style slashes. var projectFilePath = project.RelativePath.Replace('\\', Path.DirectorySeparatorChar); projectFilePath = Path.Combine(_environment.TargetDirectory, projectFilePath); projectFilePath = Path.GetFullPath(projectFilePath); // Have we seen this project? If so, move on. if (processedProjects.Contains(projectFilePath)) { continue; } if (string.Equals(Path.GetExtension(projectFilePath), ".csproj", StringComparison.OrdinalIgnoreCase)) { var projectIdInfo = new ProjectIdInfo(ProjectId.CreateFromSerialized(new Guid(project.ProjectGuid)), true); if (solutionConfigurations.TryGetValue(projectIdInfo.Id, out var configurations)) { projectIdInfo.SolutionConfiguration = configurations; } result.Add((projectFilePath, projectIdInfo)); } processedProjects.Add(projectFilePath); } return(result); }