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 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 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(node, array); } }