public static IEnumerable <string> EnumerateSourceFiles(this CustomProjectParserResult project, string folder = null) { folder ??= project.GetDirectory(); const string ObjFolder = "obj"; const string OutputFolder = "bin"; const string SearchPattern = "*.cs"; foreach (var file in System.IO.Directory.EnumerateFiles(folder, SearchPattern, System.IO.SearchOption.TopDirectoryOnly)) { yield return(file); } var ignoredSubFolders = new HashSet <string>() { ObjFolder, OutputFolder }; foreach (var subFolder in System.IO.Directory.EnumerateDirectories(folder)) { var subFolderName = new System.IO.DirectoryInfo(subFolder).Name; if (ignoredSubFolders.Contains(subFolderName)) { continue; } foreach (var file in System.IO.Directory.EnumerateFiles(subFolder, SearchPattern, System.IO.SearchOption.AllDirectories)) { yield return(file); } } }
public static IEnumerable <(string folder, CustomProjectParserResult project)> EnumerateProjects(this CustomProjectParserResult mainProject) { var result = new Dictionary <string, CustomProjectParserResult>(); void AddReferences(string folderPath, CustomProjectParserResult project) { foreach (var referencedProject in project.ProjectReferences.Select(p => ParseProject(p.FilePath, folderPath, project.Configuration, project.Platform))) { var directory = referencedProject.GetDirectory(); if (result.TryAdd(directory, referencedProject)) { AddReferences(directory, referencedProject); } else if (!string.Equals(referencedProject.ProjectFilePath.FullPath, result[directory].ProjectFilePath.FullPath, StringComparison.OrdinalIgnoreCase)) { throw new Exception("Found two or more projects in the same directory."); } } } var mainDirectory = mainProject.GetDirectory(); result.Add(mainDirectory, mainProject); AddReferences(mainDirectory, mainProject); foreach (var pair in result) { yield return(pair.Key, pair.Value); } }