예제 #1
0
            private async Task EnqueueProjectConfigurationChangeWorkItemAsync(ProjectChanges projectChanges)
            {
                var oldProject = projectChanges.OldProject;
                var newProject = projectChanges.NewProject;

                // TODO: why solution changes return Project not ProjectId but ProjectChanges return DocumentId not Document?
                var projectConfigurationChange = InvocationReasons.Empty;

                if (!object.Equals(oldProject.ParseOptions, newProject.ParseOptions))
                {
                    projectConfigurationChange = projectConfigurationChange.With(InvocationReasons.ProjectParseOptionChanged);
                }

                if (projectChanges.GetAddedMetadataReferences().Any() ||
                    projectChanges.GetAddedProjectReferences().Any() ||
                    projectChanges.GetAddedAnalyzerReferences().Any() ||
                    projectChanges.GetRemovedMetadataReferences().Any() ||
                    projectChanges.GetRemovedProjectReferences().Any() ||
                    projectChanges.GetRemovedAnalyzerReferences().Any() ||
                    !object.Equals(oldProject.CompilationOptions, newProject.CompilationOptions) ||
                    !object.Equals(oldProject.AssemblyName, newProject.AssemblyName) ||
                    !object.Equals(oldProject.Name, newProject.Name) ||
                    !object.Equals(oldProject.AnalyzerOptions, newProject.AnalyzerOptions))
                {
                    projectConfigurationChange = projectConfigurationChange.With(InvocationReasons.ProjectConfigurationChanged);
                }

                if (!projectConfigurationChange.IsEmpty)
                {
                    await EnqueueWorkItemAsync(projectChanges.NewProject, projectConfigurationChange).ConfigureAwait(false);
                }
            }
예제 #2
0
        public override IProjectSubscriptionUpdate ToActualModel()
        {
            IImmutableDictionary <string, IProjectRuleSnapshot>      currentState;
            IImmutableDictionary <string, IProjectChangeDescription> projectChanges;
            ProjectConfiguration projectConfiguration;

            if (CurrentState != null)
            {
                currentState = CurrentState.Select(x => new KeyValuePair <string, IProjectRuleSnapshot>(x.Key, x.Value)).ToImmutableDictionary();
            }
            else
            {
                currentState = ImmutableDictionary <string, IProjectRuleSnapshot> .Empty;
            }

            if (ProjectChanges != null)
            {
                projectChanges = ProjectChanges.Select(x => new KeyValuePair <string, IProjectChangeDescription>(x.Key, x.Value.ToActualModel())).ToImmutableDictionary();
            }
            else
            {
                projectChanges = ImmutableDictionary <string, IProjectChangeDescription> .Empty;
            }

            if (ProjectConfiguration != null)
            {
                projectConfiguration = ProjectConfiguration.ToActualModel();
            }
            else
            {
                projectConfiguration = ProjectConfigurationFactory.Create("TEST");
            }

            return(new ActualModel(currentState, projectChanges, projectConfiguration));
        }
예제 #3
0
        public override IProjectSubscriptionUpdate ToActualModel()
        {
            var model = new ActualModel();

            if (CurrentState != null)
            {
                model.CurrentState = CurrentState.Select(x => new KeyValuePair <string, IProjectRuleSnapshot>(x.Key, x.Value))
                                     .ToImmutableDictionary();
            }
            else
            {
                model.CurrentState = ImmutableDictionary <string, IProjectRuleSnapshot> .Empty;
            }

            if (ProjectChanges != null)
            {
                model.ProjectChanges = ProjectChanges.Select(x => new KeyValuePair <string, IProjectChangeDescription>(x.Key, x.Value.ToActualModel()))
                                       .ToImmutableDictionary();
            }
            else
            {
                model.ProjectChanges = ImmutableDictionary <string, IProjectChangeDescription> .Empty;
            }

            if (ProjectConfiguration != null)
            {
                model.ProjectConfiguration = ProjectConfiguration.ToActualModel();
            }

            return(model);
        }
