|
// Copyright (c) .NET Foundation and contributors. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.Operations;
namespace ILLink.RoslynAnalyzer.DataFlow
{
// Adapted from https://github.com/dotnet/roslyn/
public abstract class OperationWalker<TArgument, TResult> : OperationVisitor<TArgument, TResult>
{
private int _recursionDepth;
private void VisitChildOperations(IOperation operation, TArgument argument)
{
foreach (var child in operation.ChildOperations)
Visit(child, argument);
}
public override TResult? Visit(IOperation? operation, TArgument argument)
{
if (operation != null)
{
_recursionDepth++;
try
{
StackGuard.EnsureSufficientExecutionStack(_recursionDepth);
return operation.Accept(this, argument);
}
finally
{
_recursionDepth--;
}
}
return default;
}
public override TResult? DefaultVisit(IOperation operation, TArgument argument)
{
VisitChildOperations(operation, argument);
return default;
}
}
}
|