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