public static CodegenExpression Codegen( EnumTakeLastForge forge, EnumForgeCodegenParams args, CodegenMethodScope codegenMethodScope, CodegenClassScope codegenClassScope) { var sizeType = forge.sizeEval.EvaluationType; var returnType = args.EnumcollType ?? typeof(FlexCollection); var paramArgs = EnumForgeCodegenNames.PARAMS; var scope = new ExprForgeCodegenSymbol(false, null); var methodNode = codegenMethodScope.MakeChildWithScope( returnType, typeof(EnumTakeLastForgeEval), scope, codegenClassScope) .AddParam(paramArgs); var block = methodNode.Block.DeclareVar( sizeType, "size", forge.sizeEval.EvaluateCodegen(sizeType, methodNode, scope, codegenClassScope)); if (sizeType.CanBeNull()) { block.IfRefNullReturnNull("size"); } block.MethodReturn( StaticMethod( typeof(EnumTakeLastForgeEval), "EvaluateEnumMethodTakeLast", EnumForgeCodegenNames.REF_ENUMCOLL, SimpleNumberCoercerFactory.CoercerInt.CodegenInt(Ref("size"), sizeType))); return LocalMethod(methodNode, args.Eps, args.Enumcoll, args.IsNewData, args.ExprCtx); }
public EnumForgeDesc MakeEnumForgeDesc( IList<ExprDotEvalParam> bodiesAndParameters, int streamCountIncoming, StatementCompileTimeServices services) { ExprForge sizeEval = bodiesAndParameters[0].BodyForge; EnumForge forge; if (_enumMethod == EnumMethodEnum.TAKE) { forge = new EnumTakeForge(sizeEval, streamCountIncoming, _isScalar); } else { forge = new EnumTakeLastForge(sizeEval, streamCountIncoming, _isScalar); } return new EnumForgeDesc(_type, forge); }