public EnumTakeWhileLastIndexScalarForgeEval( EnumTakeWhileLastIndexScalarForge forge, ExprEvaluator innerExpression) { _forge = forge; _innerExpression = innerExpression; }
public static CodegenExpression Codegen( EnumTakeWhileLastIndexScalarForge forge, EnumForgeCodegenParams args, CodegenMethodScope codegenMethodScope, CodegenClassScope codegenClassScope) { var evalTypeMember = codegenClassScope.AddDefaultFieldUnshared( true, typeof(ObjectArrayEventType), Cast( typeof(ObjectArrayEventType), EventTypeUtility.ResolveTypeCodegen(forge.evalEventType, EPStatementInitServicesConstants.REF))); var indexTypeMember = codegenClassScope.AddDefaultFieldUnshared( true, typeof(ObjectArrayEventType), Cast( typeof(ObjectArrayEventType), EventTypeUtility.ResolveTypeCodegen(forge.indexEventType, EPStatementInitServicesConstants.REF))); var scope = new ExprForgeCodegenSymbol(false, null); var methodNode = codegenMethodScope.MakeChildWithScope( typeof(ICollection<object>), typeof(EnumTakeWhileLastIndexScalarForgeEval), 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); block.DeclareVar<ObjectArrayEventBean>( "evalEvent", NewInstance<ObjectArrayEventBean>( NewArrayByLength(typeof(object), Constant(1)), evalTypeMember)) .AssignArrayElement(EnumForgeCodegenNames.REF_EPS, Constant(forge.streamNumLambda), Ref("evalEvent")) .DeclareVar<object[]>("evalProps", ExprDotName(Ref("evalEvent"), "Properties")) .DeclareVar<ObjectArrayEventBean>( "indexEvent", NewInstance<ObjectArrayEventBean>( NewArrayByLength(typeof(object), Constant(1)), indexTypeMember)) .AssignArrayElement( EnumForgeCodegenNames.REF_EPS, Constant(forge.streamNumLambda + 1), Ref("indexEvent")) .DeclareVar<object[]>("indexProps", ExprDotName(Ref("indexEvent"), "Properties")); var blockSingle = block.IfCondition( EqualsIdentity(ExprDotName(EnumForgeCodegenNames.REF_ENUMCOLL, "Count"), Constant(1))) .DeclareVar<object>( "item", ExprDotMethodChain(EnumForgeCodegenNames.REF_ENUMCOLL).Add("First")) .AssignArrayElement("evalProps", Constant(0), Ref("item")) .AssignArrayElement("indexProps", Constant(0), Constant(0)); CodegenLegoBooleanExpression.CodegenReturnValueIfNotNullAndNotPass( blockSingle, forge.innerExpression.EvaluationType, innerValue, FlexEmpty()); blockSingle.BlockReturn(FlexValue(Ref("item"))); block .DeclareVar<ArrayDeque<object>>("result", NewInstance(typeof(ArrayDeque<object>))) .DeclareVar<object[]>( "all", StaticMethod( typeof(EnumTakeWhileLastIndexScalarForgeEval), METHOD_TAKEWHILELASTSCALARTOARRAY, EnumForgeCodegenNames.REF_ENUMCOLL)) .DeclareVar<int>("index", Constant(0)); var forEach = block.ForLoop( typeof(int), "i", Op(ArrayLength(Ref("all")), "-", Constant(1)), Relational(Ref("i"), GE, Constant(0)), Decrement("i")) .AssignArrayElement("evalProps", Constant(0), ArrayAtIndex(Ref("all"), Ref("i"))) .AssignArrayElement("indexProps", Constant(0), Increment("index")); 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); }