public async Task <Solution> CreateSolutionAsync(Checksum newSolutionChecksum, CancellationToken cancellationToken) { try { var solution = _baseSolution; // If we previously froze a source generated document and then held onto that, unfreeze it now. We'll re-freeze the new document // if needed again later. solution = solution.WithoutFrozenSourceGeneratedDocuments(); var oldSolutionChecksums = await solution.State.GetStateChecksumsAsync(cancellationToken).ConfigureAwait(false); var newSolutionChecksums = await _assetProvider.GetAssetAsync <SolutionStateChecksums>(newSolutionChecksum, cancellationToken).ConfigureAwait(false); if (oldSolutionChecksums.Attributes != newSolutionChecksums.Attributes) { var newSolutionInfo = await _assetProvider.GetAssetAsync <SolutionInfo.SolutionAttributes>(newSolutionChecksums.Attributes, cancellationToken).ConfigureAwait(false); // if either id or file path has changed, then this is not update Contract.ThrowIfFalse(solution.Id == newSolutionInfo.Id && solution.FilePath == newSolutionInfo.FilePath); } if (oldSolutionChecksums.Projects.Checksum != newSolutionChecksums.Projects.Checksum) { solution = await UpdateProjectsAsync(solution, oldSolutionChecksums.Projects, newSolutionChecksums.Projects, cancellationToken).ConfigureAwait(false); } if (oldSolutionChecksums.AnalyzerReferences.Checksum != newSolutionChecksums.AnalyzerReferences.Checksum) { solution = solution.WithAnalyzerReferences(await _assetProvider.CreateCollectionAsync <AnalyzerReference>( newSolutionChecksums.AnalyzerReferences, cancellationToken).ConfigureAwait(false)); } if (newSolutionChecksums.FrozenSourceGeneratedDocumentIdentity != Checksum.Null && newSolutionChecksums.FrozenSourceGeneratedDocumentText != Checksum.Null) { var identity = await _assetProvider.GetAssetAsync <SourceGeneratedDocumentIdentity>(newSolutionChecksums.FrozenSourceGeneratedDocumentIdentity, cancellationToken).ConfigureAwait(false); var serializableSourceText = await _assetProvider.GetAssetAsync <SerializableSourceText>(newSolutionChecksums.FrozenSourceGeneratedDocumentText, cancellationToken).ConfigureAwait(false); var sourceText = await serializableSourceText.GetTextAsync(cancellationToken).ConfigureAwait(false); solution = solution.WithFrozenSourceGeneratedDocument(identity, sourceText).Project.Solution; } #if DEBUG // make sure created solution has same checksum as given one await ValidateChecksumAsync(newSolutionChecksum, solution, cancellationToken).ConfigureAwait(false); #endif return(solution); } catch (Exception e) when(FatalError.ReportAndPropagateUnlessCanceled(e)) { throw ExceptionUtilities.Unreachable; } }
public async Task <Solution> CreateSolutionAsync(Checksum newSolutionChecksum) { try { var solution = _baseSolution; var oldSolutionChecksums = await solution.State.GetStateChecksumsAsync(_cancellationToken).ConfigureAwait(false); var newSolutionChecksums = await _assetProvider.GetAssetAsync <SolutionStateChecksums>(newSolutionChecksum, _cancellationToken).ConfigureAwait(false); if (oldSolutionChecksums.Attributes != newSolutionChecksums.Attributes) { var newSolutionInfo = await _assetProvider.GetAssetAsync <SolutionInfo.SolutionAttributes>(newSolutionChecksums.Attributes, _cancellationToken).ConfigureAwait(false); // if either id or file path has changed, then this is not update Contract.ThrowIfFalse(solution.Id == newSolutionInfo.Id && solution.FilePath == newSolutionInfo.FilePath); } if (oldSolutionChecksums.Options != newSolutionChecksums.Options) { var newOptions = await _assetProvider.GetAssetAsync <SerializableOptionSet>(newSolutionChecksums.Options, _cancellationToken).ConfigureAwait(false); solution = solution.WithOptions(newOptions); } if (oldSolutionChecksums.Projects.Checksum != newSolutionChecksums.Projects.Checksum) { solution = await UpdateProjectsAsync(solution, oldSolutionChecksums.Projects, newSolutionChecksums.Projects).ConfigureAwait(false); } if (oldSolutionChecksums.AnalyzerReferences.Checksum != newSolutionChecksums.AnalyzerReferences.Checksum) { solution = solution.WithAnalyzerReferences(await _assetProvider.CreateCollectionAsync <AnalyzerReference>( newSolutionChecksums.AnalyzerReferences, _cancellationToken).ConfigureAwait(false)); } #if DEBUG // make sure created solution has same checksum as given one await ValidateChecksumAsync(newSolutionChecksum, solution).ConfigureAwait(false); #endif return(solution); } catch (Exception e) when(FatalError.ReportAndPropagateUnlessCanceled(e)) { throw ExceptionUtilities.Unreachable; } }
public async Task <Solution> CreateSolutionAsync(Checksum newSolutionChecksum) { try { var solution = _baseSolution; var oldSolutionChecksums = await solution.State.GetStateChecksumsAsync(_cancellationToken).ConfigureAwait(false); var newSolutionChecksums = await _assetProvider.GetAssetAsync <SolutionStateChecksums>(newSolutionChecksum, _cancellationToken).ConfigureAwait(false); if (oldSolutionChecksums.Attributes != newSolutionChecksums.Attributes) { var newSolutionInfo = await _assetProvider.GetAssetAsync <SolutionInfo.SolutionAttributes>(newSolutionChecksums.Attributes, _cancellationToken).ConfigureAwait(false); // if either id or file path has changed, then this is not update Contract.ThrowIfFalse(solution.Id == newSolutionInfo.Id && solution.FilePath == newSolutionInfo.FilePath); } if (oldSolutionChecksums.Options != newSolutionChecksums.Options) { var newOptions = await _assetProvider.GetAssetAsync <SerializableOptionSet>(newSolutionChecksums.Options, _cancellationToken).ConfigureAwait(false); solution = solution.WithOptions(newOptions); } if (oldSolutionChecksums.Projects.Checksum != newSolutionChecksums.Projects.Checksum) { solution = await UpdateProjectsAsync(solution, oldSolutionChecksums.Projects, newSolutionChecksums.Projects).ConfigureAwait(false); } if (oldSolutionChecksums.AnalyzerReferences.Checksum != newSolutionChecksums.AnalyzerReferences.Checksum) { solution = solution.WithAnalyzerReferences(await _assetProvider.CreateCollectionAsync <AnalyzerReference>( newSolutionChecksums.AnalyzerReferences, _cancellationToken).ConfigureAwait(false)); } // The old solution should never have any frozen source generated documents -- those are only created and forked off of // a workspaces's CurrentSolution Contract.ThrowIfFalse(solution.State.FrozenSourceGeneratedDocumentState == null); if (newSolutionChecksums.FrozenSourceGeneratedDocumentIdentity != Checksum.Null && newSolutionChecksums.FrozenSourceGeneratedDocumentText != Checksum.Null) { var identity = await _assetProvider.GetAssetAsync <SourceGeneratedDocumentIdentity>(newSolutionChecksums.FrozenSourceGeneratedDocumentIdentity, _cancellationToken).ConfigureAwait(false); var serializableSourceText = await _assetProvider.GetAssetAsync <SerializableSourceText>(newSolutionChecksums.FrozenSourceGeneratedDocumentText, _cancellationToken).ConfigureAwait(false); var sourceText = await serializableSourceText.GetTextAsync(_cancellationToken).ConfigureAwait(false); solution = solution.WithFrozenSourceGeneratedDocument(identity, sourceText).Project.Solution; } #if DEBUG // make sure created solution has same checksum as given one await ValidateChecksumAsync(newSolutionChecksum, solution).ConfigureAwait(false); #endif return(solution); } catch (Exception e) when(FatalError.ReportAndPropagateUnlessCanceled(e)) { throw ExceptionUtilities.Unreachable; } }
private async Task <Solution> UpdateProjectAsync(Project project, ProjectStateChecksums oldProjectChecksums, ProjectStateChecksums newProjectChecksums) { // changed info if (oldProjectChecksums.Info != newProjectChecksums.Info) { project = await UpdateProjectInfoAsync(project, newProjectChecksums.Info).ConfigureAwait(false); } // changed compilation options if (oldProjectChecksums.CompilationOptions != newProjectChecksums.CompilationOptions) { project = project.WithCompilationOptions( project.State.ProjectInfo.Attributes.FixUpCompilationOptions( await _assetProvider.GetAssetAsync <CompilationOptions>( newProjectChecksums.CompilationOptions, _cancellationToken).ConfigureAwait(false))); } // changed parse options if (oldProjectChecksums.ParseOptions != newProjectChecksums.ParseOptions) { project = project.WithParseOptions(await _assetProvider.GetAssetAsync <ParseOptions>(newProjectChecksums.ParseOptions, _cancellationToken).ConfigureAwait(false)); } // changed project references if (oldProjectChecksums.ProjectReferences.Checksum != newProjectChecksums.ProjectReferences.Checksum) { project = project.WithProjectReferences(await _assetProvider.CreateCollectionAsync <ProjectReference>( newProjectChecksums.ProjectReferences, _cancellationToken).ConfigureAwait(false)); } // changed metadata references if (oldProjectChecksums.MetadataReferences.Checksum != newProjectChecksums.MetadataReferences.Checksum) { project = project.WithMetadataReferences(await _assetProvider.CreateCollectionAsync <MetadataReference>( newProjectChecksums.MetadataReferences, _cancellationToken).ConfigureAwait(false)); } // changed analyzer references if (oldProjectChecksums.AnalyzerReferences.Checksum != newProjectChecksums.AnalyzerReferences.Checksum) { project = project.WithAnalyzerReferences(await _assetProvider.CreateCollectionAsync <AnalyzerReference>( newProjectChecksums.AnalyzerReferences, _cancellationToken).ConfigureAwait(false)); } // changed analyzer references if (oldProjectChecksums.Documents.Checksum != newProjectChecksums.Documents.Checksum) { project = await UpdateDocumentsAsync( project, project.State.DocumentStates.Values, oldProjectChecksums.Documents, newProjectChecksums.Documents, (solution, documents) => solution.AddDocuments(documents), (solution, documentId) => solution.RemoveDocument(documentId)).ConfigureAwait(false); } // changed additional documents if (oldProjectChecksums.AdditionalDocuments.Checksum != newProjectChecksums.AdditionalDocuments.Checksum) { project = await UpdateDocumentsAsync( project, project.State.AdditionalDocumentStates.Values, oldProjectChecksums.AdditionalDocuments, newProjectChecksums.AdditionalDocuments, (solution, documents) => solution.AddAdditionalDocuments(documents), (solution, documentId) => solution.RemoveAdditionalDocument(documentId)).ConfigureAwait(false); } // changed analyzer config documents if (oldProjectChecksums.AnalyzerConfigDocuments.Checksum != newProjectChecksums.AnalyzerConfigDocuments.Checksum) { project = await UpdateDocumentsAsync( project, project.State.AnalyzerConfigDocumentStates.Values, oldProjectChecksums.AnalyzerConfigDocuments, newProjectChecksums.AnalyzerConfigDocuments, (solution, documents) => solution.AddAnalyzerConfigDocuments(documents), (solution, documentId) => solution.RemoveAnalyzerConfigDocument(documentId)).ConfigureAwait(false); } return(project.Solution); }