Exemplo n.º 1
0
        public static CodegenExpression CodegenTypeableSingle(
            ExprNewStructNodeForge forge,
            CodegenMethodScope codegenMethodScope,
            ExprForgeCodegenSymbol exprSymbol,
            CodegenClassScope codegenClassScope)
        {
            var methodNode = codegenMethodScope.MakeChild(
                typeof(object[]),
                typeof(ExprNewStructNodeForgeEval),
                codegenClassScope);

            var block = methodNode.Block
                .DeclareVar<object[]>(
                    "rows",
                    NewArrayByLength(typeof(object), Constant(forge.ForgeRenderable.ColumnNames.Length)));
            for (var i = 0; i < forge.ForgeRenderable.ColumnNames.Length; i++) {
                block.AssignArrayElement(
                    "rows",
                    Constant(i),
                    forge.ForgeRenderable.ChildNodes[i]
                        .Forge.EvaluateCodegen(
                            typeof(object),
                            methodNode,
                            exprSymbol,
                            codegenClassScope));
            }

            block.MethodReturn(Ref("rows"));
            return LocalMethod(methodNode);
        }
Exemplo n.º 2
0
 public ExprNewStructNodeForgeEval(
     ExprNewStructNodeForge forge,
     ExprEvaluator[] evaluators)
 {
     this.forge = forge;
     this.evaluators = evaluators;
 }
Exemplo n.º 3
0
        public static CodegenExpression Codegen(
            ExprNewStructNodeForge forge,
            CodegenMethodScope codegenMethodScope,
            ExprForgeCodegenSymbol exprSymbol,
            CodegenClassScope codegenClassScope)
        {
            var methodNode = codegenMethodScope.MakeChild(
                typeof(IDictionary<string, object>),
                typeof(ExprNewStructNodeForgeEval),
                codegenClassScope);

            var block = methodNode.Block
                .DeclareVar<IDictionary<string, object>>(
                    "props",
                    NewInstance(typeof(HashMap<string, object>)));
            var nodes = forge.ForgeRenderable.ChildNodes;
            var columnNames = forge.ForgeRenderable.ColumnNames;
            for (var i = 0; i < nodes.Length; i++) {
                var child = nodes[i].Forge;
                block.ExprDotMethod(
                    Ref("props"),
                    "Put",
                    Constant(columnNames[i]),
                    child.EvaluateCodegen(typeof(object), methodNode, exprSymbol, codegenClassScope));
            }

            block.MethodReturn(Ref("props"));
            return LocalMethod(methodNode);
        }
Exemplo n.º 4
0
        public override ExprNode Validate(ExprValidationContext validationContext)
        {
            var eventType = new LinkedHashMap<string, object>();

            var isAllConstants = false;
            for (var i = 0; i < ColumnNames.Length; i++) {
                isAllConstants = isAllConstants && ChildNodes[i].Forge.ForgeConstantType.IsCompileTimeConstant;
                if (eventType.ContainsKey(ColumnNames[i])) {
                    throw new ExprValidationException(
                        "Failed to validate new-keyword property names, property '" +
                        ColumnNames[i] +
                        "' has already been declared");
                }

                IDictionary<string, object> eventTypeResult = null;
                if (ChildNodes[i].Forge is ExprTypableReturnForge) {
                    eventTypeResult = ((ExprTypableReturnForge) ChildNodes[i].Forge).RowProperties;
                }

                if (eventTypeResult != null) {
                    eventType.Put(ColumnNames[i], eventTypeResult);
                }
                else {
                    var classResult = ChildNodes[i].Forge.EvaluationType.GetBoxedType();
                    eventType.Put(ColumnNames[i], classResult);
                }
            }

            _forge = new ExprNewStructNodeForge(this, isAllConstants, eventType);
            return null;
        }