protected override void ApplyProjectChanges (ProjectChanges projectChanges) { try { internalChanges = true; this.projectChanges = projectChanges; base.ApplyProjectChanges (projectChanges); } finally { internalChanges = false; } }
protected override void ApplyProjectChanges(ProjectChanges projectChanges) { System.Diagnostics.Debug.Assert(_applyChangesProjectFile == null); var project = projectChanges.OldProject ?? projectChanges.NewProject; try { // if we need to modify the project file, load it first. if (this.HasProjectFileChanges(projectChanges)) { var projectPath = project.FilePath; IProjectFileLoader loader; if (this.TryGetLoaderFromProjectPath(projectPath, ReportMode.Ignore, out loader)) { try { _applyChangesProjectFile = loader.LoadProjectFileAsync(projectPath, _properties, CancellationToken.None).Result; } catch (System.IO.IOException exception) { this.OnWorkspaceFailed(new ProjectDiagnostic(WorkspaceDiagnosticKind.Failure, exception.Message, projectChanges.ProjectId)); } } } // do normal apply operations base.ApplyProjectChanges(projectChanges); // save project file if (_applyChangesProjectFile != null) { try { _applyChangesProjectFile.Save(); } catch (System.IO.IOException exception) { this.OnWorkspaceFailed(new ProjectDiagnostic(WorkspaceDiagnosticKind.Failure, exception.Message, projectChanges.ProjectId)); } } } finally { _applyChangesProjectFile = null; } }
protected override void ApplyProjectChanges(ProjectChanges projectChanges) { System.Diagnostics.Debug.Assert(this.applyChangesProjectFile == null); var project = projectChanges.OldProject ?? projectChanges.NewProject; try { // if we need to modify the project file, load it first. if (projectChanges.GetAddedDocuments().Any() || projectChanges.GetRemovedDocuments().Any()) { var projectPath = project.FilePath; var loader = this.GetLoaderFromProjectPath(projectPath); if (loader != null) { try { this.applyChangesProjectFile = loader.LoadProjectFileAsync(projectPath, this.properties, CancellationToken.None).Result; } catch (System.IO.IOException exception) { this.OnWorkspaceFailed(new ProjectDiagnostic(WorkspaceDiagnosticKind.FileAccessFailure, exception.Message, projectChanges.ProjectId)); } } } // do normal apply operations base.ApplyProjectChanges(projectChanges); // save project file if (this.applyChangesProjectFile != null) { try { this.applyChangesProjectFile.Save(); } catch (System.IO.IOException exception) { this.OnWorkspaceFailed(new ProjectDiagnostic(WorkspaceDiagnosticKind.FileAccessFailure, exception.Message, projectChanges.ProjectId)); } } } finally { this.applyChangesProjectFile = null; } }
private bool HasProjectFileChanges(ProjectChanges changes) { return changes.GetAddedDocuments().Any() || changes.GetRemovedDocuments().Any() || changes.GetAddedMetadataReferences().Any() || changes.GetRemovedMetadataReferences().Any() || changes.GetAddedProjectReferences().Any() || changes.GetRemovedProjectReferences().Any() || changes.GetAddedAnalyzerReferences().Any() || changes.GetRemovedAnalyzerReferences().Any(); }
/// <summary> /// This method is called during ApplyChanges for each project that has been added, removed or changed. /// /// Override this method if you want to modify how project changes are applied. /// </summary> protected virtual void ApplyProjectChanges(ProjectChanges projectChanges) { // removed project references foreach (var removedProjectReference in projectChanges.GetRemovedProjectReferences()) { this.RemoveProjectReference(projectChanges.ProjectId, removedProjectReference); } // added project references foreach (var addedProjectReference in projectChanges.GetAddedProjectReferences()) { this.AddProjectReference(projectChanges.ProjectId, addedProjectReference); } // removed metadata references foreach (var metadata in projectChanges.GetRemovedMetadataReferences()) { this.RemoveMetadataReference(projectChanges.ProjectId, metadata); } // added metadata references foreach (var metadata in projectChanges.GetAddedMetadataReferences()) { this.AddMetadataReference(projectChanges.ProjectId, metadata); } // removed analyzer references foreach (var analyzerReference in projectChanges.GetRemovedAnalyzerReferences()) { this.RemoveAnalyzerReference(projectChanges.ProjectId, analyzerReference); } // added analyzer references foreach (var analyzerReference in projectChanges.GetAddedAnalyzerReferences()) { this.AddAnalyzerReference(projectChanges.ProjectId, analyzerReference); } // removed documents foreach (var documentId in projectChanges.GetRemovedDocuments()) { this.RemoveDocument(documentId); } // added documents foreach (var documentId in projectChanges.GetAddedDocuments()) { var doc = projectChanges.NewProject.GetDocument(documentId); var text = doc.GetTextAsync(CancellationToken.None).WaitAndGetResult(CancellationToken.None); // needs wait this.AddDocument(documentId, doc.Folders, doc.Name, text, doc.SourceCodeKind); } // changed documents foreach (var documentId in projectChanges.GetChangedDocuments()) { var oldDoc = projectChanges.OldProject.GetDocument(documentId); var newDoc = projectChanges.NewProject.GetDocument(documentId); // see whether we can get oldText SourceText oldText; if (!oldDoc.TryGetText(out oldText)) { // we can't get old text, there is not much we can do except replacing whole text. var currentText = newDoc.GetTextAsync(CancellationToken.None).WaitAndGetResult(CancellationToken.None); // needs wait this.ChangedDocumentText(documentId, currentText); continue; } // see whether we can get new text SourceText newText; if (!newDoc.TryGetText(out newText)) { // okay, we have old text, but no new text. let document to determine text changes var textChanges = newDoc.GetTextChangesAsync(oldDoc, CancellationToken.None).WaitAndGetResult(CancellationToken.None); // needs wait this.ChangedDocumentText(documentId, oldText.WithChanges(textChanges)); continue; } // we have both old and new text, just update using the new text. this.ChangedDocumentText(documentId, newText); } }