File: InlineRename\AbstractEditorInlineRenameService.InlineRenameReplacementInfo.cs
Web Access
Project: ..\..\..\src\EditorFeatures\Core\Microsoft.CodeAnalysis.EditorFeatures.csproj (Microsoft.CodeAnalysis.EditorFeatures)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
 
using System.Collections.Generic;
using System.Linq;
using Microsoft.CodeAnalysis.Rename;
using Roslyn.Utilities;
 
namespace Microsoft.CodeAnalysis.Editor.Implementation.InlineRename
{
    internal abstract partial class AbstractEditorInlineRenameService : IEditorInlineRenameService
    {
        private class InlineRenameReplacementInfo : IInlineRenameReplacementInfo
        {
            private readonly ConflictResolution _conflicts;
 
            public InlineRenameReplacementInfo(ConflictResolution conflicts)
            {
                Contract.ThrowIfFalse(conflicts.IsSuccessful);
                _conflicts = conflicts;
            }
 
            public IEnumerable<DocumentId> DocumentIds => _conflicts.DocumentIds;
 
            public Solution NewSolution => _conflicts.NewSolution!;
 
            public bool ReplacementTextValid => _conflicts.ReplacementTextValid;
 
            public IEnumerable<InlineRenameReplacement> GetReplacements(DocumentId documentId)
            {
                var nonComplexifiedSpans = GetNonComplexifiedReplacements(documentId);
                var complexifiedSpans = GetComplexifiedReplacements(documentId);
 
                return nonComplexifiedSpans.Concat(complexifiedSpans);
            }
 
            private IEnumerable<InlineRenameReplacement> GetNonComplexifiedReplacements(DocumentId documentId)
            {
                var modifiedSpans = _conflicts.GetModifiedSpanMap(documentId);
                var locationsForDocument = _conflicts.GetRelatedLocationsForDocument(documentId);
 
                // The RenamedSpansTracker doesn't currently track unresolved conflicts for
                // unmodified locations.  If the document wasn't modified, we can just use the 
                // original span as the new span, but otherwise we need to filter out 
                // locations that aren't in modifiedSpans. 
                if (modifiedSpans.Any())
                {
                    return locationsForDocument.Where(loc => modifiedSpans.ContainsKey(loc.ConflictCheckSpan))
                                               .Select(loc => new InlineRenameReplacement(loc, modifiedSpans[loc.ConflictCheckSpan]));
                }
                else
                {
                    return locationsForDocument.Select(loc => new InlineRenameReplacement(loc, loc.ConflictCheckSpan));
                }
            }
 
            private IEnumerable<InlineRenameReplacement> GetComplexifiedReplacements(DocumentId documentId)
            {
                return _conflicts.GetComplexifiedSpans(documentId)
                    .Select(s => new InlineRenameReplacement(InlineRenameReplacementKind.Complexified, s.oldSpan, s.newSpan));
            }
        }
    }
}