예제 #4
0
 protected override void ApplyProjectChanges(ProjectChanges projectChanges)
 {
     try {
         internalChanges = true;
         base.ApplyProjectChanges(projectChanges);
     } finally {
         internalChanges = false;
     }
 }
예제 #5
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());
 }
예제 #6
0
        protected override void ApplyProjectChanges(ProjectChanges projectChanges)
        {
            if (projectChanges.OldProject.FilePath != projectChanges.NewProject.FilePath)
            {
                var hostProject = this.GetTestProject(projectChanges.NewProject.Id);
                hostProject.OnProjectFilePathChanged(projectChanges.NewProject.FilePath);
                base.OnProjectNameChanged(projectChanges.NewProject.Id, projectChanges.NewProject.Name, projectChanges.NewProject.FilePath);
            }

            base.ApplyProjectChanges(projectChanges);
        }
예제 #7
0
        protected override void ApplyProjectChanges(ProjectChanges projectChanges)
        {
            // since Roslyn currently doesn't handle DefaultNamespace changes via ApplyProjectChanges
            // and OnDefaultNamespaceChanged is internal, we use reflection for now
            if (projectChanges.NewProject.DefaultNamespace != projectChanges.OldProject.DefaultNamespace)
            {
                var onDefaultNamespaceChanged = this.GetType().GetMethod("OnDefaultNamespaceChanged", BindingFlags.Instance | BindingFlags.NonPublic);
                if (onDefaultNamespaceChanged != null)
                {
                    onDefaultNamespaceChanged.Invoke(this, new object[] { projectChanges.ProjectId, projectChanges.NewProject.DefaultNamespace });
                }
            }

            base.ApplyProjectChanges(projectChanges);
        }
        /// <summary>
        /// Saves the updated documents to disk.
        /// </summary>
        /// <param name="projectChanges">The project changes.</param>
        /// <param name="newSolution">The new solution.</param>
        private static void SaveUpdatedDocumentsToDisk(ProjectChanges projectChanges, Solution newSolution)
        {
            var s_utf8WithoutBom   = new UTF8Encoding(false);
            var changedDocumentIds = projectChanges.GetChangedDocuments(true).ToList();

            changedDocumentIds.ForEach(documentId =>
            {
                var document = newSolution.GetDocument(documentId);
                var text     = document.GetTextAsync();
                using (var writer = new StreamWriter(document.FilePath, append: false, encoding: text.Result.Encoding ?? s_utf8WithoutBom))
                {
                    text.Result.Write(writer);
                }
            });
        }
