using System.Collections.Generic; using System.Linq; namespace Parser.Internal { internal class SyntaxList : SyntaxNode where T : GreenNode { private readonly SyntaxList _list; protected SyntaxList(T[] list) : base(TokenKind.List) { Slots = list.Length; _list = SyntaxList.List(list); foreach (var element in list) { this.AdjustWidth(element); } } protected SyntaxList(T[] list, TokenDiagnostic[] diagnostics) : base(TokenKind.List, diagnostics) { Slots = list.Length; _list = SyntaxList.List(list); foreach (var element in list) { this.AdjustWidth(element); } } public override GreenNode? GetSlot(int i) { return (T)_list.GetListSlot(i); } public T this[int i] => (T)_list.GetListSlot(i); public static SyntaxList List(T[] elements) { return new SyntaxList(elements); } public static SyntaxList List(IReadOnlyList elements) { return new SyntaxList(elements.ToArray()); } public static SyntaxList Empty => new SyntaxList(new T[] { }); public override bool IsList => true; internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent, int position) { return new Parser.SyntaxNodeOrTokenList(parent, this, position); } public override GreenNode SetDiagnostics(TokenDiagnostic[] diagnostics) { return new SyntaxList(_list._elements.Select(x => (T)x).ToArray(), diagnostics); } public int Length => _list.Length; } }