/// <summary> /// Временный узел, который используется при выведении типов параметров /// </summary> /// <param name="def"></param> /// <param name="visitor"></param> /// <returns></returns> public static typed_expression GetTempFunctionNodeForTypeInference(SyntaxTree.function_lambda_definition def, syntax_tree_visitor visitor) { var res = new common_namespace_function_node(def.lambda_name, visitor.get_location(def), null, null); if (def.return_type != null) { res.return_value_type = visitor.convert_strong(def.return_type); } else { res.return_value_type = null; } res.parameters.clear(); if (def.formal_parameters != null && def.formal_parameters.params_list.Count != 0) { for (int i = 0; i < def.formal_parameters.params_list.Count; i++) { var tt = visitor.convert_strong(def.formal_parameters.params_list[i].vars_type); // SSM 29/12/18 for (int j = 0; j < def.formal_parameters.params_list[i].idents.idents.Count; j++) { var new_param = new common_parameter(null, SemanticTree.parameter_type.value, res, concrete_parameter_type.cpt_none, visitor.get_location(def.formal_parameters.params_list[i].idents.idents[0])); new_param.type = tt; res.parameters.AddElement(new_param); } } } var hhh = new delegated_methods(); hhh.proper_methods.AddElement(new common_namespace_function_call(res, visitor.get_location(def))); return(new typed_expression(hhh, visitor.get_location(def))); }
// !Patterns public override void visit(assign assignment) { var to = assignment.to as ident; var from = assignment.from; if (to != null && assignment.operator_type == Operators.Assignment && to.name.ToLower() == RESULT_KEY_WORD) { var converted = syntaxTreeVisitor.convert_strong(from); if (converted is typed_expression) { delegated_methods dm = converted.type as delegated_methods; if (dm.empty_param_method != null) { converted = syntaxTreeVisitor.convert_typed_expression_to_function_call(converted as typed_expression); } } resultExpressionsTypes.Add(new Tuple <type_node, expression, expression_node>(converted.type, from, converted)); var si_list = syntaxTreeVisitor.context.find(RESULT_KEY_WORD); if (si_list != null && si_list.Count > 0 && si_list[0].sym_info == null) { si_list[0].sym_info = new local_variable(RESULT_KEY_WORD, converted.type, syntaxTreeVisitor.context.top_function, null); } } }