#pragma once #include "AST/Base.h" #include #include #include #include #include namespace plsm { namespace ast { class FnArg : public ASTNode { const std::string name; const std::unique_ptr type; public: FnArg(LOC_ARG, const std::string &name, std::unique_ptr &type) : ASTNode(location), name(name), type(std::move(type)) {} virtual boost::json::value toJson() override; static std::unique_ptr fromJson(boost::json::value json); }; class FnDef : public Stmt { const std::string name; const std::vector> args; const std::unique_ptr returnType; const std::unique_ptr body; public: FnDef(LOC_ARG, const std::string &name, std::vector> &args, std::unique_ptr &returnType, std::unique_ptr &body) : Stmt(location), name(name), args(std::move(args)), returnType(std::move(returnType)), body(std::move(body)) {} virtual boost::json::value toJson() override; static std::unique_ptr fromJson(boost::json::value json); }; } // namespace ast } // namespace plsm