public static void AnalyzeIndexerDeclaration(SyntaxNodeAnalysisContext context)
        {
            var indexerDeclaration = (IndexerDeclarationSyntax)context.Node;

            if (indexerDeclaration.ContainsDiagnostics)
                return;

            if (indexerDeclaration.IsParentKind(SyntaxKind.InterfaceDeclaration))
                return;

            if (indexerDeclaration.Modifiers.ContainsAny(SyntaxKind.AbstractKeyword, SyntaxKind.VirtualKeyword, SyntaxKind.OverrideKeyword))
                return;

            ParametersInfo parametersInfo = SyntaxInfo.ParametersInfo(indexerDeclaration);

            if (!parametersInfo.Success)
                return;

            if (ContainsOnlyThrowNewExpression(parametersInfo.Body))
                return;

            IPropertySymbol propertySymbol = context.SemanticModel.GetDeclaredSymbol(indexerDeclaration, context.CancellationToken);

            if (propertySymbol?.ExplicitInterfaceImplementations.IsDefaultOrEmpty != true)
                return;

            if (propertySymbol.ImplementsInterfaceMember())
                return;

            Analyze(context, parametersInfo, isIndexer: true);
        }
예제 #2
0
        public static void AnalyzeAnonymousMethodExpression(SyntaxNodeAnalysisContext context, INamedTypeSymbol eventArgsSymbol)
        {
            var anonymousMethod = (AnonymousMethodExpressionSyntax)context.Node;

            if (anonymousMethod.ContainsDiagnostics)
            {
                return;
            }

            ParametersInfo parametersInfo = SyntaxInfo.ParametersInfo(anonymousMethod);

            if (!parametersInfo.Success)
            {
                return;
            }

            var methodSymbol = (IMethodSymbol)context.SemanticModel.GetSymbol(anonymousMethod, context.CancellationToken);

            if (methodSymbol == null)
            {
                return;
            }

            if (SymbolUtility.IsEventHandlerMethod(methodSymbol, eventArgsSymbol))
            {
                return;
            }

            Analyze(context, parametersInfo);
        }
예제 #3
0
        public static void AnalyzeLocalFunctionStatement(SyntaxNodeAnalysisContext context, INamedTypeSymbol eventArgsSymbol)
        {
            var localFunctionStatement = (LocalFunctionStatementSyntax)context.Node;

            if (localFunctionStatement.ContainsDiagnostics)
            {
                return;
            }

            ParametersInfo parametersInfo = SyntaxInfo.ParametersInfo(localFunctionStatement);

            if (!parametersInfo.Success)
            {
                return;
            }

            var methodSymbol = (IMethodSymbol)context.SemanticModel.GetDeclaredSymbol(localFunctionStatement, context.CancellationToken);

            if (methodSymbol == null)
            {
                return;
            }

            if (SymbolUtility.IsEventHandlerMethod(methodSymbol, eventArgsSymbol))
            {
                return;
            }

            Analyze(context, parametersInfo);
        }
        public static void AnalyzeOperatorDeclaration(SyntaxNodeAnalysisContext context)
        {
            var operatorDeclaration = (OperatorDeclarationSyntax)context.Node;

            if (operatorDeclaration.ContainsDiagnostics)
                return;

            ParametersInfo parametersInfo = SyntaxInfo.ParametersInfo(operatorDeclaration);

            if (!parametersInfo.Success)
                return;

            if (ContainsOnlyThrowNewExpression(parametersInfo.Body))
                return;

            Analyze(context, parametersInfo);
        }
        public static void AnalyzeMethodDeclaration(SyntaxNodeAnalysisContext context, INamedTypeSymbol eventArgsSymbol)
        {
            var methodDeclaration = (MethodDeclarationSyntax)context.Node;

            if (methodDeclaration.ContainsDiagnostics)
                return;

            if (methodDeclaration.IsParentKind(SyntaxKind.InterfaceDeclaration))
                return;

            if (methodDeclaration.Modifiers.ContainsAny(SyntaxKind.AbstractKeyword, SyntaxKind.VirtualKeyword, SyntaxKind.OverrideKeyword))
                return;

            ParametersInfo parametersInfo = SyntaxInfo.ParametersInfo(methodDeclaration);

            if (!parametersInfo.Success)
                return;

            if (ContainsOnlyThrowNewExpression(parametersInfo.Body))
                return;

            IMethodSymbol methodSymbol = context.SemanticModel.GetDeclaredSymbol(methodDeclaration, context.CancellationToken);

            if (methodSymbol == null)
                return;

            if (SymbolUtility.IsEventHandlerMethod(methodSymbol, eventArgsSymbol))
                return;

            if (!methodSymbol.ExplicitInterfaceImplementations.IsDefaultOrEmpty)
                return;

            if (methodSymbol.ImplementsInterfaceMember())
                return;

            Dictionary<string, NodeSymbolInfo> unusedNodes = FindUnusedNodes(context, parametersInfo);

            if (unusedNodes.Count == 0)
                return;

            if (IsReferencedAsMethodGroup(context, methodDeclaration))
                return;

            foreach (KeyValuePair<string, NodeSymbolInfo> kvp in unusedNodes)
                ReportDiagnostic(context, kvp.Value.Node);
        }
