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); }
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); }
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); } } } }
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); }
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); }