예제 #1
0
        public void FindActivityCall(SyntaxNodeAnalysisContext context)
        {
            var semanticModel = context.SemanticModel;

            if (context.Node is InvocationExpressionSyntax invocationExpression &&
                SyntaxNodeUtils.IsInsideFunction(semanticModel, invocationExpression) &&
                IsActivityInvocation(invocationExpression))
            {
                SetSemanticModel(context);

                if (!TryGetFunctionNameFromActivityInvocation(invocationExpression, out SyntaxNode functionNameNode, out string functionName))
                {
                    //Do not store ActivityFunctionCall if there is no function name
                    return;
                }

                SyntaxNodeUtils.TryGetTypeArgumentNode((MemberAccessExpressionSyntax)invocationExpression.Expression, out SyntaxNode returnTypeNode);

                TryGetInputNodeFromCallActivityInvocation(invocationExpression, out SyntaxNode inputNode);

                calledFunctions.Add(new ActivityFunctionCall
                {
                    Name                 = functionName,
                    NameNode             = functionNameNode,
                    ParameterNode        = inputNode,
                    ReturnTypeNode       = returnTypeNode,
                    InvocationExpression = invocationExpression
                });
            }
        }
예제 #2
0
        private void AnalyzeDispatchAndFindMethodDeclarations(SyntaxNodeAnalysisContext context)
        {
            if (context.Node is MemberAccessExpressionSyntax expression &&
                SyntaxNodeUtils.IsInsideFunction(expression))
            {
                var name = expression.Name;
                if (name.ToString().StartsWith("DispatchAsync"))
                {
                    if (SyntaxNodeUtils.TryGetMethodDeclaration(expression, out SyntaxNode methodDeclaration))
                    {
                        methodDeclarations.Add(methodDeclaration);
                    }

                    if (SyntaxNodeUtils.TryGetTypeArgumentNode(expression, out SyntaxNode identifierNode))
                    {
                        if (SyntaxNodeUtils.TryGetFunctionNameAndNode(expression, out SyntaxNode attributeArgument, out string functionName))
                        {
                            var identifierName = identifierNode.ToString();
                            if (!string.Equals(identifierName, functionName))
                            {
                                var diagnostic = Diagnostic.Create(Rule, identifierNode.GetLocation(), identifierNode, functionName);

                                context.ReportDiagnostic(diagnostic);
                            }
                        }
                    }
                }
            }
        }