From dd5bbae055fd34ce2e12ef63f8a261c6b15dc83e Mon Sep 17 00:00:00 2001 From: _ov4 Date: Wed, 21 Oct 2026 05:43:35 +0000 Subject: feat(parser): parse TEMPLATE declarations, template ids and parameter packs Co-Authored-By: Claude Opus 5.5 --- include/cps/TemplateAST.h | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 include/cps/TemplateAST.h (limited to 'include/cps/TemplateAST.h') diff --git a/include/cps/TemplateAST.h b/include/cps/TemplateAST.h new file mode 100644 index 0000000..c338b66 --- /dev/null +++ b/include/cps/TemplateAST.h @@ -0,0 +1,43 @@ +#pragma once +#include "cps/FunctionAST.h" +#include "cps/TypeAST.h" +#include +#include +#include +#include + +namespace cps { + +struct TemplateParam { + std::string Name; + bool IsPack = false; + int Line = 0; +}; + +class TemplateDeclAST : public StmtAST { + std::vector Params; + std::unique_ptr Function; + std::unique_ptr Class; +public: + TemplateDeclAST(std::vector Params, std::unique_ptr Function) + : Params(std::move(Params)), Function(std::move(Function)) {} + TemplateDeclAST(std::vector Params, std::unique_ptr Class) + : Params(std::move(Params)), Class(std::move(Class)) {} + const auto &getParams() const { return Params; } + const std::string &getName() const { + return Function ? Function->getProto()->getName() : Class->getName(); + } + bool isVariadic() const { return !Params.empty() && Params.back().IsPack; } + FunctionDefAST *getFunction() const { return Function.get(); } + ClassTypeDeclAST *getClass() const { return Class.get(); } +}; + +class PackExpansionExprAST : public ExprAST { + std::string Name; +public: + PackExpansionExprAST(std::string Name, int Line) + : ExprAST(Line), Name(std::move(Name)) {} + const std::string &getName() const { return Name; } +}; + +} // namespace cps -- cgit v1.3.1-4-g156e