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