Ejemplo n.º 1
0
        public void FindEntityCalls(SyntaxNodeAnalysisContext context)
        {
            if (context.Node is MemberAccessExpressionSyntax expression &&
                SyntaxNodeUtils.IsInsideFunction(context.SemanticModel, expression))
            {
                var name = expression.Name;
                if (name.ToString().StartsWith("SignalEntityAsync"))
                {
                    if (!SyntaxNodeUtils.TryGetTypeArgumentIdentifier(expression, out SyntaxNode typeArgument))
                    {
                        return;
                    }

                    if (TryFindEntityInterface(context, typeArgument, out EntityInterface entityInterface))
                    {
                        entityInterfacesList.Add(entityInterface);
                    }
                    else
                    {
                        var diagnostic = Diagnostic.Create(Rule, typeArgument.GetLocation(), typeArgument);

                        context.ReportDiagnostic(diagnostic);
                    }
                }
            }
        }
Ejemplo n.º 2
0
        private void AnalyzeDispatchAndFindMethodDeclarations(SyntaxNodeAnalysisContext context)
        {
            if (context.Node is MemberAccessExpressionSyntax expression &&
                SyntaxNodeUtils.IsInsideFunction(context.SemanticModel, expression))
            {
                var name = expression.Name;
                if (name.ToString().StartsWith("DispatchAsync"))
                {
                    if (SyntaxNodeUtils.TryGetMethodDeclaration(expression, out SyntaxNode methodDeclaration))
                    {
                        methodDeclarations.Add(methodDeclaration);
                    }

                    if (SyntaxNodeUtils.TryGetTypeArgumentIdentifier(expression, out SyntaxNode identifierNode))
                    {
                        if (SyntaxNodeUtils.TryGetFunctionName(context.SemanticModel, expression, out string functionName))
                        {
                            var identifierName = identifierNode.ToString();
                            if (!string.Equals(identifierName, functionName))
                            {
                                var diagnostic = Diagnostic.Create(Rule, identifierNode.GetLocation(), identifierNode, functionName);

                                context.ReportDiagnostic(diagnostic);
                            }
                        }
                    }
                }
            }
        }
Ejemplo n.º 3
0
        public void FindActivityCall(SyntaxNodeAnalysisContext context)
        {
            SetSemanticModel(context);

            var semanticModel = context.SemanticModel;

            if (context.Node is InvocationExpressionSyntax invocationExpression &&
                SyntaxNodeUtils.IsInsideFunction(semanticModel, invocationExpression) &&
                IsActivityInvocation(invocationExpression))
            {
                if (!TryGetFunctionNameFromActivityInvocation(invocationExpression, out SyntaxNode functionNameNode, out string functionName))
                {
                    //Do not store ActivityFunctionCall if there is no function name
                    return;
                }

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

                TryGetInputNodeFromCallActivityInvocation(invocationExpression, out SyntaxNode inputNode);

                calledFunctions.Add(new ActivityFunctionCall
                {
                    FunctionName         = functionName,
                    NameNode             = functionNameNode,
                    ArgumentNode         = inputNode,
                    ReturnTypeNode       = returnTypeNode,
                    InvocationExpression = invocationExpression
                });
            }
        }
Ejemplo n.º 4
0
        private static bool TryGetInputTypeFromContext(SemanticModel semanticModel, SyntaxNode node, out ITypeSymbol definitionInputType)
        {
            if (TryGetDurableActivityContextExpression(semanticModel, node, out SyntaxNode durableContextExpression))
            {
                if (SyntaxNodeUtils.TryGetTypeArgumentIdentifier((MemberAccessExpressionSyntax)durableContextExpression, out SyntaxNode typeArgument))
                {
                    return(SyntaxNodeUtils.TryGetITypeSymbol(semanticModel, typeArgument, out definitionInputType));
                }
            }

            definitionInputType = null;
            return(false);
        }
        private void FindActivityCalls()
        {
            var orchestratorMethods = this.orchestratorMethodCollector.GetOrchestratorMethods();

            foreach (MethodInformation methodInformation in orchestratorMethods)
            {
                var declaration = methodInformation.Declaration;
                if (declaration != null)
                {
                    var invocationExpressions = declaration.DescendantNodes().OfType <InvocationExpressionSyntax>();

                    this.semanticModel = methodInformation.SemanticModel;

                    foreach (var invocation in invocationExpressions)
                    {
                        if (IsActivityInvocation(invocation))
                        {
                            if (!TryGetFunctionNameFromActivityInvocation(invocation, out SyntaxNode functionNameNode, out string functionName))
                            {
                                //Do not store ActivityFunctionCall if there is no function name
                                return;
                            }

                            SyntaxNodeUtils.TryGetTypeArgumentIdentifier((MemberAccessExpressionSyntax)invocation.Expression, out SyntaxNode returnTypeNode);

                            SyntaxNodeUtils.TryGetITypeSymbol(this.semanticModel, returnTypeNode, out ITypeSymbol returnType);

                            TryGetInputNodeFromCallActivityInvocation(this.semanticModel, invocation, out SyntaxNode inputNode);

                            SyntaxNodeUtils.TryGetITypeSymbol(this.semanticModel, inputNode, out ITypeSymbol inputType);

                            this.calledFunctions.Add(new ActivityFunctionCall
                            {
                                FunctionName         = functionName,
                                NameNode             = functionNameNode,
                                InputNode            = inputNode,
                                InputType            = inputType,
                                ReturnTypeNode       = returnTypeNode,
                                ReturnType           = returnType,
                                InvocationExpression = invocation
                            });
                        }
                    }
                }
            }
        }