private void VisitNestedFunction(common_in_function_function_node cnfn) { if (extended_mode) VisitVariables(cnfn.var_definition_nodes_list); foreach (var_definition_node vdn in cnfn.var_definition_nodes_list) helper.AddVariable(vdn); foreach (common_parameter prm in cnfn.parameters) helper.AddParameter(prm); foreach (common_in_function_function_node nested in cnfn.functions_nodes_list) VisitNestedFunction(nested); cur_func = cnfn; VisitStatement(cnfn.function_code); foreach (var_definition_node vdn2 in cnfn.var_definition_nodes_list) { if (vdn2 is local_variable) { local_variable vdn = vdn2 as local_variable; VarInfo vi = helper.GetVariable(vdn); if (vi.num_use == 0 && !vdn.is_special_name) warns.Add(new UnusedVariable(vdn.name, vdn.loc)); else if (vi.num_ass == 0 && vdn.is_ret_value && !cnfn.name.StartsWith("<>") && cnfn.return_value_type.type_special_kind != SemanticTree.type_special_kind.record && !cnfn.return_value_type.IsPointer && cnfn.return_value_type.type_special_kind != SemanticTree.type_special_kind.array_wrapper && !helper.IsExternal(cnfn)) warns.Add(new UndefinedReturnValue(cnfn.name, cnfn.function_code.location)); if (vi.num_ass > 0 && vi.act_num_use == 0 && !vdn.is_special_name) warns.Add(new AssignWithoutUsing(vdn.name, vi.last_ass_loc)); //if (vi.num_ass == 0 && vi.act_num_use > 0) helper.AddRealWarning(vdn, warns); } else if (vdn2 is local_block_variable) { local_block_variable vdn = vdn2 as local_block_variable; VarInfo vi = helper.GetVariable(vdn); if (vi.num_use == 0 && !vdn.is_special_name) warns.Add(new UnusedVariable(vdn.name, vdn.loc)); else if (vi.num_ass == 0 && vdn.is_ret_value && !cnfn.name.StartsWith("<>") && cnfn.return_value_type.type_special_kind != SemanticTree.type_special_kind.record && !cnfn.return_value_type.IsPointer && cnfn.return_value_type.type_special_kind != SemanticTree.type_special_kind.array_wrapper && !helper.IsExternal(cnfn)) warns.Add(new UndefinedReturnValue(cnfn.name, cnfn.function_code.location)); if (vi.num_ass > 0 && vi.act_num_use == 0 && !vdn.is_special_name) warns.Add(new AssignWithoutUsing(vdn.name, vi.last_ass_loc)); //if (vi.num_ass == 0 && vi.act_num_use > 0) helper.AddRealWarning(vdn, warns); } if (vdn2.inital_value != null) VisitExpression(vdn2.inital_value); } foreach (common_parameter prm in cnfn.parameters) { ParamInfo vi = helper.GetParameter(prm); if (prm.inital_value != null) VisitExpression(prm.inital_value); //if (vi.num_use == 0 && !prm.name.Contains("$")) warns.Add(new UnusedParameter(prm.name, prm.loc)); } foreach (var_definition_node vdn in cnfn.var_definition_nodes_list) { VarInfo vi = helper.GetVariable(vdn); if (vdn.inital_value != null) VisitExpression(vdn.inital_value); } }
private void VisitNestedFunctionImplementation(common_in_function_function_node func) { foreach (common_in_function_function_node nested in func.functions_nodes_list) VisitNestedFunctionImplementation(nested); //(ssyy) метки VisitLabelDeclarations(func.label_nodes_list); FixupCode(func); VisitStatement(func.function_code); }
//сохранение вложенной функций private void VisitNestedFunctionDefinition(common_in_function_function_node func) { SavePosition(func); bw.Write((byte)func.semantic_node_type); bw.Write(func.name); if (func.return_value_type == null) bw.Write((byte)0); else { bw.Write((byte)1); WriteTypeReference(func.return_value_type); VisitLocalVariable(func.return_variable); } bw.Write(func.parameters.Count); foreach (common_parameter p in func.parameters) VisitParameter(p); bw.Write(0); bw.Write(func.is_forward); bw.Write(func.is_overload); bw.Write(func.num_of_default_variables); bw.Write(func.num_of_for_cycles); bw.Write(func.var_definition_nodes_list.Count); foreach (local_variable var in func.var_definition_nodes_list) if (var != func.return_variable) VisitLocalVariable(var); bw.Write(func.constants.Count); foreach (function_constant_definition cnst in func.constants) VisitFunctionConstant(cnst); bw.Write(func.functions_nodes.Length); foreach (common_in_function_function_node nest_func in func.functions_nodes_list) VisitNestedFunctionDefinition(nest_func); WriteDebugInfo(func.loc); SaveCodeReference(func); bw.Write(0); }
public common_function_node create_function(string name,location def_loc) { check_function_name(name,def_loc); common_function_node cfn=null; switch (converting_block()) { case block_type.function_block: { common_function_node top_func = _func_stack.top(); SymbolTable.Scope scope = convertion_data_and_alghoritms.symbol_table.CreateScope(top_func.scope); common_in_function_function_node ciffn; ciffn=new common_in_function_function_node(name,def_loc,top_func,scope); top_func.functions_nodes_list.AddElement(ciffn); _last_created_function=new SymbolInfo(ciffn); top_func.scope.AddSymbol(name,_last_created_function); cfn=ciffn; break; } case block_type.type_block: { common_method_node cmmn; SymbolTable.Scope scope = convertion_data_and_alghoritms.symbol_table.CreateClassMethodScope(_cmn.scope, _ctn.Scope); //TODO:сделать static и virtual. //TODO: interface and implementation scopes. cmmn=new common_method_node(name,def_loc,_ctn,SemanticTree.polymorphic_state.ps_common,_fal,scope); _last_created_function=new SymbolInfo(cmmn); _ctn.Scope.AddSymbol(name,_last_created_function); _ctn.methods.AddElement(cmmn); local_variable lv = new local_variable(compiler_string_consts.self_word, _ctn, cmmn, def_loc); cmmn.scope.AddSymbol(compiler_string_consts.self_word, new SymbolInfo(lv)); cmmn.self_variable = lv; cmmn.var_definition_nodes_list.AddElement(lv); cfn=cmmn; break; } case block_type.namespace_block: { common_namespace_function_node cnfnn; SymbolTable.Scope scope = convertion_data_and_alghoritms.symbol_table.CreateScope(_cmn.scope); cnfnn=new common_namespace_function_node(name,def_loc,_cmn,scope); _cmn.functions.AddElement(cnfnn); _last_created_function=new SymbolInfo(cnfnn); _cmn.scope.AddSymbol(name,_last_created_function); cfn=cnfnn; break; } } _func_stack.push(cfn); return cfn; }
private common_in_function_function_call create_common_in_function_function_call(common_in_function_function_node cfn, int static_depth,location loc,params expression_node[] exprs) { common_in_function_function_call cc=new common_in_function_function_call(cfn,static_depth,loc); cc.parameters.AddRange(exprs); return cc; }
//\ssyy private common_in_function_function_node GetNestedFunction() { int offset = (int)br.BaseStream.Position-start_pos; br.ReadByte(); common_in_function_function_node cffn = new common_in_function_function_node(br.ReadString(),null,null,null); if (br.ReadByte() == 1) { cffn.return_value_type = GetTypeReference(); cffn.return_variable = GetLocalVariable(cffn); cffn.var_definition_nodes_list.AddElement(cffn.return_variable); } int num_par = br.ReadInt32(); for (int i=0; i<num_par; i++) cffn.parameters.AddElement(GetParameter(cffn)); br.ReadInt32(); //namespace cffn.is_forward = br.ReadBoolean(); cffn.is_overload = br.ReadBoolean(); cffn.num_of_default_variables = br.ReadInt32(); cffn.num_of_for_cycles = br.ReadInt32(); //members[offset] = cffn; AddMember(cffn, offset); int num_var = br.ReadInt32(); if (cffn.return_value_type != null) num_var--; for (int i = 0; i < num_var; i++) { local_variable lv = GetLocalVariable(cffn); if (lv != cffn.return_variable) cffn.var_definition_nodes_list.AddElement(lv); } int num_consts = br.ReadInt32(); for (int i=0; i < num_consts; i++) { cffn.constants.AddElement(GetFunctionConstant(cffn)); } int num_nest_funcs = br.ReadInt32(); for (int i = 0; i < num_nest_funcs; i++) { cffn.functions_nodes_list.AddElement(GetNestedFunction()); } //br.ReadInt32();//code; cffn.loc = ReadDebugInfo(); cffn.function_code = GetCode(br.ReadInt32()); return cffn; }
public SymbolInfo(common_in_function_function_node value) { //_name_information_type=name_information_type.nit_common_in_function_function; _sym_info=value; _access_level=access_level.al_public; _symbol_kind=get_function_kind(value); }
public common_function_node create_function(string name,location def_loc, bool add_symbol_info) { if (converting_block() == block_type.compiled_type_block) { _compiled_tn = compiled_type_node.get_type_node(_compiled_tn.compiled_type,this.syntax_tree_visitor.SymbolTable); } check_function_name(name, def_loc); common_function_node cfn = null; switch (converting_block()) { case block_type.function_block: { common_function_node top_func = _func_stack.top(); SymbolTable.Scope scope = convertion_data_and_alghoritms.symbol_table.CreateScope(top_func.scope); common_in_function_function_node ciffn; ciffn=new common_in_function_function_node(name,def_loc,top_func,scope); top_func.functions_nodes_list.AddElement(ciffn); _last_created_function = new SymbolInfo(ciffn); if (add_symbol_info) top_func.scope.AddSymbol(name, _last_created_function); cfn=ciffn; break; } case block_type.type_block: { if (!extension_method) { common_method_node cmmn; SymbolTable.Scope scope = convertion_data_and_alghoritms.symbol_table.CreateClassMethodScope(_cmn.scope, _ctn.Scope); //TODO:сделать static и virtual. //TODO: interface and implementation scopes. cmmn = new common_method_node(name, def_loc, _ctn, SemanticTree.polymorphic_state.ps_common, _fal, scope); _last_created_function = new SymbolInfo(cmmn); if (add_symbol_info) _ctn.Scope.AddSymbol(name, _last_created_function); _ctn.methods.AddElement(cmmn); cfn = cmmn; } else { common_namespace_function_node cnfnn; SymbolTable.Scope scope = convertion_data_and_alghoritms.symbol_table.CreateClassMethodScope(_cmn.scope, _ctn.scope); cnfnn = new common_namespace_function_node(name, def_loc, _cmn, scope); //_cmn.functions.AddElement(cnfnn); syntax_tree_visitor.compiled_unit.namespaces[0].functions.AddElement(cnfnn); cnfnn.ConnectedToType = _ctn; _last_created_function = new SymbolInfo(cnfnn); if (add_symbol_info) _ctn.scope.AddSymbol(name, _last_created_function); cfn = cnfnn; } break; } case block_type.compiled_type_block: { //string cname = compiler_string_consts.GetConnectedFunctionName(_compiled_tn.name, name); common_namespace_function_node cnfnn; SymbolTable.Scope scope = convertion_data_and_alghoritms.symbol_table.CreateClassMethodScope(_cmn.scope, _compiled_tn.scope); cnfnn = new common_namespace_function_node(name, def_loc, _cmn, scope); //_cmn.functions.AddElement(cnfnn); syntax_tree_visitor.compiled_unit.namespaces[0].functions.AddElement(cnfnn); cnfnn.ConnectedToType = _compiled_tn; _last_created_function = new SymbolInfo(cnfnn); if (add_symbol_info) _compiled_tn.scope.AddSymbol(name, _last_created_function); SymbolInfo sss = _compiled_tn.find_in_type("Hello"); cfn = cnfnn; //if(_compiled_tn.compiled_type.IsPrimitive) // syntax_tree_visitor.WarningsList.Add(new PascalABCCompiler.Errors.CompilerWarning break; } case block_type.namespace_block: { common_namespace_function_node cnfnn; SymbolTable.Scope scope = convertion_data_and_alghoritms.symbol_table.CreateScope(_cmn.scope); cnfnn=new common_namespace_function_node(name,def_loc,_cmn,scope); _cmn.functions.AddElement(cnfnn); _last_created_function=new SymbolInfo(cnfnn); if (add_symbol_info) _cmn.scope.AddSymbol(name,_last_created_function); cfn=cnfnn; break; } } _func_stack.push(cfn); return cfn; }