File: InlineRename\AbstractEditorInlineRenameService.InlineRenameReplacementInfo.cs
Web Access
Project: src\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));
        }
    }
}