private static bool AnalyzeIdentifierThread(SyntaxNode method, CompilationAnalysisContext context, SemanticModel semanticModel)
        {
            var diagnosedIssue = false;

            foreach (SyntaxNode descendant in method.DescendantNodes())
            {
                if (descendant is IdentifierNameSyntax identifierName)
                {
                    var identifierText = identifierName.Identifier.ValueText;
                    if (identifierText == "Start")
                    {
                        var memberAccessExpression = identifierName.Parent;
                        if (SyntaxNodeUtils.TryGetISymbol(semanticModel, memberAccessExpression, out ISymbol memberSymbol))
                        {
                            if (memberSymbol != null && memberSymbol.ToString().StartsWith("System.Threading.Thread"))
                            {
                                var diagnostic = Diagnostic.Create(Rule, memberAccessExpression.GetLocation(), memberAccessExpression);

                                context.ReportDiagnostic(diagnostic);

                                diagnosedIssue = true;
                            }
                        }
                    }
                }
            }

            return(diagnosedIssue);
        }
        public static bool RegisterDiagnostic(CompilationAnalysisContext context, SemanticModel semanticModel, SyntaxNode method)
        {
            var diagnosedIssue = false;

            foreach (SyntaxNode descendant in method.DescendantNodes())
            {
                if (descendant is IdentifierNameSyntax identifierName)
                {
                    var identifierText = identifierName.Identifier.ValueText;
                    if (identifierText == "Now" || identifierText == "UtcNow" || identifierText == "Today")
                    {
                        var memberAccessExpression = identifierName.Parent;
                        if (SyntaxNodeUtils.TryGetISymbol(semanticModel, memberAccessExpression, out ISymbol memberSymbol))
                        {
                            //Covers both DateTime and DateTimeOffset
                            if (memberSymbol.ToString().StartsWith("System.DateTime"))
                            {
                                var diagnostic = Diagnostic.Create(Rule, memberAccessExpression.GetLocation(), memberAccessExpression);

                                context.ReportDiagnostic(diagnostic);

                                diagnosedIssue = true;
                            }
                        }
                    }
                }
            }

            return(diagnosedIssue);
        }
Exemplo n.º 3
0
        internal static bool RegisterDiagnostic(SyntaxNode method, CompilationAnalysisContext context, SemanticModel semanticModel)
        {
            var diagnosedIssue = false;

            foreach (SyntaxNode descendant in method.DescendantNodes())
            {
                if (descendant is IdentifierNameSyntax identifierName)
                {
                    var identifierText = identifierName.Identifier.ValueText;
                    if (identifierText == "GetEnvironmentVariable" || identifierText == "GetEnvironmentVariables" || identifierText == "ExpandEnvironmentVariables")
                    {
                        var memberAccessExpression = identifierName.Parent;
                        var invocationExpression   = memberAccessExpression.Parent;
                        if (SyntaxNodeUtils.TryGetISymbol(semanticModel, memberAccessExpression, out ISymbol memberSymbol))
                        {
                            if (memberSymbol.ToString().StartsWith("System.Environment"))
                            {
                                var diagnostic = Diagnostic.Create(Rule, invocationExpression.GetLocation(), memberAccessExpression);

                                context.ReportDiagnostic(diagnostic);

                                diagnosedIssue = true;
                            }
                        }
                    }
                }
            }

            return(diagnosedIssue);
        }
