Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
        /// <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);
        }