﻿// 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;
using System;

namespace Microsoft.CodeAnalysis.Contracts.EditAndContinue
{
    /// <summary>
    /// Maps source lines affected by an update.
    /// Zero-based line number.
    /// </summary>
    [DataContract]
    internal readonly struct SourceLineUpdate
    {
        /// <summary>
        /// Creates a SourceLineUpdate. 
        /// </summary>
        /// <param name="oldLine">Line number before the update was made.</param>
        /// <param name="newLine">Line number after the update was made.</param>
        /// <exception cref="ArgumentOutOfRangeException">
        /// If <paramref name="oldLine"/> or <paramref name="newLine"/> is less than 0.
        /// </exception>
        /// <remarks>
        /// We expect that <paramref name="oldLine"/> and <paramref name="newLine"/> have the same value
        /// when the line delta is zero.
        /// </remarks>
        public SourceLineUpdate(
            int oldLine,
            int newLine)
        {
            if (oldLine < 0)
                throw new ArgumentOutOfRangeException(nameof(oldLine));
            if (newLine < 0)
                throw new ArgumentOutOfRangeException(nameof(newLine));

            OldLine = oldLine;
            NewLine = newLine;
        }

        /// <summary>
        /// Line number before the update was made, must be zero-based.
        /// </summary>
        [DataMember(Name = "oldLine")]
        public int OldLine { get; }

        /// <summary>
        /// Line number after the update was made, must be zero-based.
        /// </summary>
        [DataMember(Name = "newLine")]
        public int NewLine { get; }
    }
}
