public static procedure_definition ConvertLambdaNodeToProcDefNode(function_lambda_definition functionLambdaDef) { procedure_definition procDef = null; if (functionLambdaDef.return_type == null) { procDef = SyntaxTreeNodesConstructor.CreateProcedureDefinitionNode(new method_name(null, null, new ident(functionLambdaDef.lambda_name, functionLambdaDef.source_context), null), functionLambdaDef.formal_parameters, false, false, functionLambdaDef.proc_body, functionLambdaDef.source_context); } else { procDef = SyntaxTreeNodesConstructor.CreateFunctionDefinitionNode(new method_name(null, null, new ident(functionLambdaDef.lambda_name), null), functionLambdaDef.formal_parameters, false, false, functionLambdaDef.proc_body, functionLambdaDef.return_type, functionLambdaDef.source_context); } procDef.proc_header.name.meth_name.source_context = procDef.proc_header.source_context; functionLambdaDef.proc_definition = procDef; return(procDef); }
/// <summary> /// Фиктивный блок, представляющий лямбда-выражение. Используется для обхода с целью получения списка захватываемых переменных /// </summary> /// <param name="lambdaDef"></param> /// <returns></returns> public static block CreateFictiveBlockForLambda(function_lambda_definition lambdaDef) { statement_list stmtList = new statement_list(); if (lambdaDef.formal_parameters != null) { for (int i = 0; i < lambdaDef.formal_parameters.params_list.Count; i++) { stmtList.subnodes.Add(SyntaxTreeNodesConstructor.CreateVarStatementNode(lambdaDef.formal_parameters.params_list[i].idents, lambdaDef.formal_parameters.params_list[i].vars_type, null)); } } if (lambdaDef.return_type != null) { stmtList.subnodes.Add(SyntaxTreeNodesConstructor.CreateVarStatementNode("result", lambdaDef.return_type, null)); // переделать, не сработает, если тип возвращаемого значения не указан } stmtList.subnodes.AddRange((lambdaDef.proc_body as statement_list).subnodes); block resBlock = new block(); resBlock.program_code = stmtList; return(resBlock); }