private void SyncProjectsAndFolders( SlnFile slnFile, SolutionItemComplexNode slnParent, SolutionFolderModel modelParent, IEnumerable <SolutionFolderModel> modelFolders, List <Node> projectConfigurationPlatforms, IReadOnlyCollection <string> solutionConfigurationPlatforms) { foreach (var projectModel in Projects.Where(x => x.ParentFolder?.Id == modelParent?.Id)) { var path = $"{projectModel.ToOutputTargetConfig().RelativeLocation}\\{projectModel.Name}.{projectModel.FileExtension}".Replace("/", "\\"); if (!slnFile.GetOrCreateProjectNode( typeId: VisualStudioSolution.ProjectTypeIds.CsProject, name: projectModel.Name, path: path, id: projectModel.Id, parentId: slnParent?.Id, project: out var slnProject)) { projectConfigurationPlatforms.AddRange(solutionConfigurationPlatforms .SelectMany( _ => SolutionConfigurationPlatformTypes, (platform, platformType) => new KeyValueNode($"{slnProject.Id}.{platform}.{platformType}", platform))); continue; } slnProject.Values[0] = projectModel.Name; slnProject.Values[1] = path; slnFile.SetParent(slnProject, slnParent); } foreach (var folderModel in modelFolders) { if (slnFile.GetOrCreateProjectNode( typeId: VisualStudioSolution.ProjectTypeIds.SolutionFolder, name: folderModel.Name, path: folderModel.Name, id: folderModel.Id, parentId: slnParent?.Id, project: out var slnFolder)) { slnFolder.Values[0] = folderModel.Name; slnFolder.Values[1] = folderModel.Name; slnFile.SetParent(slnFolder, slnParent); } SyncProjectsAndFolders( slnFile: slnFile, slnParent: slnFolder, modelParent: folderModel, modelFolders: folderModel.Folders, projectConfigurationPlatforms: projectConfigurationPlatforms, solutionConfigurationPlatforms: solutionConfigurationPlatforms); } }