public static ITranslation For(BinaryExpression binary, ITranslationContext context)
        {
            switch (binary.NodeType)
            {
            case Add:
                if (binary.Type != typeof(string))
                {
                    break;
                }

                var operands = new[] { binary.Left, binary.Right };
                return(new StringConcatenationTranslation(Add, operands, context));

            case Equal:
            case NotEqual:
                if (StandaloneEqualityComparisonTranslation.TryGetTranslation(binary, context, out var translation))
                {
                    return(translation);
                }

                break;
            }

            return(new BinaryTranslation(binary, context));
        }
            public static bool TryGetTranslation(BinaryExpression comparison, ITranslationContext context, out ITranslation translation)
            {
                if (IsBooleanConstant(comparison.Right))
                {
                    translation = new StandaloneEqualityComparisonTranslation(
                        comparison.NodeType,
                        comparison.Left,
                        comparison.NodeType,
                        comparison.Right,
                        context);

                    return(true);
                }

                if (IsBooleanConstant(comparison.Left))
                {
                    translation = new StandaloneEqualityComparisonTranslation(
                        comparison.NodeType,
                        comparison.Right,
                        comparison.NodeType,
                        comparison.Left,
                        context);

                    return(true);
                }

                translation = null;
                return(false);
            }