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); }
public ExprNewStructNodeForgeEval( ExprNewStructNodeForge forge, ExprEvaluator[] evaluators) { this.forge = forge; this.evaluators = evaluators; }
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); }
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; }