File: Contracts\EditAndContinue\ManagedExceptionRegionUpdate.cs
Web Access
Project: src\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.Runtime.Serialization;
 
namespace Microsoft.CodeAnalysis.Contracts.EditAndContinue;
 
/// <summary>
/// Exception region affected by a managed update.
/// </summary>
/// <remarks>
/// Creates an ExceptionRegionUpdate.
/// </remarks>
/// <param name="method">Method information before the change was made.</param>
/// <param name="delta">Total of lines modified after the update.</param>
/// <param name="newSpan">Updated text span for the active statement.</param>
[DataContract]
internal readonly struct ManagedExceptionRegionUpdate(
    ManagedModuleMethodId method,
    int delta,
    SourceSpan newSpan)
{
 
    /// <summary>
    /// Method ID. It has the token for the method that contains the exception region
    /// and the version when the change was made.
    /// </summary>
    [DataMember(Name = "method")]
    public ManagedModuleMethodId Method { get; } = method;
 
    /// <summary>
    /// The delta is the total of lines modified after the update. This value is inverse:
    /// 
    ///   OldSpan = NewSpan + Delta
    ///   NewSpan = OldSpan - Delta
    ///
    /// For example, if 2 new lines were added preceding the exception region, this value will be -2.
    /// </summary>
    [DataMember(Name = "delta")]
    public int Delta { get; } = delta;
 
    /// <summary>
    /// Specifies where the exception region starts and ends after the update. This value is 0-based.
    /// An exception region value generally corresponds to a catch { } block source span before any update is made.
    /// </summary>
    /// <remarks>
    /// This value will take into account any lines affected by the update, so we can correctly track the new exception regions
    /// when remapping the instruction pointer.
    /// The new span is expected to be: [PreviousExceptionRegionSpan] + [Delta of updated lines].
    /// </remarks>
    [DataMember(Name = "newSpan")]
    public SourceSpan NewSpan { get; } = newSpan;
}