1+ using System . Linq ;
12using Microsoft . CodeAnalysis ;
23using Microsoft . CodeAnalysis . CSharp ;
34using Microsoft . CodeAnalysis . CSharp . Syntax ;
@@ -69,10 +70,30 @@ private bool IsStaticInvocationStartWith(InvocationExpressionSyntax invocation)
6970 private static bool IsInvocationFromAbstractions ( SyntaxNodeAnalysisContext context , InvocationExpressionSyntax invocation )
7071 {
7172 return ( invocation ? . Expression as MemberAccessExpressionSyntax ) ? . Expression is ExpressionSyntax invokedMember
72- && context . SemanticModel . GetSymbolInfo ( invokedMember ) . Symbol is ISymbol symbol
73- && ( ( symbol as IPropertySymbol ) ? . Type ?? ( symbol as IFieldSymbol ) ? . Type ) is ITypeSymbol type
74- && ! type . ContainingNamespace . IsGlobalNamespace
75- && type . ContainingNamespace . ToString ( ) . StartsWith ( Constants . FileSystemNameSpace , StringComparison . Ordinal ) ;
73+ && IsSymbolFromAbstractions ( context . SemanticModel . GetSymbolInfo ( invokedMember ) ) ;
74+ }
75+
76+ private static bool IsSymbolFromAbstractions ( SymbolInfo symbolInfo )
77+ {
78+ if ( symbolInfo . Symbol is ISymbol symbol )
79+ {
80+ return IsSymbolFromAbstractions ( symbol ) ;
81+ } else if ( symbolInfo . CandidateSymbols . Length > 0 )
82+ {
83+ return symbolInfo . CandidateSymbols . All ( IsSymbolFromAbstractions ) ;
84+ }
85+ return false ;
86+ }
87+
88+ private static bool IsSymbolFromAbstractions ( ISymbol symbol )
89+ {
90+ INamespaceSymbol namespaceSymbol
91+ = ( ( symbol as IPropertySymbol ) ? . Type ?? ( symbol as IFieldSymbol ) ? . Type ) ? . ContainingNamespace
92+ ?? ( symbol as IMethodSymbol ) ? . ContainingNamespace ;
93+
94+ return namespaceSymbol != null
95+ && ! namespaceSymbol . IsGlobalNamespace
96+ && namespaceSymbol . ToString ( ) . StartsWith ( Constants . FileSystemNameSpace , StringComparison . Ordinal ) ;
7697 }
7798 }
7899}
0 commit comments