| File: Text\LinePosition.cs | Web Access |
| Project: src\roslyn\src\Compilers\Core\Portable\Microsoft.CodeAnalysis.csproj (Microsoft.CodeAnalysis) |
// 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.Runtime.Serialization; using Roslyn.Utilities; namespace Microsoft.CodeAnalysis.Text { /// <summary> /// Immutable representation of a line number and position within a SourceText instance. /// </summary> [DataContract] public readonly struct LinePosition : IEquatable<LinePosition>, IComparable<LinePosition> { /// <summary> /// A <see cref="LinePosition"/> that represents position 0 at line 0. /// </summary> public static LinePosition Zero => default(LinePosition); [DataMember(Order = 0)] private readonly int _line; [DataMember(Order = 1)] private readonly int _character; /// <summary> /// Initializes a new instance of a <see cref="LinePosition"/> with the given line and character. /// </summary> /// <param name="line"> /// The line of the line position. The first line in a file is defined as line 0 (zero based line numbering). /// </param> /// <param name="character"> /// The character position in the line. /// </param> /// <exception cref="ArgumentOutOfRangeException"><paramref name="line"/> or <paramref name="character"/> is less than zero. </exception> public LinePosition(int line, int character) { if (line < 0) { throw new ArgumentOutOfRangeException(nameof(line)); } if (character < 0) { throw new ArgumentOutOfRangeException(nameof(character)); } _line = line; _character = character; } // internal constructor that supports a line number == -1. // VB allows users to specify a 1-based line number of 0 when processing // externalsource directives, which get decremented during conversion to 0-based line numbers. // in this case the line number can be -1. internal LinePosition(int character) { if (character < 0) { throw new ArgumentOutOfRangeException(nameof(character)); } _line = -1; _character = character; } /// <summary> /// The line number. The first line in a file is defined as line 0 (zero based line numbering). /// </summary> public int Line { get { return _line; } } /// <summary> /// The character position within the line. /// </summary> public int Character { get { return _character; } } /// <summary> /// Determines whether two <see cref="LinePosition"/> are the same. /// </summary> public static bool operator ==(LinePosition left, LinePosition right) { return left.Equals(right); } /// <summary> /// Determines whether two <see cref="LinePosition"/> are different. /// </summary> public static bool operator !=(LinePosition left, LinePosition right) { return !left.Equals(right); } /// <summary> /// Determines whether two <see cref="LinePosition"/> are the same. /// </summary> /// <param name="other">The object to compare.</param> public bool Equals(LinePosition other) { return other.Line == this.Line && other.Character == this.Character; } /// <summary> /// Determines whether two <see cref="LinePosition"/> are the same. /// </summary> /// <param name="obj">The object to compare.</param> public override bool Equals(object? obj) { return obj is LinePosition && Equals((LinePosition)obj); } /// <summary> /// Provides a hash function for <see cref="LinePosition"/>. /// </summary> public override int GetHashCode() { return Hash.Combine(Line, Character); } /// <summary> /// Provides a string representation for <see cref="LinePosition"/>. /// </summary> /// <example>0,10</example> public override string ToString() { return Line + "," + Character; } public int CompareTo(LinePosition other) { int result = _line.CompareTo(other._line); return (result != 0) ? result : _character.CompareTo(other.Character); } public static bool operator >(LinePosition left, LinePosition right) { return left.CompareTo(right) > 0; } public static bool operator >=(LinePosition left, LinePosition right) { return left.CompareTo(right) >= 0; } public static bool operator <(LinePosition left, LinePosition right) { return left.CompareTo(right) < 0; } public static bool operator <=(LinePosition left, LinePosition right) { return left.CompareTo(right) <= 0; } } }