Files

53 lines
1.3 KiB
C#
Raw Normal View History

2026-08-27 10:56:38 -06:00
using Microsoft.CodeAnalysis.Syntax.InternalSyntax;
namespace Microsoft.CodeAnalysis.CSharp.Syntax.InternalSyntax;
internal class SyntaxLastTokenReplacer : CSharpSyntaxRewriter
{
private readonly SyntaxToken _oldToken;
private readonly SyntaxToken _newToken;
private int _count = 1;
private bool _found;
private SyntaxLastTokenReplacer(SyntaxToken oldToken, SyntaxToken newToken)
{
_oldToken = oldToken;
_newToken = newToken;
}
internal static TRoot Replace<TRoot>(TRoot root, SyntaxToken newToken) where TRoot : CSharpSyntaxNode
{
return (TRoot)new SyntaxLastTokenReplacer(root.GetLastToken(), newToken).Visit(root);
}
private static int CountNonNullSlots(CSharpSyntaxNode node)
{
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
//IL_0006: Unknown result type (might be due to invalid IL or missing references)
ChildSyntaxList val = ((GreenNode)node).ChildNodesAndTokens();
return ((ChildSyntaxList)(ref val)).Count;
}
public override CSharpSyntaxNode Visit(CSharpSyntaxNode node)
{
if (node != null && !_found)
{
_count--;
if (_count == 0)
{
if (node is SyntaxToken)
{
_found = true;
return _newToken;
}
_count += CountNonNullSlots(node);
return base.Visit(node);
}
}
return node;
}
}