| 939 | } |
| 940 | |
| 941 | void EmitFunctionConfigs(const Config& env_config, YAML::Emitter& out) { |
| 942 | const std::vector<Config::FunctionConfig>& function_configs = |
| 943 | env_config.GetFunctionConfigs(); |
| 944 | if (function_configs.empty()) { |
| 945 | return; |
| 946 | } |
| 947 | |
| 948 | // Sort function_configs by name to ensure deterministic output. |
| 949 | std::vector<Config::FunctionConfig> sorted_function_configs = |
| 950 | function_configs; |
| 951 | absl::c_sort(sorted_function_configs, |
| 952 | [](const Config::FunctionConfig& a, |
| 953 | const Config::FunctionConfig& b) { return a.name < b.name; }); |
| 954 | |
| 955 | out << YAML::Key << "functions"; |
| 956 | out << YAML::Value << YAML::BeginSeq; |
| 957 | for (const Config::FunctionConfig& function_config : |
| 958 | sorted_function_configs) { |
| 959 | out << YAML::BeginMap; |
| 960 | out << YAML::Key << "name"; |
| 961 | out << YAML::Value << YAML::DoubleQuoted << function_config.name; |
| 962 | if (!function_config.description.empty()) { |
| 963 | out << YAML::Key << "description"; |
| 964 | out << YAML::Value << YAML::DoubleQuoted << function_config.description; |
| 965 | } |
| 966 | if (!function_config.overload_configs.empty()) { |
| 967 | // Sort overloads for deterministic output. |
| 968 | std::vector<Config::FunctionOverloadConfig> sorted_overloads = |
| 969 | function_config.overload_configs; |
| 970 | absl::c_sort(sorted_overloads, |
| 971 | [](const Config::FunctionOverloadConfig& a, |
| 972 | const Config::FunctionOverloadConfig& b) { |
| 973 | for (size_t i = 0; i < a.parameters.size(); ++i) { |
| 974 | // Order like this: foo(a), foo(a, b) |
| 975 | if (i >= b.parameters.size()) { |
| 976 | return false; |
| 977 | } |
| 978 | if (CompareTypeInfo(a.parameters[i], b.parameters[i])) { |
| 979 | return true; |
| 980 | } |
| 981 | if (CompareTypeInfo(b.parameters[i], a.parameters[i])) { |
| 982 | return false; |
| 983 | } |
| 984 | } |
| 985 | return false; |
| 986 | }); |
| 987 | |
| 988 | out << YAML::Key << "overloads" << YAML::Value << YAML::BeginSeq; |
| 989 | for (const Config::FunctionOverloadConfig& overload_config : |
| 990 | sorted_overloads) { |
| 991 | EmitFunctionOverloadConfig(overload_config, out); |
| 992 | } |
| 993 | out << YAML::EndSeq; |
| 994 | } |
| 995 | out << YAML::EndMap; |
| 996 | } |
| 997 | out << YAML::EndSeq; |
| 998 | } |
no test coverage detected