public static CodegenExpression Codegen(
     CodegenMethodScope codegenMethodScope,
     ExprForgeCodegenSymbol exprSymbol,
     CodegenClassScope codegenClassScope,
     ExprNode[] nodes,
     Type returnType)
 {
     return(MinMaxTypeCodegen
            .CodegenMinMax(true, codegenMethodScope, exprSymbol, codegenClassScope, nodes, returnType));
 }
            public static CodegenExpression Codegen(
                bool max,
                CodegenMethodScope codegenMethodScope,
                ExprForgeCodegenSymbol exprSymbol,
                CodegenClassScope codegenClassScope,
                ExprNode[] nodes,
                BigIntegerCoercer[] convertors)
            {
                var r0Type = nodes[0].Forge.EvaluationType.GetBoxedType();
                var r1Type = nodes[1].Forge.EvaluationType.GetBoxedType();

                if (r0Type == null || r1Type == null)
                {
                    return(CodegenExpressionBuilder.ConstantNull());
                }

                var methodNode = codegenMethodScope.MakeChild(
                    typeof(BigInteger?),
                    typeof(ComputerBigIntCoerce),
                    codegenClassScope);
                var block = methodNode.Block;

                block.DeclareVar(
                    r0Type,
                    "r0",
                    nodes[0].Forge.EvaluateCodegen(r0Type, methodNode, exprSymbol, codegenClassScope));
                if (r0Type.CanBeNull())
                {
                    block.IfRefNullReturnNull("r0");
                }

                block.DeclareVar(
                    r1Type,
                    "r1",
                    nodes[1].Forge.EvaluateCodegen(r1Type, methodNode, exprSymbol, codegenClassScope));
                if (r1Type.CanBeNull())
                {
                    block.IfRefNullReturnNull("r1");
                }

                block.DeclareVar <BigInteger?>(
                    "bi0",
                    convertors[0].CoerceBoxedBigIntCodegen(CodegenExpressionBuilder.Ref("r0"), r0Type));
                block.DeclareVar <BigInteger?>(
                    "bi1",
                    convertors[1].CoerceBoxedBigIntCodegen(CodegenExpressionBuilder.Ref("r1"), r1Type));

                block.DeclareVarNoInit(typeof(BigInteger?), "result");
                block.IfCondition(
                    MinMaxTypeCodegen.CodegenCompareCompareTo(
                        CodegenExpressionBuilder.Unbox(CodegenExpressionBuilder.Ref("bi0")),
                        CodegenExpressionBuilder.Unbox(CodegenExpressionBuilder.Ref("bi1")),
                        max))
                .AssignRef("result", CodegenExpressionBuilder.Ref("bi0"))
                .IfElse()
                .AssignRef("result", CodegenExpressionBuilder.Ref("bi1"))
                .BlockEnd();

                for (var i = 2; i < nodes.Length; i++)
                {
                    var nodeType      = nodes[i].Forge.EvaluationType;
                    var refnameNumber = "r" + i;
                    block.DeclareVar(
                        nodeType,
                        refnameNumber,
                        nodes[i].Forge.EvaluateCodegen(nodeType, methodNode, exprSymbol, codegenClassScope));
                    if (nodeType.CanBeNull())
                    {
                        block.IfRefNullReturnNull(refnameNumber);
                    }

                    var refnameBigint = "bi" + i;
                    block.DeclareVar <BigInteger>(
                        refnameBigint,
                        convertors[i].CoerceBoxedBigIntCodegen(CodegenExpressionBuilder.Ref(refnameNumber), nodeType));
                    block.IfCondition(
                        CodegenExpressionBuilder.Not(
                            MinMaxTypeCodegen.CodegenCompareCompareTo(
                                CodegenExpressionBuilder.Ref("result"),
                                CodegenExpressionBuilder.Ref(refnameBigint),
                                max)))
                    .AssignRef("result", CodegenExpressionBuilder.Ref(refnameBigint))
                    .BlockEnd();
                }

                block.MethodReturn(CodegenExpressionBuilder.Ref("result"));
                return(CodegenExpressionBuilder.LocalMethod(methodNode));
            }