private void AnalyzeInvocation(SyntaxNodeAnalysisContext syntaxNodeContext)
        {
            var invocationExpression = (TInvocationExpressionSyntax)syntaxNodeContext.Node;
            var methodSymbolInfo     = syntaxNodeContext.SemanticModel.GetSymbolInfo(invocationExpression);

            if (methodSymbolInfo.Symbol == null || methodSymbolInfo.Symbol.Kind != SymbolKind.Method)
            {
                return;
            }

            var methodSymbol = (IMethodSymbol)methodSymbolInfo.Symbol;

            if (methodSymbol.IsWhenLikeMethod() == false)
            {
                return;
            }

            var expressionsForAnalysys = _substitutionNodeFinder.FindForWhenExpression(syntaxNodeContext, invocationExpression, methodSymbol);

            foreach (var analysedSyntax in expressionsForAnalysys)
            {
                var symbolInfo = syntaxNodeContext.SemanticModel.GetSymbolInfo(analysedSyntax);
                if (symbolInfo.Symbol != null)
                {
                    Analyze(syntaxNodeContext, analysedSyntax, symbolInfo.Symbol);
                }
            }
        }
예제 #2
0
        private void AnalyzeInvocation(SyntaxNodeAnalysisContext syntaxNodeContext)
        {
            var invocationExpression = (TInvocationExpressionSyntax)syntaxNodeContext.Node;
            var methodSymbolInfo     = syntaxNodeContext.SemanticModel.GetSymbolInfo(invocationExpression);

            if (methodSymbolInfo.Symbol?.Kind != SymbolKind.Method)
            {
                return;
            }

            var methodSymbol = (IMethodSymbol)methodSymbolInfo.Symbol;

            if (methodSymbol == null)
            {
                return;
            }

            if (IsWhenLikeMethod(syntaxNodeContext, invocationExpression, methodSymbol.Name) == false)
            {
                return;
            }

            var expressionsForAnalysys = _substitutionNodeFinder.FindForWhenExpression(syntaxNodeContext, invocationExpression, methodSymbol);

            foreach (var analysedSyntax in expressionsForAnalysys)
            {
                var symbolInfo = syntaxNodeContext.SemanticModel.GetSymbolInfo(analysedSyntax);
                if (symbolInfo.Symbol != null)
                {
                    var canBeSetuped = symbolInfo.Symbol.CanBeSetuped();
                    if (canBeSetuped == false)
                    {
                        var diagnostic = Diagnostic.Create(
                            DiagnosticDescriptorsProvider.NonVirtualWhenSetupSpecification,
                            GetSubstitutionNodeActualLocation(analysedSyntax, symbolInfo),
                            symbolInfo.Symbol.Name);

                        syntaxNodeContext.ReportDiagnostic(diagnostic);
                    }

                    if (canBeSetuped && symbolInfo.Symbol.MemberVisibleToProxyGenerator() == false)
                    {
                        var diagnostic = Diagnostic.Create(
                            DiagnosticDescriptorsProvider.InternalSetupSpecification,
                            GetSubstitutionNodeActualLocation(analysedSyntax, symbolInfo),
                            symbolInfo.Symbol.Name);

                        syntaxNodeContext.ReportDiagnostic(diagnostic);
                    }
                }
            }
        }