internal static T? FindAncestor()

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;
        }