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);
            }
        }