11using System . Collections . Immutable ;
2+ using System . Diagnostics ;
23
34using Microsoft . CodeAnalysis ;
4- using Microsoft . CodeAnalysis . CSharp . Syntax ;
55using Microsoft . CodeAnalysis . Diagnostics ;
66
77namespace Sundstrom . CheckedExceptions ;
88
99partial class CheckedExceptionsAnalyzer
1010{
11- #region Method
12-
1311 private void CheckForCompatibilityWithBaseOrInterface ( SymbolAnalysisContext context , ImmutableArray < AttributeData > throwsAttributes )
1412 {
1513 var method = ( IMethodSymbol ) context . Symbol ;
@@ -22,7 +20,8 @@ MethodKind.EventAdd or
2220 MethodKind . EventRemove ) )
2321 return ;
2422
25- var declaredExceptions = GetDistictExceptionTypes ( throwsAttributes ) . ToImmutableHashSet ( SymbolEqualityComparer . Default ) ;
23+ ImmutableHashSet < ISymbol > declaredExceptions = GetDistictExceptionTypes ( throwsAttributes ) . Where ( x => x is not null ) . ToImmutableHashSet ( SymbolEqualityComparer . Default ) ! ;
24+ Debug . Assert ( ! declaredExceptions . Any ( x => x is null ) ) ;
2625
2726 if ( declaredExceptions . Count == 0 )
2827 return ;
@@ -41,7 +40,7 @@ MethodKind.EventAdd or
4140 }
4241 }
4342
44- private void AnalyzeMissingThrowsFromBaseMember ( SymbolAnalysisContext context , IMethodSymbol method , ImmutableHashSet < ISymbol ? > declaredExceptions , IMethodSymbol baseMethod , ImmutableHashSet < ISymbol ? > baseExceptions )
43+ private void AnalyzeMissingThrowsFromBaseMember ( SymbolAnalysisContext context , IMethodSymbol method , ImmutableHashSet < ISymbol > declaredExceptions , IMethodSymbol baseMethod , ImmutableHashSet < ISymbol ? > baseExceptions )
4544 {
4645 foreach ( var baseException in baseExceptions . OfType < ITypeSymbol > ( ) )
4746 {
@@ -51,7 +50,7 @@ private void AnalyzeMissingThrowsFromBaseMember(SymbolAnalysisContext context, I
5150
5251 var isCovered = declaredExceptions . Any ( declared =>
5352 {
54- if ( declared . Equals ( baseException , SymbolEqualityComparer . Default ) )
53+ if ( baseException . Equals ( declared , SymbolEqualityComparer . Default ) )
5554 return true ;
5655
5756 var declaredNamed = declared as INamedTypeSymbol ;
@@ -76,13 +75,13 @@ private void AnalyzeMissingThrowsFromBaseMember(SymbolAnalysisContext context, I
7675 }
7776 }
7877
79- private static void AnalyzeMissingThrowsOnBaseMember ( SymbolAnalysisContext context , IMethodSymbol method , ImmutableHashSet < ISymbol ? > declaredExceptions , IMethodSymbol baseMethod , ImmutableHashSet < ISymbol ? > baseExceptions )
78+ private static void AnalyzeMissingThrowsOnBaseMember ( SymbolAnalysisContext context , IMethodSymbol method , ImmutableHashSet < ISymbol > declaredExceptions , IMethodSymbol baseMethod , ImmutableHashSet < ISymbol ? > baseExceptions )
8079 {
8180 foreach ( var declared in declaredExceptions )
8281 {
83- var isCompatible = baseExceptions . Any ( baseEx =>
84- declared . Equals ( baseEx , SymbolEqualityComparer . Default ) ||
85- ( ( INamedTypeSymbol ) declared ) . InheritsFrom ( ( INamedTypeSymbol ) baseEx ) ) ;
82+ var isCompatible = baseExceptions . Any ( baseEx => baseEx is not null &&
83+ ( declared . Equals ( baseEx , SymbolEqualityComparer . Default )
84+ || ( ( INamedTypeSymbol ) declared ) . InheritsFrom ( ( INamedTypeSymbol ) baseEx ) ) ) ;
8685
8786 if ( ! isCompatible )
8887 {
@@ -102,13 +101,11 @@ private static void AnalyzeMissingThrowsOnBaseMember(SymbolAnalysisContext conte
102101
103102 private bool IsTooGenericException ( ITypeSymbol ex )
104103 {
105- var namedType = ex as INamedTypeSymbol ;
106- if ( namedType == null )
107- return false ;
108-
109- var fullName = namedType . ToDisplayString ( ) ;
104+ if ( ex is not INamedTypeSymbol namedTypeSymbol ) return false ;
105+
106+ var fullName = namedTypeSymbol . ToDisplayString ( ) ;
110107
111- return fullName == "System. Exception" || fullName == "System. SystemException" ;
108+ return fullName . Equals ( typeof ( Exception ) . FullName , StringComparison . Ordinal ) || fullName . Equals ( typeof ( SystemException ) . FullName , StringComparison . Ordinal ) ;
112109 }
113110
114111 private IEnumerable < IMethodSymbol > GetBaseOrInterfaceMethods ( IMethodSymbol method )
@@ -120,18 +117,18 @@ private IEnumerable<IMethodSymbol> GetBaseOrInterfaceMethods(IMethodSymbol metho
120117
121118 if ( method . AssociatedSymbol is IPropertySymbol prop && prop . OverriddenProperty is not null )
122119 {
123- if ( SymbolEqualityComparer . Default . Equals ( method , prop . GetMethod ) )
124- results . Add ( prop . OverriddenProperty . GetMethod ) ;
125- else if ( SymbolEqualityComparer . Default . Equals ( method , prop . SetMethod ) )
126- results . Add ( prop . OverriddenProperty . SetMethod ) ;
120+ if ( SymbolEqualityComparer . Default . Equals ( method , prop . GetMethod ) && prop . OverriddenProperty . GetMethod is { } getMethodSymbol )
121+ results . Add ( getMethodSymbol ) ;
122+ else if ( SymbolEqualityComparer . Default . Equals ( method , prop . SetMethod ) && prop . OverriddenProperty . SetMethod is { } setMethodSymbol )
123+ results . Add ( setMethodSymbol ) ;
127124 }
128125
129126 if ( method . AssociatedSymbol is IEventSymbol ev && ev . OverriddenEvent is not null )
130127 {
131- if ( SymbolEqualityComparer . Default . Equals ( method , ev . AddMethod ) )
132- results . Add ( ev . OverriddenEvent . AddMethod ) ;
133- else if ( SymbolEqualityComparer . Default . Equals ( method , ev . RemoveMethod ) )
134- results . Add ( ev . OverriddenEvent . RemoveMethod ) ;
128+ if ( SymbolEqualityComparer . Default . Equals ( method , ev . AddMethod ) && ev . OverriddenEvent . AddMethod is { } addMethodSymbol )
129+ results . Add ( addMethodSymbol ) ;
130+ else if ( SymbolEqualityComparer . Default . Equals ( method , ev . RemoveMethod ) && ev . OverriddenEvent . RemoveMethod is { } removeMethodSymbol )
131+ results . Add ( removeMethodSymbol ) ;
135132 }
136133
137134 var type = method . ContainingType ;
@@ -149,6 +146,4 @@ private IEnumerable<IMethodSymbol> GetBaseOrInterfaceMethods(IMethodSymbol metho
149146
150147 return results ;
151148 }
152-
153- #endregion
154149}
0 commit comments