示例#1
0
        private async Task <LinkedFileMergeResult> MergeLinkedDocumentGroupAsync(
            IEnumerable <DocumentId> allLinkedDocuments,
            IEnumerable <DocumentId> linkedDocumentGroup,
            LinkedFileDiffMergingSessionInfo sessionInfo,
            IMergeConflictHandler mergeConflictHandler,
            CancellationToken cancellationToken)
        {
            var groupSessionInfo = new LinkedFileGroupSessionInfo();

            // Automatically merge non-conflicting diffs while collecting the conflicting diffs

            var textDifferencingService = _oldSolution.Workspace.Services.GetService <IDocumentTextDifferencingService>() ?? new DefaultDocumentTextDifferencingService();
            var appliedChanges          = await textDifferencingService.GetTextChangesAsync(_oldSolution.GetDocument(linkedDocumentGroup.First()), _newSolution.GetDocument(linkedDocumentGroup.First()), cancellationToken).ConfigureAwait(false);

            var unmergedChanges = new List <UnmergedDocumentChanges>();

            foreach (var documentId in linkedDocumentGroup.Skip(1))
            {
                appliedChanges = await AddDocumentMergeChangesAsync(
                    _oldSolution.GetDocument(documentId),
                    _newSolution.GetDocument(documentId),
                    appliedChanges.ToList(),
                    unmergedChanges,
                    groupSessionInfo,
                    textDifferencingService,
                    cancellationToken).ConfigureAwait(false);
            }

            var originalDocument   = _oldSolution.GetDocument(linkedDocumentGroup.First());
            var originalSourceText = await originalDocument.GetTextAsync(cancellationToken).ConfigureAwait(false);

            // Add comments in source explaining diffs that could not be merged

            IEnumerable <TextChange> allChanges;
            IList <TextSpan>         mergeConflictResolutionSpan = new List <TextSpan>();

            if (unmergedChanges.Any())
            {
                mergeConflictHandler ??= _oldSolution.GetDocument(linkedDocumentGroup.First()).GetLanguageService <ILinkedFileMergeConflictCommentAdditionService>();
                var mergeConflictTextEdits = mergeConflictHandler.CreateEdits(originalSourceText, unmergedChanges);

                allChanges = MergeChangesWithMergeFailComments(appliedChanges, mergeConflictTextEdits, mergeConflictResolutionSpan, groupSessionInfo);
            }
            else
            {
                allChanges = appliedChanges;
            }

            groupSessionInfo.LinkedDocuments      = _newSolution.GetDocumentIdsWithFilePath(originalDocument.FilePath).Length;
            groupSessionInfo.DocumentsWithChanges = linkedDocumentGroup.Count();
            sessionInfo.LogLinkedFileResult(groupSessionInfo);

            return(new LinkedFileMergeResult(allLinkedDocuments, originalSourceText.WithChanges(allChanges), mergeConflictResolutionSpan));
        }
