Files
2026-08-27 10:56:38 -06:00

274 lines
7.9 KiB
C#

using System;
using System.Collections.Generic;
using Microsoft.CodeAnalysis.Syntax.InternalSyntax;
using Roslyn.Utilities;
namespace Microsoft.CodeAnalysis.Syntax;
internal abstract class SyntaxList : SyntaxNode
{
internal sealed class SeparatedWithManyChildren : SyntaxList
{
private readonly ArrayElement<SyntaxNode?>[] _children;
internal SeparatedWithManyChildren(Microsoft.CodeAnalysis.Syntax.InternalSyntax.SyntaxList green, SyntaxNode? parent, int position)
: base(green, parent, position)
{
_children = new ArrayElement<SyntaxNode>[green.SlotCount + 1 >> 1];
}
internal override SyntaxNode? GetNodeSlot(int i)
{
if ((i & 1) != 0)
{
return null;
}
return GetRedElement(ref _children[i >> 1].Value, i);
}
internal override SyntaxNode? GetCachedSlot(int i)
{
if ((i & 1) != 0)
{
return null;
}
return _children[i >> 1].Value;
}
internal override int GetChildPosition(int index)
{
int num = (((index & 1) != 0) ? (index - 1) : index);
if (num > 1 && GetCachedSlot(num - 2) == null && (num >= base.Green.SlotCount - 2 || GetCachedSlot(num + 2) != null))
{
return GetChildPositionFromEnd(index);
}
return base.GetChildPosition(index);
}
}
internal sealed class SeparatedWithManyWeakChildren : SyntaxList
{
private readonly ArrayElement<WeakReference<SyntaxNode>?>[] _children;
internal SeparatedWithManyWeakChildren(Microsoft.CodeAnalysis.Syntax.InternalSyntax.SyntaxList green, SyntaxNode parent, int position)
: base(green, parent, position)
{
_children = new ArrayElement<WeakReference<SyntaxNode>>[(green.SlotCount + 1 >> 1) - 1];
}
internal override SyntaxNode? GetNodeSlot(int i)
{
SyntaxNode result = null;
if ((i & 1) == 0)
{
result = GetWeakRedElement(ref _children[i >> 1].Value, i);
}
return result;
}
internal override SyntaxNode? GetCachedSlot(int i)
{
SyntaxNode target = null;
if ((i & 1) == 0)
{
_children[i >> 1].Value?.TryGetTarget(out target);
}
return target;
}
}
internal sealed class WithManyChildren : SyntaxList
{
private readonly ArrayElement<SyntaxNode?>[] _children;
internal WithManyChildren(Microsoft.CodeAnalysis.Syntax.InternalSyntax.SyntaxList green, SyntaxNode? parent, int position)
: base(green, parent, position)
{
_children = new ArrayElement<SyntaxNode>[green.SlotCount];
}
internal override SyntaxNode? GetNodeSlot(int index)
{
return GetRedElement(ref _children[index].Value, index);
}
internal override SyntaxNode? GetCachedSlot(int index)
{
return _children[index];
}
}
internal sealed class WithManyWeakChildren : SyntaxList
{
private readonly ArrayElement<WeakReference<SyntaxNode>?>[] _children;
private readonly int[] _childPositions;
internal WithManyWeakChildren(Microsoft.CodeAnalysis.Syntax.InternalSyntax.SyntaxList.WithManyChildrenBase green, SyntaxNode parent, int position)
: base(green, parent, position)
{
int slotCount = green.SlotCount;
_children = new ArrayElement<WeakReference<SyntaxNode>>[slotCount];
int[] array = new int[slotCount];
int num = position;
ArrayElement<GreenNode>[] children = green.children;
for (int i = 0; i < array.Length; i++)
{
array[i] = num;
num += children[i].Value.FullWidth;
}
_childPositions = array;
}
internal override int GetChildPosition(int index)
{
return _childPositions[index];
}
internal override SyntaxNode GetNodeSlot(int index)
{
return GetWeakRedElement(ref _children[index].Value, index);
}
internal override SyntaxNode? GetCachedSlot(int index)
{
SyntaxNode target = null;
_children[index].Value?.TryGetTarget(out target);
return target;
}
}
internal sealed class WithThreeChildren : SyntaxList
{
private SyntaxNode? _child0;
private SyntaxNode? _child1;
private SyntaxNode? _child2;
internal WithThreeChildren(Microsoft.CodeAnalysis.Syntax.InternalSyntax.SyntaxList green, SyntaxNode? parent, int position)
: base(green, parent, position)
{
}
internal override SyntaxNode? GetNodeSlot(int index)
{
return index switch
{
0 => GetRedElement(ref _child0, 0),
1 => GetRedElementIfNotToken(ref _child1),
2 => GetRedElement(ref _child2, 2),
_ => null,
};
}
internal override SyntaxNode? GetCachedSlot(int index)
{
return index switch
{
0 => _child0,
1 => _child1,
2 => _child2,
_ => null,
};
}
}
internal sealed class WithTwoChildren : SyntaxList
{
private SyntaxNode? _child0;
private SyntaxNode? _child1;
internal WithTwoChildren(Microsoft.CodeAnalysis.Syntax.InternalSyntax.SyntaxList green, SyntaxNode? parent, int position)
: base(green, parent, position)
{
}
internal override SyntaxNode? GetNodeSlot(int index)
{
return index switch
{
0 => GetRedElement(ref _child0, 0),
1 => GetRedElementIfNotToken(ref _child1),
_ => null,
};
}
internal override SyntaxNode? GetCachedSlot(int index)
{
return index switch
{
0 => _child0,
1 => _child1,
_ => null,
};
}
}
public override string Language
{
get
{
throw ExceptionUtilities.Unreachable("/_/src/Compilers/Core/Portable/Syntax/SyntaxList.cs", 22);
}
}
protected override SyntaxTree SyntaxTreeCore => base.Parent.SyntaxTree;
internal SyntaxList(Microsoft.CodeAnalysis.Syntax.InternalSyntax.SyntaxList green, SyntaxNode? parent, int position)
: base(green, parent, position)
{
}
protected internal override SyntaxNode ReplaceCore<TNode>(IEnumerable<TNode>? nodes = null, Func<TNode, TNode, SyntaxNode>? computeReplacementNode = null, IEnumerable<SyntaxToken>? tokens = null, Func<SyntaxToken, SyntaxToken, SyntaxToken>? computeReplacementToken = null, IEnumerable<SyntaxTrivia>? trivia = null, Func<SyntaxTrivia, SyntaxTrivia, SyntaxTrivia>? computeReplacementTrivia = null)
{
throw ExceptionUtilities.Unreachable("/_/src/Compilers/Core/Portable/Syntax/SyntaxList.cs", 31);
}
protected internal override SyntaxNode ReplaceNodeInListCore(SyntaxNode originalNode, IEnumerable<SyntaxNode> replacementNodes)
{
throw ExceptionUtilities.Unreachable("/_/src/Compilers/Core/Portable/Syntax/SyntaxList.cs", 36);
}
protected internal override SyntaxNode InsertNodesInListCore(SyntaxNode nodeInList, IEnumerable<SyntaxNode> nodesToInsert, bool insertBefore)
{
throw ExceptionUtilities.Unreachable("/_/src/Compilers/Core/Portable/Syntax/SyntaxList.cs", 41);
}
protected internal override SyntaxNode ReplaceTokenInListCore(SyntaxToken originalToken, IEnumerable<SyntaxToken> newTokens)
{
throw ExceptionUtilities.Unreachable("/_/src/Compilers/Core/Portable/Syntax/SyntaxList.cs", 46);
}
protected internal override SyntaxNode InsertTokensInListCore(SyntaxToken originalToken, IEnumerable<SyntaxToken> newTokens, bool insertBefore)
{
throw ExceptionUtilities.Unreachable("/_/src/Compilers/Core/Portable/Syntax/SyntaxList.cs", 51);
}
protected internal override SyntaxNode ReplaceTriviaInListCore(SyntaxTrivia originalTrivia, IEnumerable<SyntaxTrivia> newTrivia)
{
throw ExceptionUtilities.Unreachable("/_/src/Compilers/Core/Portable/Syntax/SyntaxList.cs", 56);
}
protected internal override SyntaxNode InsertTriviaInListCore(SyntaxTrivia originalTrivia, IEnumerable<SyntaxTrivia> newTrivia, bool insertBefore)
{
throw ExceptionUtilities.Unreachable("/_/src/Compilers/Core/Portable/Syntax/SyntaxList.cs", 61);
}
protected internal override SyntaxNode RemoveNodesCore(IEnumerable<SyntaxNode> nodes, SyntaxRemoveOptions options)
{
throw ExceptionUtilities.Unreachable("/_/src/Compilers/Core/Portable/Syntax/SyntaxList.cs", 66);
}
protected internal override SyntaxNode NormalizeWhitespaceCore(string indentation, string eol, bool elasticTrivia)
{
throw ExceptionUtilities.Unreachable("/_/src/Compilers/Core/Portable/Syntax/SyntaxList.cs", 71);
}
protected override bool IsEquivalentToCore(SyntaxNode node, bool topLevel = false)
{
throw ExceptionUtilities.Unreachable("/_/src/Compilers/Core/Portable/Syntax/SyntaxList.cs", 76);
}
}