MParser/Parser/Internal/SyntaxList`1.cs

63 lines
1.8 KiB
C#

using System.Collections.Generic;
using System.Linq;
namespace Parser.Internal
{
internal class SyntaxList<T> : 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<T> List(T[] elements)
{
return new SyntaxList<T>(elements);
}
public static SyntaxList<T> List(IReadOnlyList<T> elements)
{
return new SyntaxList<T>(elements.ToArray());
}
public static SyntaxList<T> Empty => new SyntaxList<T>(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<T>(_list._elements.Select(x => (T)x).ToArray(), diagnostics);
}
public int Length => _list.Length;
}
}