예제 #6
0
        public static void AnalyzeConstructorDeclaration(
            SyntaxNodeAnalysisContext context,
            INamedTypeSymbol serializationInfoSymbol,
            INamedTypeSymbol streamingContextSymbol)
        {
            var constructorDeclaration = (ConstructorDeclarationSyntax)context.Node;

            if (constructorDeclaration.ContainsDiagnostics)
            {
                return;
            }

            ParametersInfo parametersInfo = SyntaxInfo.ParametersInfo(constructorDeclaration);

            if (!parametersInfo.Success)
            {
                return;
            }

            if (ContainsOnlyThrowNewExpression(parametersInfo.Body))
            {
                return;
            }

            // Skip a constructor that is required by ISerializable interface
            if (serializationInfoSymbol != null &&
                parametersInfo.Parameters.Count == 2)
            {
                IMethodSymbol symbol = context.SemanticModel.GetDeclaredSymbol(constructorDeclaration, context.CancellationToken);

                if (symbol != null)
                {
                    ImmutableArray <IParameterSymbol> parameters = symbol.Parameters;

                    if (parameters.Length == 2 &&
                        parameters[0].Type.Equals(serializationInfoSymbol) &&
                        parameters[1].Type.Equals(streamingContextSymbol))
                    {
                        return;
                    }
                }
            }

            Analyze(context, parametersInfo);
        }
        public static void AnalyzeParenthesizedLambdaExpression(SyntaxNodeAnalysisContext context, INamedTypeSymbol eventArgsSymbol)
        {
            var lambda = (ParenthesizedLambdaExpressionSyntax)context.Node;

            if (lambda.ContainsDiagnostics)
                return;

            ParametersInfo parametersInfo = SyntaxInfo.ParametersInfo(lambda);

            if (!parametersInfo.Success)
                return;

            var methodSymbol = (IMethodSymbol)context.SemanticModel.GetSymbol(lambda, context.CancellationToken);

            if (methodSymbol == null)
                return;

            if (SymbolUtility.IsEventHandlerMethod(methodSymbol, eventArgsSymbol))
                return;

            Analyze(context, parametersInfo);
        }
        public static void AnalyzeConstructorDeclaration(SyntaxNodeAnalysisContext context)
        {
            var constructorDeclaration = (ConstructorDeclarationSyntax)context.Node;

            if (constructorDeclaration.ContainsDiagnostics)
            {
                return;
            }

            ParametersInfo parametersInfo = SyntaxInfo.ParametersInfo(constructorDeclaration);

            if (!parametersInfo.Success)
            {
                return;
            }

            if (ContainsOnlyThrowNewException(parametersInfo.Body, context.SemanticModel, context.CancellationToken))
            {
                return;
            }

            Analyze(context, parametersInfo);
        }