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