Files
PURErat-crack-scode/decompiled/Libraries/microsoft.codeanalysis/Microsoft.CodeAnalysis.Syntax/SeparatedSyntaxListBuilder.cs
T

118 lines
2.7 KiB
C#
Raw Normal View History

2026-08-27 10:56:38 -06:00
using System;
namespace Microsoft.CodeAnalysis.Syntax;
internal struct SeparatedSyntaxListBuilder<TNode> where TNode : SyntaxNode
{
private readonly SyntaxListBuilder _builder;
private bool _expectedSeparator;
public bool IsNull => _builder == null;
public int Count => _builder.Count;
public SeparatedSyntaxListBuilder(int size)
: this(new SyntaxListBuilder(size))
{
}
public static SeparatedSyntaxListBuilder<TNode> Create()
{
return new SeparatedSyntaxListBuilder<TNode>(8);
}
internal SeparatedSyntaxListBuilder(SyntaxListBuilder builder)
{
_builder = builder;
_expectedSeparator = false;
}
public void Clear()
{
_builder.Clear();
}
private void CheckExpectedElement()
{
if (_expectedSeparator)
{
throw new InvalidOperationException(CodeAnalysisResources.SeparatorIsExpected);
}
}
private void CheckExpectedSeparator()
{
if (!_expectedSeparator)
{
throw new InvalidOperationException(CodeAnalysisResources.ElementIsExpected);
}
}
public SeparatedSyntaxListBuilder<TNode> Add(TNode node)
{
CheckExpectedElement();
_expectedSeparator = true;
_builder.Add(node);
return this;
}
public SeparatedSyntaxListBuilder<TNode> AddSeparator(in SyntaxToken separatorToken)
{
CheckExpectedSeparator();
_expectedSeparator = false;
_builder.AddInternal(separatorToken.Node);
return this;
}
public SeparatedSyntaxListBuilder<TNode> AddRange(in SeparatedSyntaxList<TNode> nodes)
{
CheckExpectedElement();
SyntaxNodeOrTokenList withSeparators = nodes.GetWithSeparators();
_builder.AddRange(withSeparators);
_expectedSeparator = (_builder.Count & 1) != 0;
return this;
}
public SeparatedSyntaxListBuilder<TNode> AddRange(in SeparatedSyntaxList<TNode> nodes, int count)
{
CheckExpectedElement();
SyntaxNodeOrTokenList withSeparators = nodes.GetWithSeparators();
_builder.AddRange(withSeparators, Count, Math.Min(count << 1, withSeparators.Count));
_expectedSeparator = (_builder.Count & 1) != 0;
return this;
}
public SeparatedSyntaxList<TNode> ToList()
{
if (_builder == null)
{
return default(SeparatedSyntaxList<TNode>);
}
return _builder.ToSeparatedList<TNode>();
}
public SeparatedSyntaxList<TDerived> ToList<TDerived>() where TDerived : TNode
{
if (_builder == null)
{
return default(SeparatedSyntaxList<TDerived>);
}
return _builder.ToSeparatedList<TDerived>();
}
public static implicit operator SyntaxListBuilder(in SeparatedSyntaxListBuilder<TNode> builder)
{
return builder._builder;
}
public static implicit operator SeparatedSyntaxList<TNode>(in SeparatedSyntaxListBuilder<TNode> builder)
{
if (builder._builder != null)
{
return builder.ToList();
}
return default(SeparatedSyntaxList<TNode>);
}
}