TSMethod* FindMethod(Lexer::TTokenPos* source, std::vector<TSMethod*> &methods_to_call, const std::vector<TExpressionResult> &actual_params) { int conv_needed; for (size_t k = 0; k<actual_params.size(); k++){ if (actual_params[k].IsVoid()) source->Error("Параметр метода должен иметь тип отличный от void!"); } int min_conv_method=-1,temp_conv,conv; conv_needed=-1; for (size_t i = 0; i<methods_to_call.size(); i++) { if (actual_params.size() == 0 && methods_to_call[i]->GetParamsCount() == 0){ conv_needed=0; return methods_to_call[i]; } if (actual_params.size() != methods_to_call[i]->GetParamsCount())goto end_search; temp_conv=0; conv=0; for (size_t k = 0; k<actual_params.size(); k++){ TSParameter* p=methods_to_call[i]->GetParam(k); if (!IsEqualClasses(actual_params[k], p->AsFormalParameter(), conv))goto end_search; else temp_conv+=conv; } if(temp_conv<conv_needed||conv_needed==-1) { conv_needed=temp_conv; min_conv_method=i; }end_search: continue; } if(min_conv_method>=0) return methods_to_call[min_conv_method]; return NULL; }
void TSStatement::TestBoolExpr(TExpressionResult& compare_result, std::unique_ptr<TActualParamWithConversion>& conversion) { int conv_needed; TSClass* bool_class = owner->GetClass(GetSyntax()->source->GetIdFromName("bool")); TFormalParameter formal_param(bool_class, false); if (!IsEqualClasses(compare_result, formal_param, conv_needed)) GetSyntax()->Error("Выражение невозможно преобразовать в логический тип!"); conversion.reset(new TActualParamWithConversion()); conversion->BuildConvert(compare_result, formal_param); }