Exemplo n.º 4
0
        private static List <MethodInformation> AnalyzeMethod(SyntaxNode methodDeclaration, CompilationAnalysisContext context, SemanticModel semanticModel)
        {
            var methodInformationList = new List <MethodInformation>();

            foreach (SyntaxNode descendant in methodDeclaration.DescendantNodes())
            {
                if (descendant is InvocationExpressionSyntax invocation)
                {
                    if (SyntaxNodeUtils.TryGetISymbol(semanticModel, invocation, out ISymbol symbol) && symbol is IMethodSymbol methodSymbol)
                    {
                        var syntaxReference = methodSymbol.DeclaringSyntaxReferences.FirstOrDefault();
                        if (syntaxReference != null)
                        {
                            var declaration = syntaxReference.GetSyntax(context.CancellationToken);
                            if (declaration != null && !methodDeclaration.Equals(declaration))
                            {
                                methodInformationList.Add(new MethodInformation(declaration, invocation));
                            }
                        }
                    }
                }
            }

            return(methodInformationList);
        }
        private void FindInvokedMethods(SemanticModel semanticModel, MethodInformation parentMethodInformation)
        {
            var parentDeclaration     = parentMethodInformation.Declaration;
            var invocationExpressions = parentDeclaration.DescendantNodes().OfType <InvocationExpressionSyntax>();

            foreach (var invocation in invocationExpressions)
            {
                if (SyntaxNodeUtils.TryGetDeclaredSyntaxNode(semanticModel, invocation, out SyntaxNode invokedMethodDeclaration) &&
                    invokedMethodDeclaration is MethodDeclarationSyntax &&
                    SyntaxNodeUtils.TryGetISymbol(semanticModel, invocation, out ISymbol invokedSymbol))
                {
                    if (this.orchestratorMethodDeclarations.TryGetValue(invokedSymbol, out MethodInformation existingMethodInformation))
                    {
                        existingMethodInformation.Invocations.Add(invocation);
                        if (!existingMethodInformation.Equals(parentMethodInformation))
                        {
                            existingMethodInformation.Parents.Add(parentMethodInformation);
                        }
                    }
                    else
                    {
                        var invokedMethodInformation = new MethodInformation()
                        {
                            SemanticModel     = semanticModel,
                            Declaration       = invokedMethodDeclaration,
                            DeclarationSymbol = invokedSymbol,
                            Invocations       = new List <InvocationExpressionSyntax>()
                            {
                                invocation
                            },
                            Parents = new HashSet <MethodInformation>(new List <MethodInformation>()
                            {
                                parentMethodInformation
                            }),
                        };

                        this.orchestratorMethodDeclarations.Add(invokedSymbol, invokedMethodInformation);

                        FindInvokedMethods(semanticModel, invokedMethodInformation);
                    }
                }
            }
        }
Exemplo n.º 6
0
        private bool TryFindEntityInterface(SyntaxNodeAnalysisContext context, SyntaxNode identifierName, out EntityInterface entityInterface)
        {
            if (SyntaxNodeUtils.TryGetISymbol(context.SemanticModel, identifierName, out ISymbol interfaceSymbol))
            {
                var syntaxReference = interfaceSymbol.DeclaringSyntaxReferences.FirstOrDefault();
                if (syntaxReference != null)
                {
                    var declaration = syntaxReference.GetSyntax(context.CancellationToken);
                    if (declaration != null)
                    {
                        if (IsInterface(declaration))
                        {
                            entityInterface = new EntityInterface {
                                Name = identifierName.ToString(), InterfaceDeclaration = declaration
                            };
                            return(true);
                        }
                    }
                }
            }

            entityInterface = null;
            return(false);
        }
Exemplo n.º 7
0
        private static bool AnalyzeIdentifierTask(SyntaxNode method, CompilationAnalysisContext context, SemanticModel semanticModel)
        {
            var diagnosedIssue = false;

            foreach (SyntaxNode descendant in method.DescendantNodes())
            {
                if (descendant is IdentifierNameSyntax identifierName)
                {
                    version = SyntaxNodeUtils.GetDurableVersion(semanticModel);

                    var identifierText = identifierName.Identifier.ValueText;
                    if (identifierText == "Delay")
                    {
                        var memberAccessExpression = identifierName.Parent;
                        if (SyntaxNodeUtils.TryGetISymbol(semanticModel, memberAccessExpression, out ISymbol memberSymbol))
                        {
                            if (memberSymbol != null && memberSymbol.ToString().StartsWith("System.Threading.Tasks.Task"))
                            {
                                if (TryGetRuleFromVersion(out DiagnosticDescriptor rule))
                                {
                                    var expression = GetAwaitOrInvocationExpression(memberAccessExpression);

                                    var diagnostic = Diagnostic.Create(rule, expression.GetLocation(), expression);

                                    context.ReportDiagnostic(diagnostic);

                                    diagnosedIssue = true;
                                }
                            }
                        }
                    }
                }
            }

            return(diagnosedIssue);
        }