Files

143 lines
3.0 KiB
C#
Raw Permalink Normal View History

2026-08-27 10:56:38 -06:00
using System;
using System.Collections.Generic;
using Microsoft.CodeAnalysis.Syntax.InternalSyntax;
namespace Microsoft.CodeAnalysis.Syntax;
internal class SyntaxTriviaListBuilder
{
private SyntaxTrivia[] _nodes;
private int _count;
public int Count => _count;
public SyntaxTrivia this[int index]
{
get
{
if (index < 0 || index >= _count)
{
throw new IndexOutOfRangeException();
}
return _nodes[index];
}
}
public SyntaxTriviaListBuilder(int size)
{
_nodes = new SyntaxTrivia[size];
}
public static SyntaxTriviaListBuilder Create()
{
return new SyntaxTriviaListBuilder(4);
}
public static SyntaxTriviaList Create(IEnumerable<SyntaxTrivia>? trivia)
{
if (trivia == null)
{
return default(SyntaxTriviaList);
}
SyntaxTriviaListBuilder syntaxTriviaListBuilder = Create();
syntaxTriviaListBuilder.AddRange(trivia);
return syntaxTriviaListBuilder.ToList();
}
public void Clear()
{
_count = 0;
}
public void AddRange(IEnumerable<SyntaxTrivia>? items)
{
if (items == null)
{
return;
}
foreach (SyntaxTrivia item in items)
{
Add(item);
}
}
public SyntaxTriviaListBuilder Add(SyntaxTrivia item)
{
if (_count >= _nodes.Length)
{
Grow((_count == 0) ? 8 : (_nodes.Length * 2));
}
_nodes[_count++] = item;
return this;
}
public void Add(SyntaxTrivia[] items)
{
Add(items, 0, items.Length);
}
public void Add(SyntaxTrivia[] items, int offset, int length)
{
if (_count + length > _nodes.Length)
{
Grow(_count + length);
}
Array.Copy(items, offset, _nodes, _count, length);
_count += length;
}
public void Add(in SyntaxTriviaList list)
{
Add(in list, 0, list.Count);
}
public void Add(in SyntaxTriviaList list, int offset, int length)
{
if (_count + length > _nodes.Length)
{
Grow(_count + length);
}
list.CopyTo(offset, _nodes, _count, length);
_count += length;
}
private void Grow(int size)
{
SyntaxTrivia[] array = new SyntaxTrivia[size];
Array.Copy(_nodes, array, _nodes.Length);
_nodes = array;
}
public static implicit operator SyntaxTriviaList(SyntaxTriviaListBuilder builder)
{
return builder.ToList();
}
public SyntaxTriviaList ToList()
{
if (_count > 0)
{
switch (_count)
{
case 1:
return new SyntaxTriviaList(default(SyntaxToken), _nodes[0].UnderlyingNode, 0);
case 2:
return new SyntaxTriviaList(default(SyntaxToken), Microsoft.CodeAnalysis.Syntax.InternalSyntax.SyntaxList.List(_nodes[0].UnderlyingNode, _nodes[1].UnderlyingNode), 0);
case 3:
return new SyntaxTriviaList(default(SyntaxToken), Microsoft.CodeAnalysis.Syntax.InternalSyntax.SyntaxList.List(_nodes[0].UnderlyingNode, _nodes[1].UnderlyingNode, _nodes[2].UnderlyingNode), 0);
default:
{
ArrayElement<GreenNode>[] array = new ArrayElement<GreenNode>[_count];
for (int i = 0; i < _count; i++)
{
array[i].Value = _nodes[i].UnderlyingNode;
}
return new SyntaxTriviaList(default(SyntaxToken), Microsoft.CodeAnalysis.Syntax.InternalSyntax.SyntaxList.List(array), 0);
}
}
}
return default(SyntaxTriviaList);
}
}