private async Task <Solution> UpdateProjectsAsync(Solution solution, HashSet <Checksum> oldChecksums, HashSet <Checksum> newChecksums) { var oldMap = await GetProjectMapAsync(solution, oldChecksums).ConfigureAwait(false); var newMap = await GetProjectMapAsync(_assetProvider, newChecksums).ConfigureAwait(false); // bulk sync assets await SynchronizeAssetsAsync(oldMap, newMap).ConfigureAwait(false); // added project foreach (var(projectId, newProjectChecksums) in newMap) { if (!oldMap.ContainsKey(projectId)) { var projectInfo = await _assetProvider.CreateProjectInfoAsync(newProjectChecksums.Checksum, _cancellationToken).ConfigureAwait(false); if (projectInfo == null) { // this project is not supported in OOP continue; } // we have new project added solution = solution.AddProject(projectInfo); } } // changed project foreach (var(projectId, newProjectChecksums) in newMap) { if (!oldMap.TryGetValue(projectId, out var oldProjectChecksums)) { continue; } Contract.ThrowIfTrue(oldProjectChecksums.Checksum == newProjectChecksums.Checksum); solution = await UpdateProjectAsync(solution.GetProject(projectId) !, oldProjectChecksums, newProjectChecksums).ConfigureAwait(false); } // removed project foreach (var(projectId, _) in oldMap) { if (!newMap.ContainsKey(projectId)) { // we have a project removed solution = solution.RemoveProject(projectId); } } return(solution); }
private async Task <Solution> UpdateProjectsAsync(Solution solution, HashSet <Checksum> oldChecksums, HashSet <Checksum> newChecksums, CancellationToken cancellationToken) { var oldMap = await GetProjectMapAsync(solution, oldChecksums, cancellationToken).ConfigureAwait(false); var newMap = await GetProjectMapAsync(_assetProvider, newChecksums, cancellationToken).ConfigureAwait(false); // bulk sync assets await SynchronizeAssetsAsync(oldMap, newMap, cancellationToken).ConfigureAwait(false); // added project foreach (var(projectId, newProjectChecksums) in newMap) { if (!oldMap.ContainsKey(projectId)) { var projectInfo = await _assetProvider.CreateProjectInfoAsync(newProjectChecksums.Checksum, cancellationToken).ConfigureAwait(false); if (projectInfo == null) { // this project is not supported in OOP continue; } // we have new project added solution = solution.AddProject(projectInfo); } } // remove all project references from projects that changed. this ensures exceptions will not occur for // cyclic references during an incremental update. foreach (var(projectId, newProjectChecksums) in newMap) { if (!oldMap.TryGetValue(projectId, out var oldProjectChecksums)) { continue; } if (oldProjectChecksums.ProjectReferences.Checksum != newProjectChecksums.ProjectReferences.Checksum) { solution = solution.WithProjectReferences(projectId, SpecializedCollections.EmptyEnumerable <ProjectReference>()); } } // removed project foreach (var(projectId, _) in oldMap) { if (!newMap.ContainsKey(projectId)) { // we have a project removed solution = solution.RemoveProject(projectId); } } // changed project foreach (var(projectId, newProjectChecksums) in newMap) { if (!oldMap.TryGetValue(projectId, out var oldProjectChecksums)) { continue; } Contract.ThrowIfTrue(oldProjectChecksums.Checksum == newProjectChecksums.Checksum); solution = await UpdateProjectAsync(solution.GetRequiredProject(projectId), oldProjectChecksums, newProjectChecksums, cancellationToken).ConfigureAwait(false); } return(solution); }