| File: Syntax\InternalSyntax\SeparatedSyntaxList.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.Diagnostics; namespace Microsoft.CodeAnalysis.Syntax.InternalSyntax { internal readonly struct SeparatedSyntaxList<TNode> : IEquatable<SeparatedSyntaxList<TNode>> where TNode : GreenNode { private readonly SyntaxList<GreenNode> _list; internal SeparatedSyntaxList(SyntaxList<GreenNode> list) { Validate(list); _list = list; } [Conditional("DEBUG")] private static void Validate(SyntaxList<GreenNode> list) { for (int i = 0; i < list.Count; i++) { var item = list.GetRequiredItem(i); if ((i & 1) == 0) { Debug.Assert(!item.IsToken, "even elements of a separated list must be nodes"); } else { Debug.Assert(item.IsToken, "odd elements of a separated list must be tokens"); } } } internal GreenNode? Node => _list.Node; public int Count { get { return (_list.Count + 1) >> 1; } } public int SeparatorCount { get { return _list.Count >> 1; } } public TNode? this[int index] { get { return (TNode?)_list[index << 1]; } } /// <summary> /// Gets the separator at the given index in this list. /// </summary> /// <param name="index">The index.</param> /// <returns></returns> public GreenNode? GetSeparator(int index) { return _list[(index << 1) + 1]; } public SyntaxList<GreenNode> GetWithSeparators() { return _list; } public static bool operator ==(in SeparatedSyntaxList<TNode> left, in SeparatedSyntaxList<TNode> right) { return left.Equals(right); } public static bool operator !=(in SeparatedSyntaxList<TNode> left, in SeparatedSyntaxList<TNode> right) { return !left.Equals(right); } public bool Equals(SeparatedSyntaxList<TNode> other) { return _list == other._list; } public override bool Equals(object? obj) { return (obj is SeparatedSyntaxList<TNode>) && Equals((SeparatedSyntaxList<TNode>)obj); } public override int GetHashCode() { return _list.GetHashCode(); } public static implicit operator SeparatedSyntaxList<GreenNode>(SeparatedSyntaxList<TNode> list) { return new SeparatedSyntaxList<GreenNode>(list.GetWithSeparators()); } #if DEBUG [Obsolete("For debugging only", true)] #pragma warning disable IDE0051 // Remove unused private members private TNode[] Nodes #pragma warning restore IDE0051 // Remove unused private members { get { int count = this.Count; TNode[] array = new TNode[count]; for (int i = 0; i < count; i++) { array[i] = this[i]!; } return array; } } #endif } }