Пример #1
0
		protected override void ApplyProjectChanges (ProjectChanges projectChanges)
		{
			try {
				internalChanges = true;
				this.projectChanges = projectChanges;
				base.ApplyProjectChanges (projectChanges);
			} finally {
				internalChanges = false;
			}
		}
Пример #2
0
        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;
            }
        }
Пример #3
0
        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;
            }
        }
Пример #4
0
 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();
 }
Пример #5
0
        /// <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);
            }
        }