in src/Microsoft.VisualStudio.SDK.Analyzers/Utils.cs [183:220]
internal static T? FindAncestor<T>(SyntaxNode syntaxNode, Func<SyntaxNode, bool> continueAscending, Func<T, SyntaxNode, bool> isMatch)
where T : SyntaxNode
{
if (continueAscending == null)
{
throw new ArgumentNullException(nameof(continueAscending));
}
if (isMatch == null)
{
throw new ArgumentNullException(nameof(isMatch));
}
if (syntaxNode == null)
{
return default;
}
SyntaxNode current = syntaxNode.Parent;
SyntaxNode child = syntaxNode;
while (current != null)
{
if (current is T t && isMatch(t, child))
{
return t;
}
if (!continueAscending(current))
{
return default;
}
child = current;
current = current.Parent;
}
return default;
}