private static void AnalyzeInterfaceImplementations(SymbolAnalysisContext context)
    {
        INamedTypeSymbol implementationType = ((INamedTypeSymbol)context.Symbol);

        foreach (INamedTypeSymbol interfaceType in implementationType.Interfaces)
        {
            foreach (ISymbol interfaceMember in interfaceType.GetMembers())
            {
                if ((interfaceMember is IMethodSymbol interfaceMethod) && !(interfaceMethod.AssociatedSymbol is null))
                {
                    // Filter out methods used to implement properties and events
                    continue;
                }

                ISymbol?implementationMember = implementationType.FindImplementationForInterfaceMember(interfaceMember);

                if (!(implementationMember is null))
                {
                    context.ReportIncompatibleExceptions(
                        descriptor: Descriptors.InterfaceImplementationsShouldThrowCompatibleExceptions,
                        exceptions: GetIncompatibleExceptions(context.Compilation, interfaceMember, implementationMember),
                        symbol: interfaceMember
                        );
                }
            }
        }
    }
    private static void AnalyzeOverriddenMember(SymbolAnalysisContext context)
    {
        Compilation compilation = context.Compilation;

        ISymbol overridingMember = context.Symbol;

        if (overridingMember.GetOverriddenMember() is ISymbol overriddenMember)
        {
            context.ReportIncompatibleExceptions(
                descriptor: Descriptors.OverriddenMembersShouldThrowCompatibleExceptions,
                exceptions: GetIncompatibleExceptions(compilation, overriddenMember, overridingMember),
                symbol: overridingMember
                );
        }
    }