示例#2
0
            private async Task <LinkedFileMergeResult> MergeLinkedDocumentGroupAsync(
                IEnumerable <DocumentId> linkedDocumentGroup,
                LinkedFileDiffMergingSessionInfo sessionInfo,
                CancellationToken cancellationToken)
            {
                var groupSessionInfo = new LinkedFileGroupSessionInfo();

                // Automatically merge non-conflicting diffs while collecting the conflicting diffs

                var appliedChanges = await newSolution.GetDocument(linkedDocumentGroup.First()).GetTextChangesAsync(oldSolution.GetDocument(linkedDocumentGroup.First())).ConfigureAwait(false);

                var unmergedChanges = new List <UnmergedDocumentChanges>();

                foreach (var documentId in linkedDocumentGroup.Skip(1))
                {
                    appliedChanges = await AddDocumentMergeChangesAsync(
                        oldSolution.GetDocument(documentId),
                        newSolution.GetDocument(documentId),
                        appliedChanges.ToList(),
                        unmergedChanges,
                        groupSessionInfo,
                        cancellationToken).ConfigureAwait(false);
                }

                var originalDocument   = oldSolution.GetDocument(linkedDocumentGroup.First());
                var originalSourceText = await originalDocument.GetTextAsync().ConfigureAwait(false);

                // Add comments in source explaining diffs that could not be merged

                IEnumerable <TextChange> allChanges;

                if (unmergedChanges.Any())
                {
                    var mergeConflictCommentAdder = originalDocument.GetLanguageService <ILinkedFileMergeConflictCommentAdditionService>();
                    var commentChanges            = mergeConflictCommentAdder.CreateCommentsForUnmergedChanges(originalSourceText, unmergedChanges);

                    allChanges = MergeChangesWithMergeFailComments(appliedChanges, commentChanges, groupSessionInfo);
                }
                else
                {
                    allChanges = appliedChanges;
                }

                groupSessionInfo.LinkedDocuments      = newSolution.GetDocumentIdsWithFilePath(originalDocument.FilePath).Length;
                groupSessionInfo.DocumentsWithChanges = linkedDocumentGroup.Count();
                sessionInfo.LogLinkedFileResult(groupSessionInfo);

                return(new LinkedFileMergeResult(originalSourceText.WithChanges(allChanges), hasMergeConflicts: unmergedChanges.Any()));
            }
            private async Task<LinkedFileMergeResult> MergeLinkedDocumentGroupAsync(
                IEnumerable<DocumentId> linkedDocumentGroup,
                LinkedFileDiffMergingSessionInfo sessionInfo,
                CancellationToken cancellationToken)
            {
                var groupSessionInfo = new LinkedFileGroupSessionInfo();

                // Automatically merge non-conflicting diffs while collecting the conflicting diffs

                var appliedChanges = await newSolution.GetDocument(linkedDocumentGroup.First()).GetTextChangesAsync(oldSolution.GetDocument(linkedDocumentGroup.First())).ConfigureAwait(false);
                var unmergedChanges = new List<UnmergedDocumentChanges>();

                foreach (var documentId in linkedDocumentGroup.Skip(1))
                {
                    appliedChanges = await AddDocumentMergeChangesAsync(
                        oldSolution.GetDocument(documentId),
                        newSolution.GetDocument(documentId),
                        appliedChanges.ToList(),
                        unmergedChanges,
                        groupSessionInfo,
                        cancellationToken).ConfigureAwait(false);
                }

                var originalDocument = oldSolution.GetDocument(linkedDocumentGroup.First());
                var originalSourceText = await originalDocument.GetTextAsync().ConfigureAwait(false);

                // Add comments in source explaining diffs that could not be merged

                IEnumerable<TextChange> allChanges;
                if (unmergedChanges.Any())
                {
                    var mergeConflictCommentAdder = originalDocument.GetLanguageService<ILinkedFileMergeConflictCommentAdditionService>();
                    var commentChanges = mergeConflictCommentAdder.CreateCommentsForUnmergedChanges(originalSourceText, unmergedChanges);

                    allChanges = MergeChangesWithMergeFailComments(appliedChanges, commentChanges, groupSessionInfo);
                }
                else
                {
                    allChanges = appliedChanges;
                }

                groupSessionInfo.LinkedDocuments = newSolution.GetDocumentIdsWithFilePath(originalDocument.FilePath).Length;
                groupSessionInfo.DocumentsWithChanges = linkedDocumentGroup.Count();
                sessionInfo.LogLinkedFileResult(groupSessionInfo);

                return new LinkedFileMergeResult(originalSourceText.WithChanges(allChanges), hasMergeConflicts: unmergedChanges.Any());
            }
        private async Task<LinkedFileMergeResult> MergeLinkedDocumentGroupAsync(
            IEnumerable<DocumentId> allLinkedDocuments,
            IEnumerable<DocumentId> linkedDocumentGroup,
            LinkedFileDiffMergingSessionInfo sessionInfo,
            IMergeConflictHandler mergeConflictHandler,
            CancellationToken cancellationToken)
        {
            var groupSessionInfo = new LinkedFileGroupSessionInfo();

            // Automatically merge non-conflicting diffs while collecting the conflicting diffs

            var textDifferencingService = _oldSolution.Workspace.Services.GetService<IDocumentTextDifferencingService>() ?? new DefaultDocumentTextDifferencingService();
            var appliedChanges = await textDifferencingService.GetTextChangesAsync(_oldSolution.GetDocument(linkedDocumentGroup.First()), _newSolution.GetDocument(linkedDocumentGroup.First()), cancellationToken).ConfigureAwait(false);
            var unmergedChanges = new List<UnmergedDocumentChanges>();

            foreach (var documentId in linkedDocumentGroup.Skip(1))
            {
                appliedChanges = await AddDocumentMergeChangesAsync(
                    _oldSolution.GetDocument(documentId),
                    _newSolution.GetDocument(documentId),
                    appliedChanges.ToList(),
                    unmergedChanges,
                    groupSessionInfo,
                    textDifferencingService,
                    cancellationToken).ConfigureAwait(false);
            }

            var originalDocument = _oldSolution.GetDocument(linkedDocumentGroup.First());
            var originalSourceText = await originalDocument.GetTextAsync(cancellationToken).ConfigureAwait(false);

            // Add comments in source explaining diffs that could not be merged

            IEnumerable<TextChange> allChanges;
            IList<TextSpan> mergeConflictResolutionSpan = new List<TextSpan>();

            if (unmergedChanges.Any())
            {
                mergeConflictHandler = mergeConflictHandler ?? _oldSolution.GetDocument(linkedDocumentGroup.First()).GetLanguageService<ILinkedFileMergeConflictCommentAdditionService>();
                var mergeConflictTextEdits = mergeConflictHandler.CreateEdits(originalSourceText, unmergedChanges);

                allChanges = MergeChangesWithMergeFailComments(appliedChanges, mergeConflictTextEdits, mergeConflictResolutionSpan, groupSessionInfo);
            }
            else
            {
                allChanges = appliedChanges;
            }

            groupSessionInfo.LinkedDocuments = _newSolution.GetDocumentIdsWithFilePath(originalDocument.FilePath).Length;
            groupSessionInfo.DocumentsWithChanges = linkedDocumentGroup.Count();
            sessionInfo.LogLinkedFileResult(groupSessionInfo);

            return new LinkedFileMergeResult(allLinkedDocuments, originalSourceText.WithChanges(allChanges), mergeConflictResolutionSpan);
        }