private static bool IsFixable( ExpressionSyntax left, BinaryExpressionSyntax right, SemanticModel semanticModel, CancellationToken cancellationToken = default) { NullCheckExpressionInfo nullCheck = SyntaxInfo.NullCheckExpressionInfo(left); if (!nullCheck.Success) { return(false); } ExpressionSyntax expression = nullCheck.Expression; if (CSharpFactory.AreEquivalent(expression, right.Left)) { return(right.IsKind(SyntaxKind.EqualsExpression, SyntaxKind.NotEqualsExpression) && SymbolEquals(expression, right.Left, semanticModel, cancellationToken) && CSharpUtility.IsEmptyStringExpression(right.Right, semanticModel, cancellationToken)); } if (right.Left.IsKind(SyntaxKind.SimpleMemberAccessExpression)) { var memberAccess = (MemberAccessExpressionSyntax)right.Left; return(string.Equals(memberAccess.Name.Identifier.ValueText, "Length", StringComparison.Ordinal) && right.Right.IsNumericLiteralExpression("0") && semanticModel.GetSymbol(memberAccess, cancellationToken) is IPropertySymbol propertySymbol && !propertySymbol.IsIndexer && SymbolUtility.IsPublicInstance(propertySymbol, "Length") && propertySymbol.Type.SpecialType == SpecialType.System_Int32 && propertySymbol.ContainingType?.SpecialType == SpecialType.System_String && CSharpFactory.AreEquivalent(expression, memberAccess.Expression) && SymbolEquals(expression, memberAccess.Expression, semanticModel, cancellationToken)); } return(false); }