in src/Microsoft.VisualStudio.SlnGen/SlnHierarchy.cs [120:169]
private static void CreateHierarchy(SlnHierarchy hierarchy, SlnProject project)
{
FileInfo fileInfo = new FileInfo(project.FullPath);
DirectoryInfo directoryInfo = fileInfo.Directory;
if (hierarchy._pathToSlnFolderMap.TryGetValue(directoryInfo!.FullName, out SlnFolder childFolder))
{
childFolder.Projects.Add(project);
return;
}
childFolder = new SlnFolder(directoryInfo.FullName);
childFolder.Projects.Add(project);
hierarchy._pathToSlnFolderMap.Add(directoryInfo.FullName, childFolder);
directoryInfo = directoryInfo.Parent;
if (directoryInfo != null)
{
while (directoryInfo != null && !string.Equals(directoryInfo.FullName, hierarchy._rootFolder.FullPath, StringComparison.OrdinalIgnoreCase))
{
if (!hierarchy._pathToSlnFolderMap.TryGetValue(directoryInfo.FullName, out SlnFolder folder1))
{
folder1 = new SlnFolder(directoryInfo.FullName);
hierarchy._pathToSlnFolderMap.Add(directoryInfo.FullName, folder1);
}
childFolder.Parent = folder1;
if (!folder1.Folders.Contains(childFolder))
{
folder1.Folders.Add(childFolder);
}
directoryInfo = directoryInfo.Parent;
childFolder = folder1;
}
if (!hierarchy._rootFolder.Folders.Contains(childFolder))
{
hierarchy._rootFolder.Folders.Add(childFolder);
childFolder.Parent = hierarchy._rootFolder;
}
}
}