| File: EditAndContinue\NonRemappableRegion.cs | Web Access |
| Project: src\roslyn\src\Features\Core\Portable\Microsoft.CodeAnalysis.Features.csproj (Microsoft.CodeAnalysis.Features) |
// 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; using System.Diagnostics; using Roslyn.Utilities; namespace Microsoft.CodeAnalysis.EditAndContinue; [DebuggerDisplay("{GetDebuggerDisplay(),nq}")] internal readonly struct NonRemappableRegion(SourceFileSpan oldSpan, SourceFileSpan newSpan, bool isExceptionRegion) : IEquatable<NonRemappableRegion> { /// <summary> /// PDB span in pre-remap method version. /// </summary> /// <remarks> /// When a thread is executing in an old version of a method before it is remapped to the new version /// its active statement needs to be mapped from <see cref="OldSpan"/> in the old version /// to <see cref="NewSpan"/> in the new version of the method. /// </remarks> public readonly SourceFileSpan OldSpan = oldSpan; /// <summary> /// PDB span in the new method version. /// </summary> public readonly SourceFileSpan NewSpan = newSpan; /// <summary> /// True if the region represents an exception region, false if it represents an active statement. /// </summary> public readonly bool IsExceptionRegion = isExceptionRegion; public override bool Equals(object? obj) => obj is NonRemappableRegion region && Equals(region); public bool Equals(NonRemappableRegion other) => OldSpan.Equals(other.OldSpan) && NewSpan.Equals(other.NewSpan) && IsExceptionRegion == other.IsExceptionRegion; public override int GetHashCode() => Hash.Combine(OldSpan.GetHashCode(), Hash.Combine(IsExceptionRegion, NewSpan.GetHashCode())); public static bool operator ==(NonRemappableRegion left, NonRemappableRegion right) => left.Equals(right); public static bool operator !=(NonRemappableRegion left, NonRemappableRegion right) => !(left == right); public NonRemappableRegion WithNewSpan(SourceFileSpan newSpan) => new(OldSpan, newSpan, IsExceptionRegion); internal string GetDebuggerDisplay() => $"{(IsExceptionRegion ? "ER" : "AS")} {OldSpan} => {NewSpan.Span}"; }