58 lines
2.0 KiB
C#
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);
|
|
}
|
|
}
|