Files
Fig/src/Ast/functionParameters.hpp
PuqiAR f58a60c8e3 [VER] 0.3.3-alpha
[FEAT] interface + impl 支持! Duck Typing + 严格的检查让语言健壮
[FEAT][IMPL] 增加辅助函数 isTypeMatch等
[IMPL] TypeInfo构造函数FString 现在 explicit
2025-12-30 12:02:27 +08:00

95 lines
2.8 KiB
C++

#pragma once
#include <Ast/astBase.hpp>
#include <Value/Type.hpp>
#include <Core/fig_string.hpp>
#include <format>
namespace Fig::Ast
{
struct FunctionParameters // for define
{
/*
Positional Parameters:
func test(pp1, pp2: Int)
Default Parameters:
func test2(dp1 = 10, dp2:String = "default parameter 2")
*/
using PosParasType = std::vector<std::pair<FString, FString>>;
using DefParasType = std::vector<std::pair<FString, std::pair<FString, Expression>>>;
PosParasType posParas;
DefParasType defParas; // default parameters
FString variadicPara;
bool variadic = false;
FunctionParameters()
{
}
FunctionParameters(PosParasType _posParas, DefParasType _defParas)
{
posParas = std::move(_posParas);
defParas = std::move(_defParas);
}
FunctionParameters(FString _variadicPara)
{
variadicPara = std::move(_variadicPara);
variadic = true;
}
size_t size() const
{
return posParas.size() + defParas.size();
}
bool operator==(const FunctionParameters &other) const
{
return posParas == other.posParas && defParas == other.defParas && variadicPara == other.variadicPara && variadic == other.variadic;
}
FString toString() const
{
if (variadic)
{
return FString(variadicPara + u8"...");
}
static const auto posParasToString = [this]() {
FString out;
for (auto &p : posParas)
{
out += p.first;
if (!p.second.empty())
{
out += FString(u8":" + p.second);
}
out += u8",";
}
out.pop_back();
return out;
};
static const auto defParasToString = [this]() {
FString out;
for (auto &p : defParas)
{
out += p.first;
if (!p.second.first.empty())
{
out += FString(u8":" + p.second.first);
}
if (p.second.second != nullptr)
{
out += u8"=";
out += p.second.second->toString();
}
out += u8",";
}
out.pop_back();
return out;
};
return FString(std::format("{},{}", posParasToString().toBasicString(), defParasToString().toBasicString()));
}
};
} // namespace Fig::Ast