예제 #9
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;
                    IProjectFileLoader loader;
                    if (this.TryGetLoaderFromProjectPath(projectPath, ReportMode.Ignore, out loader))
                    {
                        try
                        {
                            this.applyChangesProjectFile = loader.LoadProjectFileAsync(projectPath, this.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 (this.applyChangesProjectFile != null)
                {
                    try
                    {
                        this.applyChangesProjectFile.Save();
                    }
                    catch (System.IO.IOException exception)
                    {
                        this.OnWorkspaceFailed(new ProjectDiagnostic(WorkspaceDiagnosticKind.Failure, exception.Message, projectChanges.ProjectId));
                    }
                }
            }
            finally
            {
                this.applyChangesProjectFile = null;
            }
        }
예제 #10
0
        private void Update(Project project, ProjectChanges changes)
        {
            foreach (var task in changes.AddedTasks.Select(project.GetTask).OrderBy(o => o.Ordinal))
            {
                var row = new TaskGridRowViewModel(Workspace, task.Id);
                Rows.Add(row);
                _rowMap.Add(task.Id, row);
            }

            foreach (var taskId in changes.RemovedTasks)
            {
                Rows.Remove(_rowMap[taskId]);
                _rowMap.Remove(taskId);
            }

            foreach (var taskChanges in changes.ChangedTasks)
            {
                _rowMap[taskChanges.Id].Update(taskChanges);
            }
        }
예제 #11
0
            private async Task EnqueueWorkItemAsync(ProjectChanges projectChanges)
            {
                await EnqueueProjectConfigurationChangeWorkItemAsync(projectChanges).ConfigureAwait(false);

                foreach (var addedDocumentId in projectChanges.GetAddedDocuments())
                {
                    await EnqueueWorkItemAsync(projectChanges.NewProject.GetRequiredDocument(addedDocumentId), InvocationReasons.DocumentAdded).ConfigureAwait(false);
                }

                foreach (var changedDocumentId in projectChanges.GetChangedDocuments())
                {
                    await EnqueueWorkItemAsync(projectChanges.OldProject.GetRequiredDocument(changedDocumentId), projectChanges.NewProject.GetRequiredDocument(changedDocumentId))
                    .ConfigureAwait(continueOnCapturedContext: false);
                }

                foreach (var removedDocumentId in projectChanges.GetRemovedDocuments())
                {
                    await EnqueueWorkItemAsync(projectChanges.OldProject.GetRequiredDocument(removedDocumentId), InvocationReasons.DocumentRemoved).ConfigureAwait(false);
                }
            }
예제 #12
0
        private void Update(Project project, ProjectChanges changes)
        {
            foreach (var resource in changes.AddedResources.Select(project.GetResource))
            {
                var row = new ResourceGridRowViewModel(Workspace, resource.Id);
                Rows.Add(row);
                _rowMap.Add(resource.Id, row);
            }

            foreach (var resourceId in changes.RemovedResources)
            {
                Rows.Remove(_rowMap[resourceId]);
                _rowMap.Remove(resourceId);
            }

            foreach (var resourceChanges in changes.ChangedResources)
            {
                _rowMap[resourceChanges.Id].Update(resourceChanges);
            }
        }
        private bool ProjectReferencesChanged(ProjectChanges projectChanges)
        {
            var oldProjectReferences = projectChanges.OldProject.ProjectReferences.ToDictionary(r => r.ProjectId);
            var newProjectReferences = projectChanges.NewProject.ProjectReferences.ToDictionary(r => r.ProjectId);

            // These are the set of project reference that remained in the project. We don't care
            // about project references that were added or removed.  Those will already be reported.
            var preservedProjectIds = oldProjectReferences.Keys.Intersect(newProjectReferences.Keys);

            foreach (var projectId in preservedProjectIds)
            {
                var oldProjectReference = oldProjectReferences[projectId];
                var newProjectReference = newProjectReferences[projectId];

                if (!oldProjectReference.Equals(newProjectReference))
                {
                    return(true);
                }
            }

            return(false);
        }
        private void Update(Project project, ProjectChanges changes)
        {
            if (project == null)
            {
                throw new ArgumentNullException(nameof(project));
            }

            if (changes == null)
            {
                throw new ArgumentNullException(nameof(changes));
            }

            Current = project;

            foreach (var task in changes.AddedTasks.Select(project.GetTask).OrderBy(o => o.Ordinal))
            {
                var taskViewModel = new GanttTaskViewModel(Workspace, task.Id);
                Tasks.Add(taskViewModel);
            }

            foreach (var taskId in changes.RemovedTasks)
            {
                var taskViewModel = Tasks.SingleOrDefault(vm => vm.TaskId == taskId);
                if (taskViewModel != null)
                {
                    Tasks.Remove(taskViewModel);
                }
            }

            foreach (var taskChanges in changes.ChangedTasks)
            {
                var taskViewModel = Tasks.SingleOrDefault(vm => vm.TaskId == taskChanges.Id);
                if (taskViewModel != null)
                {
                    taskViewModel.Update(taskChanges);
                }
            }
        }
예제 #15
0
        private void Update(Project project, ProjectChanges changes)
        {
            foreach (var assignment in changes.AddedAssignments
                     .Select(project.GetAssignment)
                     .OrderBy(a => a.Task.Ordinal)
                     .ThenBy(o => o.Resource.Name))
            {
                var row = new AssignmentGridRowViewModel(Workspace, assignment.Id);
                Rows.Add(row);
                _rowMap.Add(assignment.Id, row);
            }

            foreach (var assignmentId in changes.RemovedAssignments)
            {
                Rows.Remove(_rowMap[assignmentId]);
                _rowMap.Remove(assignmentId);
            }

            foreach (var assignmentChanges in changes.ChangedAssignments)
            {
                _rowMap[assignmentChanges.Id].Update(assignmentChanges);
            }
        }
예제 #16
0
        private bool ProjectReferencesChanged(ProjectChanges projectChanges)
        {
            var oldProjectReferences = projectChanges.OldProject.ProjectReferences.ToDictionary(r => r.ProjectId);
            var newProjectReferences = projectChanges.NewProject.ProjectReferences.ToDictionary(r => r.ProjectId);

            // These are the set of project reference that remained in the project. We don't care 
            // about project references that were added or removed.  Those will already be reported.
            var preservedProjectIds = oldProjectReferences.Keys.Intersect(newProjectReferences.Keys);

            foreach (var projectId in preservedProjectIds)
            {
                var oldProjectReference = oldProjectReferences[projectId];
                var newProjectReference = newProjectReferences[projectId];

                if (!oldProjectReference.Equals(newProjectReference))
                {
                    return true;
                }
            }

            return false;
        }
예제 #17
0
            private async Task EnqueueProjectConfigurationChangeWorkItemAsync(ProjectChanges projectChanges)
            {
                var oldProject = projectChanges.OldProject;
                var newProject = projectChanges.NewProject;

                // TODO: why solution changes return Project not ProjectId but ProjectChanges return DocumentId not Document?
                var projectConfigurationChange = InvocationReasons.Empty;

                if (!object.Equals(oldProject.ParseOptions, newProject.ParseOptions))
                {
                    projectConfigurationChange = projectConfigurationChange.With(InvocationReasons.ProjectParseOptionChanged);
                }

                if (projectChanges.GetAddedMetadataReferences().Any() || projectChanges.GetAddedProjectReferences().Any() || projectChanges.GetAddedAnalyzerReferences().Any() ||
                    projectChanges.GetRemovedMetadataReferences().Any() || projectChanges.GetRemovedProjectReferences().Any() || projectChanges.GetRemovedAnalyzerReferences().Any() ||
                    !object.Equals(oldProject.CompilationOptions, newProject.CompilationOptions) ||
                    !object.Equals(oldProject.AssemblyName, newProject.AssemblyName) ||
                    !object.Equals(oldProject.AnalyzerOptions, newProject.AnalyzerOptions))
                {
                    projectConfigurationChange = projectConfigurationChange.With(InvocationReasons.ProjectConfigurationChanged);
                }

                if (!projectConfigurationChange.IsEmpty)
                {
                    await EnqueueWorkItemAsync(projectChanges.NewProject, projectConfigurationChange).ConfigureAwait(false);
                }
            }
예제 #18
0
            private async Task EnqueueWorkItemAsync(ProjectChanges projectChanges)
            {
                await EnqueueProjectConfigurationChangeWorkItemAsync(projectChanges).ConfigureAwait(false);

                foreach (var addedDocumentId in projectChanges.GetAddedDocuments())
                {
                    await EnqueueWorkItemAsync(projectChanges.NewProject.GetDocument(addedDocumentId), InvocationReasons.DocumentAdded).ConfigureAwait(false);
                }

                foreach (var changedDocumentId in projectChanges.GetChangedDocuments())
                {
                    await EnqueueWorkItemAsync(projectChanges.OldProject.GetDocument(changedDocumentId), projectChanges.NewProject.GetDocument(changedDocumentId))
                        .ConfigureAwait(continueOnCapturedContext: false);
                }

                foreach (var removedDocumentId in projectChanges.GetRemovedDocuments())
                {
                    await EnqueueWorkItemAsync(projectChanges.OldProject.GetDocument(removedDocumentId), InvocationReasons.DocumentRemoved).ConfigureAwait(false);
                }
            }
예제 #19
0
 public ProjectChangedEventArgs(Project oldProject, Project newProject, ProjectChanges changes)
 {
     OldProject = oldProject;
     NewProject = newProject;
     Changes    = changes;
 }