public procedure_definition lambda(function_lambda_definition _function_lambda_definition) { SyntaxTree.procedure_definition _func_def = new PascalABCCompiler.SyntaxTree.procedure_definition(); SyntaxTree.method_name _method_name1 = new SyntaxTree.method_name(null, new SyntaxTree.ident(_function_lambda_definition.lambda_name), null); SyntaxTree.function_header _function_header1 = new SyntaxTree.function_header(); object rt1 = new object(); _function_header1.name = _method_name1; SyntaxTree.formal_parametres fps = new PascalABCCompiler.SyntaxTree.formal_parametres(); _function_header1.parametres = _function_lambda_definition.formal_parametres;//fps; SyntaxTree.named_type_reference _named_type_reference = new SyntaxTree.named_type_reference(); SyntaxTree.ident idtype = new SyntaxTree.ident("datatype"); _named_type_reference.source_context = idtype.source_context; _named_type_reference.names.Add(idtype); rt1 = _named_type_reference; _function_header1.return_type = (SyntaxTree.type_definition)_named_type_reference; _function_header1.of_object = false; _function_header1.class_keyword = false; SyntaxTree.block _block1 = new SyntaxTree.block(null, null); SyntaxTree.statement_list sl1 = new SyntaxTree.statement_list(); sl1.subnodes.Add(_function_lambda_definition.proc_body); _block1.program_code = sl1; _func_def.proc_header = _function_header1; _func_def.proc_body = (SyntaxTree.proc_block)_block1; _function_lambda_definition.proc_definition = _func_def; return _func_def; }
//\ssyy //(ssyy) возвращаемое значение заменено на definition_node из-за шаблонов public definition_node enter_in_type_method(SyntaxTree.method_name meth_name, string type_name, location loc, int num_template_args) { // num_template_args - это количество обобщенных аргументов в классе (не в методе!) SymbolInfo si = null; if (meth_name.ln!=null && meth_name.ln.Count > 1) { // обработать эту ситуацию особо тщательно: в ln - список возможных пространств имен с классом (возможно, обобщенным) на конце // если в ln какое-то имя кроме последнего, содержит обобщенные параметры - это ошибка for (var i = 0; i < meth_name.ln.Count - 1; i++) if (meth_name.ln[i] is SyntaxTree.template_type_name) AddError(new NameCannotHaveGenericParameters(meth_name.ln[i].name, syntax_tree_visitor.get_location(meth_name.ln[i]))); var ntr = new SyntaxTree.named_type_reference(); for (var i = 0; i < meth_name.ln.Count; i++) ntr.Add(meth_name.ln[i]); if (num_template_args>0 && ! ntr.names[meth_name.ln.Count-1].name.Contains(compiler_string_consts.generic_params_infix)) { ntr.names[meth_name.ln.Count-1].name += compiler_string_consts.generic_params_infix + num_template_args; } si = find_definition_node(ntr, loc); // если не нашли, то ошибка будет неправильной с неправильным именем - надо исправить } else { if (num_template_args != 0) { string template_type_name = type_name + compiler_string_consts.generic_params_infix + num_template_args.ToString(); si = find(template_type_name); /*if (si == null || si.sym_info.general_node_type != general_node_type.template_type) { type_name = type_name + compiler_string_consts.generic_params_infix + num_template_args.ToString(); si = null; }*/ } if (si == null) { si = find(type_name); } } if (si == null) { AddError(new UndefinedNameReference(type_name, loc)); } definition_node dn = si.sym_info; if (dn.general_node_type == general_node_type.template_type) { _ctt = dn as template_class; if (_cmn != _ctt.cnn && _ctt.using_list2 == null) { //Заполняем список using для внешних методов _ctt.using_list2 = new using_namespace_list(); foreach(using_namespace un in syntax_tree_visitor.using_list) { _ctt.using_list2.AddElement(un); } } return dn; } if (dn.general_node_type == general_node_type.generic_indicator) { dn = (dn as generic_indicator).generic; } if (dn is compiled_type_node) { _compiled_tn = dn as compiled_type_node; return dn; } if (dn.general_node_type != general_node_type.type_node) { AddError(loc, "TYPE_NAME_EXPECTED"); } #if DEBUG if (si.Next != null) { throw new CompilerInternalError("Must find only type, found some other."); } #endif if (dn.semantic_node_type != semantic_node_type.common_type_node) { AddError(loc, "ONLY_COMMON_TYPE_METHOD_DEFINITION_ALLOWED"); } //TODO: В случае создания вложенных классов этот код надо поправить. common_type_node ctn = dn as common_type_node; _ctn = ctn; return ctn; }