private static bool TryAnalyzeInvocationCondition( SyntaxNodeAnalysisContext context, ISyntaxFacts syntaxFacts, IMethodSymbol?referenceEqualsMethodOpt, TInvocationExpression invocation, [NotNullWhen(true)] out SyntaxNode?conditionPartToCheck, out bool isEquals) { conditionPartToCheck = null; isEquals = true; var expression = syntaxFacts.GetExpressionOfInvocationExpression(invocation); var nameNode = syntaxFacts.IsIdentifierName(expression) ? expression : syntaxFacts.IsSimpleMemberAccessExpression(expression) ? syntaxFacts.GetNameOfMemberAccessExpression(expression) : null; if (!syntaxFacts.IsIdentifierName(nameNode)) { return(false); } syntaxFacts.GetNameAndArityOfSimpleName(nameNode, out var name, out _); if (!syntaxFacts.StringComparer.Equals(name, nameof(ReferenceEquals))) { return(false); } var arguments = syntaxFacts.GetArgumentsOfInvocationExpression(invocation); if (arguments.Count != 2) { return(false); } var conditionLeft = syntaxFacts.GetExpressionOfArgument(arguments[0]); var conditionRight = syntaxFacts.GetExpressionOfArgument(arguments[1]); if (conditionLeft == null || conditionRight == null) { return(false); } conditionPartToCheck = GetConditionPartToCheck(syntaxFacts, conditionLeft, conditionRight); if (conditionPartToCheck == null) { return(false); } var semanticModel = context.SemanticModel; var cancellationToken = context.CancellationToken; var symbol = semanticModel.GetSymbolInfo(invocation, cancellationToken).Symbol; return(referenceEqualsMethodOpt != null && referenceEqualsMethodOpt.Equals(symbol)); }
private static string?GetNameOfInvokedExpression(ISyntaxFacts syntaxFacts, SyntaxNode invokedExpression) { if (syntaxFacts.IsSimpleMemberAccessExpression(invokedExpression)) { return(syntaxFacts.GetIdentifierOfSimpleName(syntaxFacts.GetNameOfMemberAccessExpression(invokedExpression)).ValueText); } if (syntaxFacts.IsIdentifierName(invokedExpression)) { return(syntaxFacts.GetIdentifierOfSimpleName(invokedExpression).ValueText); } return(null); }
private static bool IsValidFormatMethod(ISyntaxFacts syntaxFacts, SyntaxNode expression) { // When calling string.Format(...), the expression will be MemberAccessExpressionSyntax if (syntaxFacts.IsSimpleMemberAccessExpression(expression)) { var nameOfMemberAccessExpression = syntaxFacts.GetNameOfMemberAccessExpression(expression); return(!syntaxFacts.IsGenericName(nameOfMemberAccessExpression) && syntaxFacts.GetIdentifierOfSimpleName(nameOfMemberAccessExpression).ValueText == (nameof(string.Format))); } // When using static System.String and calling Format(...), the expression will be // IdentifierNameSyntax if (syntaxFacts.IsIdentifierName(expression)) { return(syntaxFacts.GetIdentifierOfSimpleName(expression).ValueText == (nameof(string.Format))); } return(false); }