public EnumTakeWhileLastEventsForgeEval( EnumTakeWhileLastEventsForge forge, ExprEvaluator innerExpression) { _forge = forge; _innerExpression = innerExpression; }
public static CodegenExpression Codegen( EnumTakeWhileLastEventsForge forge, EnumForgeCodegenParams args, CodegenMethodScope codegenMethodScope, CodegenClassScope codegenClassScope) { var scope = new ExprForgeCodegenSymbol(false, null); var methodNode = codegenMethodScope .MakeChildWithScope( typeof(FlexCollection), typeof(EnumTakeWhileLastEventsForgeEval), scope, codegenClassScope) .AddParam(EnumForgeCodegenNames.PARAMS); var innerValue = forge.InnerExpression.EvaluateCodegen( typeof(bool?), methodNode, scope, codegenClassScope); var block = methodNode.Block .IfCondition(ExprDotMethod(EnumForgeCodegenNames.REF_ENUMCOLL, "IsEmpty")) .BlockReturn(EnumForgeCodegenNames.REF_ENUMCOLL); var blockSingle = block .IfCondition(EqualsIdentity(ExprDotName(EnumForgeCodegenNames.REF_ENUMCOLL, "Count"), Constant(1))) .DeclareVar<EventBean>( "item", Cast( typeof(EventBean), ExprDotMethodChain(EnumForgeCodegenNames.REF_ENUMCOLL).Add("First"))) .AssignArrayElement(EnumForgeCodegenNames.REF_EPS, Constant(forge.StreamNumLambda), Ref("item")); CodegenLegoBooleanExpression.CodegenReturnValueIfNotNullAndNotPass( blockSingle, forge.InnerExpression.EvaluationType, innerValue, FlexEmpty()); blockSingle.BlockReturn(FlexEvent(Ref("item"))); block .DeclareVar<ArrayDeque<EventBean>>("result", NewInstance(typeof(ArrayDeque<EventBean>))) .DeclareVar<EventBean[]>( "all", StaticMethod( typeof(EnumTakeWhileLastEventsForgeEval), "TakeWhileLastEventBeanToArray", ExprDotName(EnumForgeCodegenNames.REF_ENUMCOLL, "EventBeanCollection"))); var forEach = block.ForLoop( typeof(int), "i", Op(ArrayLength(Ref("all")), "-", Constant(1)), Relational(Ref("i"), GE, Constant(0)), Decrement("i")) .AssignArrayElement( EnumForgeCodegenNames.REF_EPS, Constant(forge.StreamNumLambda), ArrayAtIndex(Ref("all"), Ref("i"))); CodegenLegoBooleanExpression.CodegenBreakIfNotNullAndNotPass( forEach, forge.InnerExpression.EvaluationType, innerValue); forEach.Expression(ExprDotMethod(Ref("result"), "AddFirst", ArrayAtIndex(Ref("all"), Ref("i")))); block.MethodReturn(FlexWrap(Ref("result"))); return LocalMethod(methodNode, args.Eps, args.Enumcoll, args.IsNewData, args.ExprCtx); }