private IList<string> GetProjectSourceFolders(ProjectFileConfiguration projectFileConfiguration, string serviceRootFolder)
{
// Start with the standard generated code folders for the platform
var sourceCodeFolders = new List<string>
{
"Generated",
@"Generated\Model",
@"Generated\Model\Internal",
@"Generated\Model\Internal\MarshallTransformations"
};
var platformSubFolders = projectFileConfiguration.PlatformCodeFolders;
sourceCodeFolders.AddRange(platformSubFolders.Select(folder => Path.Combine(@"Generated", folder)));
// Augment the returned folders with any custom subfolders already in existence. If the custom folder
// ends with a recognised platform, only add it to the set if it matches the platform being generated
if (Directory.Exists(serviceRootFolder))
{
var subFolders = Directory.GetDirectories(serviceRootFolder, "*", SearchOption.AllDirectories);
if (subFolders.Any())
{
foreach (var folder in subFolders)
{
var serviceRelativeFolder = folder.Substring(serviceRootFolder.Length);
if (!serviceRelativeFolder.StartsWith(@"\Custom", StringComparison.OrdinalIgnoreCase))
continue;
if (projectFileConfiguration.IsPlatformCodeFolder(serviceRelativeFolder))
{
if (projectFileConfiguration.IsValidPlatformPathForProject(serviceRelativeFolder))
sourceCodeFolders.Add(serviceRelativeFolder.TrimStart('\\'));
}
else
sourceCodeFolders.Add(serviceRelativeFolder.TrimStart('\\'));
}
}
}
var foldersThatExist = new List<string>();
foreach (var folder in sourceCodeFolders)
{
if (Directory.Exists(Path.Combine(serviceRootFolder, folder)))
foldersThatExist.Add(folder);
}
// sort so we get a predictable layout
foldersThatExist.Sort(StringComparer.OrdinalIgnoreCase);
return foldersThatExist;
}