void TActualParamWithConversion::BuildConvert(TExpressionResult from_result, TFormalParameter to_formal_param) { result = from_result; //если необходимо преобразование типа формального параметра то добавляем его if (result.GetClass() != to_formal_param.GetClass()) { conversion = result.GetClass()->GetConversion(result.IsRef(), to_formal_param.GetClass()); if (result.IsRef() && !to_formal_param.IsRef()) { if (conversion == NULL) { //если отсутствует преобразование, но имеется конструктор копии copy_constr = result.GetClass()->GetCopyConstr(); conversion = result.GetClass()->GetConversion(false, to_formal_param.GetClass()); } } if(conversion == NULL) throw std::logic_error("Невозможно преобразовать тип!"); } //если в стеке находится ссылка, а в качестве параметра требуется значение, то добавляем преобразование else if (result.IsRef() && !to_formal_param.IsRef()) { copy_constr = result.GetClass()->GetCopyConstr(); ref_to_rvalue = true; } }
//actual_parameter - параметр который был передан методу //formal_parameter - параметр указаный в сигнатуре метода bool IsEqualClasses(TExpressionResult actual_parameter, TFormalParameter formal_parameter, int& need_conv) //============== На выходе ========================================= //результат - равенство классов или возможность преобразования (conversion) класса { need_conv=0; if (actual_parameter.IsMethods() || actual_parameter.IsType())return false; if (formal_parameter.GetClass() != actual_parameter.GetClass()) { if (!actual_parameter.GetClass()->HasConversion(formal_parameter.GetClass()))return false; //TODO //if (formal_parameter.IsRef() && !actual_parameter.GetClass()->IsNestedIn(formal_parameter.GetClass()))return false; need_conv+=1; } if (actual_parameter.IsRef() && !formal_parameter.IsRef())need_conv += 1; return true; }