public static CodegenExpression EvaluateCodegen(
            Type requiredType,
            ExprNewInstanceNodeArrayForge forge,
            CodegenMethodScope parent,
            ExprForgeCodegenSymbol symbols,
            CodegenClassScope classScope)
        {
            if (forge.Parent.IsArrayInitializedByExpr) {
                return forge.Parent.ChildNodes[0].Forge.EvaluateCodegen(requiredType, parent, symbols, classScope);
            }

            var method = parent.MakeChild(requiredType, typeof(ExprNewInstanceNodeArrayForgeEval), classScope);
            var dimensions = forge.Parent.ChildNodes;

            var dimValue = new CodegenExpression[dimensions.Length];
            for (var i = 0; i < dimensions.Length; i++) {
                var dimForge = forge.Parent.ChildNodes[i].Forge;
                var dimForgeType = dimForge.EvaluationType;
                var dimExpr = dimForge.EvaluateCodegen(typeof(int?), method, symbols, classScope);
                if (dimForge.ForgeConstantType == ExprForgeConstantType.COMPILETIMECONST) {
                    dimValue[i] = Unbox(dimExpr, dimForgeType);
                }
                else {
                    var name = "dim" + i;
                    method.Block
                        .DeclareVar(typeof(int?), name, dimExpr)
                        .IfRefNull(name)
                        .BlockThrow(NewInstance(typeof(EPException), Constant(NULL_MSG)));
                    dimValue[i] = Unbox(Ref(name));
                }
            }

            CodegenExpression make;
            if (dimValue.Length == 1) {
                make = NewArrayByLength(forge.TargetClass, dimValue[0]);
            }
            else {
                var @params = new CodegenExpression[dimValue.Length + 1];
                @params[0] = Clazz(forge.TargetClass);
                Array.Copy(dimValue, 0, @params, 1, dimValue.Length);
                make = StaticMethod(typeof(Arrays), "CreateJagged", @params);
            }
            
            method.Block.MethodReturn(CodegenLegoCast.CastSafeFromObjectType(requiredType, make));
            return LocalMethod(method);
        }
 public ExprNewInstanceNodeArrayForgeEval(ExprNewInstanceNodeArrayForge forge)
 {
     _forge = forge;
 }