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);
            }
        }
            public bool TryParse(string line, Queue <string> queue, Func <List <Node> > getChildNodes, out Node node)
            {
                node = default;

                if (!line.Contains(" = ") ||
                    !line.Contains('\"') ||
                    !line.IsHierarchicalStart(queue, out var name))
                {
                    return(false);
                }

                var parameterStart = line.IndexOf('"') + 1;
                var parameterEnd   = line.IndexOf('"', parameterStart + 1);
                var parameter      = line.Substring(parameterStart, parameterEnd - parameterStart);

                var values = line
                             .Substring(parameterEnd + "\") = ".Length)
                             .Split("\", \"")
                             .Select(x => x.Trim('\"'))
                             .ToList();

                node = new SolutionItemComplexNode(name, parameter, values, getChildNodes());
                return(true);
            }