private static void AnalyzeAttributeClassName(SyntaxNodeAnalysisContext context)
        {
            var attributeExpression = context.Node as AttributeSyntax;

            if (attributeExpression != null && attributeExpression.ChildNodes().First().ToString() == "EntityTrigger")
            {
                if (SyntaxNodeUtils.TryGetFunctionAttribute(attributeExpression, out SyntaxNode functionAttribute))
                {
                    if (SyntaxNodeUtils.TryGetFunctionName(functionAttribute, out SyntaxNode attributeArgument))
                    {
                        var functionName = attributeArgument.ToString().Trim('"');
                        if (SyntaxNodeUtils.TryGetClassSymbol(attributeExpression, context.SemanticModel, out INamedTypeSymbol classSymbol))
                        {
                            var className = classSymbol.Name.ToString();

                            if (!ClassNameMatchesFunctionName(classSymbol, functionName))
                            {
                                var diagnosticClassName = Diagnostic.Create(Rule, classSymbol.Locations[0], className, functionName);
                                var diagnosticAttribute = Diagnostic.Create(Rule, attributeArgument.GetLocation(), className, functionName);

                                context.ReportDiagnostic(diagnosticClassName);
                                context.ReportDiagnostic(diagnosticAttribute);
                            }
                        }
                    }
                }
            }
        }
Exemplo n.º 2
0
        public void FindActivityFunction(SyntaxNodeAnalysisContext context)
        {
            var attribute = context.Node as AttributeSyntax;

            if (SyntaxNodeUtils.IsActivityTriggerAttribute(attribute))
            {
                if (!SyntaxNodeUtils.TryGetFunctionName(context.SemanticModel, attribute, out string functionName))
                {
                    //Do not store ActivityFunctionDefinition if there is no function name
                    return;
                }

                if (!SyntaxNodeUtils.TryGetMethodReturnTypeNode(attribute, out SyntaxNode returnTypeNode))
                {
                    //Do not store ActivityFunctionDefinition if there is no return type
                    return;
                }

                SyntaxNodeUtils.TryGetParameterNodeNextToAttribute(context, attribute, out SyntaxNode parameterNode);

                availableFunctions.Add(new ActivityFunctionDefinition
                {
                    FunctionName   = functionName,
                    ParameterNode  = parameterNode,
                    ReturnTypeNode = returnTypeNode
                });
            }
        }
        public void FindActivityFunctionDefinition(SyntaxNodeAnalysisContext context)
        {
            var semanticModel = context.SemanticModel;

            if (context.Node is AttributeSyntax attribute &&
                SyntaxNodeUtils.IsActivityTriggerAttribute(attribute))
            {
                if (!SyntaxNodeUtils.TryGetFunctionName(semanticModel, attribute, out string functionName))
                {
                    //Do not store ActivityFunctionDefinition if there is no function name
                    return;
                }

                if (!SyntaxNodeUtils.TryGetMethodReturnTypeNode(attribute, out SyntaxNode returnTypeNode))
                {
                    //Do not store ActivityFunctionDefinition if there is no return type
                    return;
                }

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

                SyntaxNodeUtils.TryGetParameterNodeNextToAttribute(attribute, out SyntaxNode parameterNode);

                TryGetDefinitionInputType(semanticModel, parameterNode, out ITypeSymbol inputType);

                availableFunctions.Add(new ActivityFunctionDefinition
                {
                    FunctionName   = functionName,
                    ParameterNode  = parameterNode,
                    InputType      = inputType,
                    ReturnTypeNode = returnTypeNode,
                    ReturnType     = returnType
                });
            }
        }
Exemplo n.º 4
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);
                            }
                        }
                    }
                }
            }
        }
        private static bool IsInEntityClass(SemanticModel semanticModel, SyntaxNode methodDeclaration)
        {
            if (SyntaxNodeUtils.TryGetFunctionName(semanticModel, methodDeclaration, out string functionName))
            {
                if (SyntaxNodeUtils.TryGetClassName(methodDeclaration, out string className))
                {
                    if (string.Equals(className, functionName))
                    {
                        return(true);
                    }
                }
            }

            return(false);
        }
Exemplo n.º 6
0
        public sealed override async Task RegisterCodeFixesAsync(CodeFixContext context)
        {
            var root = await context.Document.GetSyntaxRootAsync(context.CancellationToken).ConfigureAwait(false);

            var diagnostic     = context.Diagnostics.First();
            var diagnosticSpan = diagnostic.Location.SourceSpan;

            var           identifierNode = root.FindNode(diagnosticSpan);
            SemanticModel semanticModel  = await context.Document.GetSemanticModelAsync();

            if (SyntaxNodeUtils.TryGetFunctionName(semanticModel, identifierNode, out string functionName))
            {
                context.RegisterCodeFix(
                    CodeAction.Create(FixDispatchEntityCall.ToString(), cancellationToken => CodeFixProviderUtils.ReplaceWithIdentifierAsync(context.Document, identifierNode, cancellationToken, functionName), nameof(DispatchEntityNameCodeFixProvider)),
                    diagnostic);
            }
        }
Exemplo n.º 7
0
        public void FindActivities(SyntaxNodeAnalysisContext context)
        {
            var attributeExpression = context.Node as AttributeSyntax;

            if (attributeExpression != null && attributeExpression.ChildNodes().First().ToString() == "ActivityTrigger")
            {
                if (SyntaxNodeUtils.TryGetFunctionAttribute(attributeExpression, out SyntaxNode functionAttribute))
                {
                    if (SyntaxNodeUtils.TryGetFunctionName(functionAttribute, out SyntaxNode attributeArgument))
                    {
                        var functionName = attributeArgument.ToString().Trim('"');
                        if (SyntaxNodeUtils.TryGetParameterNodeNextToAttribute(attributeExpression, context, out SyntaxNode inputTypeNode))
                        {
                            ITypeSymbol inputType = context.SemanticModel.GetTypeInfo(inputTypeNode).Type;
                            if (inputType.ToString().Equals("Microsoft.Azure.WebJobs.IDurableActivityContext") || inputType.ToString().Equals("Microsoft.Azure.WebJobs.DurableActivityContext"))
                            {
                                if (!TryGetInputTypeFromDurableContextCall(out inputType, context, attributeExpression))
                                {
                                    return;
                                }
                            }

                            if (SyntaxNodeUtils.TryGetReturnType(attributeExpression, context, out ITypeSymbol returnType))
                            {
                                availableFunctions.Add(new ActivityFunctionDefinition
                                {
                                    FunctionName = functionName,
                                    InputType    = GetQualifiedTypeName(inputType),
                                    ReturnType   = GetQualifiedTypeName(returnType)
                                });
                            }
                        }
                    }
                }
            }
        }