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

58 lines
2.0 KiB
C#

namespace Microsoft.CodeAnalysis.CSharp.Syntax.InternalSyntax;
internal class SyntaxFirstTokenReplacer : CSharpSyntaxRewriter
{
private readonly SyntaxToken _oldToken;
private readonly SyntaxToken _newToken;
private readonly int _diagnosticOffsetDelta;
private bool _foundOldToken;
private SyntaxFirstTokenReplacer(SyntaxToken oldToken, SyntaxToken newToken, int diagnosticOffsetDelta)
{
_oldToken = oldToken;
_newToken = newToken;
_diagnosticOffsetDelta = diagnosticOffsetDelta;
_foundOldToken = false;
}
internal static TRoot Replace<TRoot>(TRoot root, SyntaxToken oldToken, SyntaxToken newToken, int diagnosticOffsetDelta) where TRoot : CSharpSyntaxNode
{
return (TRoot)new SyntaxFirstTokenReplacer(oldToken, newToken, diagnosticOffsetDelta).Visit(root);
}
public override CSharpSyntaxNode Visit(CSharpSyntaxNode node)
{
if (node != null && !_foundOldToken)
{
if (node is SyntaxToken)
{
_foundOldToken = true;
return _newToken;
}
return UpdateDiagnosticOffset(base.Visit(node), _diagnosticOffsetDelta);
}
return node;
}
private static TSyntax UpdateDiagnosticOffset<TSyntax>(TSyntax node, int diagnosticOffsetDelta) where TSyntax : CSharpSyntaxNode
{
DiagnosticInfo[] diagnostics = ((GreenNode)node).GetDiagnostics();
if (diagnostics == null || diagnostics.Length == 0)
{
return node;
}
int num = diagnostics.Length;
DiagnosticInfo[] array = (DiagnosticInfo[])(object)new DiagnosticInfo[num];
for (int i = 0; i < num; i++)
{
DiagnosticInfo val = diagnostics[i];
SyntaxDiagnosticInfo syntaxDiagnosticInfo = val as SyntaxDiagnosticInfo;
array[i] = (DiagnosticInfo)(object)((syntaxDiagnosticInfo == null) ? ((SyntaxDiagnosticInfo)(object)val) : new SyntaxDiagnosticInfo(syntaxDiagnosticInfo.Offset + diagnosticOffsetDelta, syntaxDiagnosticInfo.Width, (ErrorCode)((DiagnosticInfo)syntaxDiagnosticInfo).Code, ((DiagnosticInfo)syntaxDiagnosticInfo).Arguments));
}
return GreenNodeExtensions.WithDiagnosticsGreen<TSyntax>(node, array);
}
}