//===-- GoAST.h -------------------------------------------------*- C++ -*-===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // DO NOT EDIT. // Generated by gen_go_ast.py #ifndef liblldb_GoAST_h #define liblldb_GoAST_h #include "Plugins/ExpressionParser/Go/GoLexer.h" #include "lldb/lldb-forward.h" #include "lldb/lldb-private.h" #include "llvm/Support/Casting.h" namespace lldb_private { class GoASTNode { public: typedef GoLexer::TokenType TokenType; typedef GoLexer::Token Token; enum ChanDir { eChanBidir, eChanSend, eChanRecv, }; enum NodeKind { eBadDecl, eFuncDecl, eGenDecl, eArrayType, eBadExpr, eBasicLit, eBinaryExpr, eIdent, eCallExpr, eChanType, eCompositeLit, eEllipsis, eFuncType, eFuncLit, eIndexExpr, eInterfaceType, eKeyValueExpr, eMapType, eParenExpr, eSelectorExpr, eSliceExpr, eStarExpr, eStructType, eTypeAssertExpr, eUnaryExpr, eImportSpec, eTypeSpec, eValueSpec, eAssignStmt, eBadStmt, eBlockStmt, eBranchStmt, eCaseClause, eCommClause, eDeclStmt, eDeferStmt, eEmptyStmt, eExprStmt, eForStmt, eGoStmt, eIfStmt, eIncDecStmt, eLabeledStmt, eRangeStmt, eReturnStmt, eSelectStmt, eSendStmt, eSwitchStmt, eTypeSwitchStmt, eField, eFieldList, }; virtual ~GoASTNode() = default; NodeKind GetKind() const { return m_kind; } virtual const char *GetKindName() const = 0; template void WalkChildren(V &v); protected: explicit GoASTNode(NodeKind kind) : m_kind(kind) {} private: const NodeKind m_kind; GoASTNode(const GoASTNode &) = delete; const GoASTNode &operator=(const GoASTNode &) = delete; }; class GoASTDecl : public GoASTNode { public: template R Visit(V *v) const; static bool classof(const GoASTNode *n) { return n->GetKind() >= eBadDecl && n->GetKind() <= eGenDecl; } protected: explicit GoASTDecl(NodeKind kind) : GoASTNode(kind) {} private: GoASTDecl(const GoASTDecl &) = delete; const GoASTDecl &operator=(const GoASTDecl &) = delete; }; class GoASTExpr : public GoASTNode { public: template R Visit(V *v) const; static bool classof(const GoASTNode *n) { return n->GetKind() >= eArrayType && n->GetKind() <= eUnaryExpr; } protected: explicit GoASTExpr(NodeKind kind) : GoASTNode(kind) {} private: GoASTExpr(const GoASTExpr &) = delete; const GoASTExpr &operator=(const GoASTExpr &) = delete; }; class GoASTSpec : public GoASTNode { public: template R Visit(V *v) const; static bool classof(const GoASTNode *n) { return n->GetKind() >= eImportSpec && n->GetKind() <= eValueSpec; } protected: explicit GoASTSpec(NodeKind kind) : GoASTNode(kind) {} private: GoASTSpec(const GoASTSpec &) = delete; const GoASTSpec &operator=(const GoASTSpec &) = delete; }; class GoASTStmt : public GoASTNode { public: template R Visit(V *v) const; static bool classof(const GoASTNode *n) { return n->GetKind() >= eAssignStmt && n->GetKind() <= eTypeSwitchStmt; } protected: explicit GoASTStmt(NodeKind kind) : GoASTNode(kind) {} private: GoASTStmt(const GoASTStmt &) = delete; const GoASTStmt &operator=(const GoASTStmt &) = delete; }; class GoASTArrayType : public GoASTExpr { public: GoASTArrayType(GoASTExpr *len, GoASTExpr *elt) : GoASTExpr(eArrayType), m_len_up(len), m_elt_up(elt) {} ~GoASTArrayType() override = default; const char *GetKindName() const override { return "ArrayType"; } static bool classof(const GoASTNode *n) { return n->GetKind() == eArrayType; } const GoASTExpr *GetLen() const { return m_len_up.get(); } void SetLen(GoASTExpr *len) { m_len_up.reset(len); } const GoASTExpr *GetElt() const { return m_elt_up.get(); } void SetElt(GoASTExpr *elt) { m_elt_up.reset(elt); } private: friend class GoASTNode; std::unique_ptr m_len_up; std::unique_ptr m_elt_up; GoASTArrayType(const GoASTArrayType &) = delete; const GoASTArrayType &operator=(const GoASTArrayType &) = delete; }; class GoASTAssignStmt : public GoASTStmt { public: explicit GoASTAssignStmt(bool define) : GoASTStmt(eAssignStmt), m_define(define) {} ~GoASTAssignStmt() override = default; const char *GetKindName() const override { return "AssignStmt"; } static bool classof(const GoASTNode *n) { return n->GetKind() == eAssignStmt; } size_t NumLhs() const { return m_lhs.size(); } const GoASTExpr *GetLhs(int i) const { return m_lhs[i].get(); } void AddLhs(GoASTExpr *lhs) { m_lhs.push_back(std::unique_ptr(lhs)); } size_t NumRhs() const { return m_rhs.size(); } const GoASTExpr *GetRhs(int i) const { return m_rhs[i].get(); } void AddRhs(GoASTExpr *rhs) { m_rhs.push_back(std::unique_ptr(rhs)); } bool GetDefine() const { return m_define; } void SetDefine(bool define) { m_define = define; } private: friend class GoASTNode; std::vector> m_lhs; std::vector> m_rhs; bool m_define; GoASTAssignStmt(const GoASTAssignStmt &) = delete; const GoASTAssignStmt &operator=(const GoASTAssignStmt &) = delete; }; class GoASTBadDecl : public GoASTDecl { public: GoASTBadDecl() : GoASTDecl(eBadDecl) {} ~GoASTBadDecl() override = default; const char *GetKindName() const override { return "BadDecl"; } static bool classof(const GoASTNode *n) { return n->GetKind() == eBadDecl; } GoASTBadDecl(const GoASTBadDecl &) = delete; const GoASTBadDecl &operator=(const GoASTBadDecl &) = delete; }; class GoASTBadExpr : public GoASTExpr { public: GoASTBadExpr() : GoASTExpr(eBadExpr) {} ~GoASTBadExpr() override = default; const char *GetKindName() const override { return "BadExpr"; } static bool classof(const GoASTNode *n) { return n->GetKind() == eBadExpr; } GoASTBadExpr(const GoASTBadExpr &) = delete; const GoASTBadExpr &operator=(const GoASTBadExpr &) = delete; }; class GoASTBadStmt : public GoASTStmt { public: GoASTBadStmt() : GoASTStmt(eBadStmt) {} ~GoASTBadStmt() override = default; const char *GetKindName() const override { return "BadStmt"; } static bool classof(const GoASTNode *n) { return n->GetKind() == eBadStmt; } GoASTBadStmt(const GoASTBadStmt &) = delete; const GoASTBadStmt &operator=(const GoASTBadStmt &) = delete; }; class GoASTBasicLit : public GoASTExpr { public: explicit GoASTBasicLit(Token value) : GoASTExpr(eBasicLit), m_value(value) {} ~GoASTBasicLit() override = default; const char *GetKindName() const override { return "BasicLit"; } static bool classof(const GoASTNode *n) { return n->GetKind() == eBasicLit; } Token GetValue() const { return m_value; } void SetValue(Token value) { m_value = value; } private: friend class GoASTNode; Token m_value; GoASTBasicLit(const GoASTBasicLit &) = delete; const GoASTBasicLit &operator=(const GoASTBasicLit &) = delete; }; class GoASTBinaryExpr : public GoASTExpr { public: GoASTBinaryExpr(GoASTExpr *x, GoASTExpr *y, TokenType op) : GoASTExpr(eBinaryExpr), m_x_up(x), m_y_up(y), m_op(op) {} ~GoASTBinaryExpr() override = default; const char *GetKindName() const override { return "BinaryExpr"; } static bool classof(const GoASTNode *n) { return n->GetKind() == eBinaryExpr; } const GoASTExpr *GetX() const { return m_x_up.get(); } void SetX(GoASTExpr *x) { m_x_up.reset(x); } const GoASTExpr *GetY() const { return m_y_up.get(); } void SetY(GoASTExpr *y) { m_y_up.reset(y); } TokenType GetOp() const { return m_op; } void SetOp(TokenType op) { m_op = op; } private: friend class GoASTNode; std::unique_ptr m_x_up; std::unique_ptr m_y_up; TokenType m_op; GoASTBinaryExpr(const GoASTBinaryExpr &) = delete; const GoASTBinaryExpr &operator=(const GoASTBinaryExpr &) = delete; }; class GoASTBlockStmt : public GoASTStmt { public: GoASTBlockStmt() : GoASTStmt(eBlockStmt) {} ~GoASTBlockStmt() override = default; const char *GetKindName() const override { return "BlockStmt"; } static bool classof(const GoASTNode *n) { return n->GetKind() == eBlockStmt; } size_t NumList() const { return m_list.size(); } const GoASTStmt *GetList(int i) const { return m_list[i].get(); } void AddList(GoASTStmt *list) { m_list.push_back(std::unique_ptr(list)); } private: friend class GoASTNode; std::vector> m_list; GoASTBlockStmt(const GoASTBlockStmt &) = delete; const GoASTBlockStmt &operator=(const GoASTBlockStmt &) = delete; }; class GoASTIdent : public GoASTExpr { public: explicit GoASTIdent(Token name) : GoASTExpr(eIdent), m_name(name) {} ~GoASTIdent() override = default; const char *GetKindName() const override { return "Ident"; } static bool classof(const GoASTNode *n) { return n->GetKind() == eIdent; } Token GetName() const { return m_name; } void SetName(Token name) { m_name = name; } private: friend class GoASTNode; Token m_name; GoASTIdent(const GoASTIdent &) = delete; const GoASTIdent &operator=(const GoASTIdent &) = delete; }; class GoASTBranchStmt : public GoASTStmt { public: GoASTBranchStmt(GoASTIdent *label, TokenType tok) : GoASTStmt(eBranchStmt), m_label_up(label), m_tok(tok) {} ~GoASTBranchStmt() override = default; const char *GetKindName() const override { return "BranchStmt"; } static bool classof(const GoASTNode *n) { return n->GetKind() == eBranchStmt; } const GoASTIdent *GetLabel() const { return m_label_up.get(); } void SetLabel(GoASTIdent *label) { m_label_up.reset(label); } TokenType GetTok() const { return m_tok; } void SetTok(TokenType tok) { m_tok = tok; } private: friend class GoASTNode; std::unique_ptr m_label_up; TokenType m_tok; GoASTBranchStmt(const GoASTBranchStmt &) = delete; const GoASTBranchStmt &operator=(const GoASTBranchStmt &) = delete; }; class GoASTCallExpr : public GoASTExpr { public: explicit GoASTCallExpr(bool ellipsis) : GoASTExpr(eCallExpr), m_ellipsis(ellipsis) {} ~GoASTCallExpr() override = default; const char *GetKindName() const override { return "CallExpr"; } static bool classof(const GoASTNode *n) { return n->GetKind() == eCallExpr; } const GoASTExpr *GetFun() const { return m_fun_up.get(); } void SetFun(GoASTExpr *fun) { m_fun_up.reset(fun); } size_t NumArgs() const { return m_args.size(); } const GoASTExpr *GetArgs(int i) const { return m_args[i].get(); } void AddArgs(GoASTExpr *args) { m_args.push_back(std::unique_ptr(args)); } bool GetEllipsis() const { return m_ellipsis; } void SetEllipsis(bool ellipsis) { m_ellipsis = ellipsis; } private: friend class GoASTNode; std::unique_ptr m_fun_up; std::vector> m_args; bool m_ellipsis; GoASTCallExpr(const GoASTCallExpr &) = delete; const GoASTCallExpr &operator=(const GoASTCallExpr &) = delete; }; class GoASTCaseClause : public GoASTStmt { public: GoASTCaseClause() : GoASTStmt(eCaseClause) {} ~GoASTCaseClause() override = default; const char *GetKindName() const override { return "CaseClause"; } static bool classof(const GoASTNode *n) { return n->GetKind() == eCaseClause; } size_t NumList() const { return m_list.size(); } const GoASTExpr *GetList(int i) const { return m_list[i].get(); } void AddList(GoASTExpr *list) { m_list.push_back(std::unique_ptr(list)); } size_t NumBody() const { return m_body.size(); } const GoASTStmt *GetBody(int i) const { return m_body[i].get(); } void AddBody(GoASTStmt *body) { m_body.push_back(std::unique_ptr(body)); } private: friend class GoASTNode; std::vector> m_list; std::vector> m_body; GoASTCaseClause(const GoASTCaseClause &) = delete; const GoASTCaseClause &operator=(const GoASTCaseClause &) = delete; }; class GoASTChanType : public GoASTExpr { public: GoASTChanType(ChanDir dir, GoASTExpr *value) : GoASTExpr(eChanType), m_dir(dir), m_value_up(value) {} ~GoASTChanType() override = default; const char *GetKindName() const override { return "ChanType"; } static bool classof(const GoASTNode *n) { return n->GetKind() == eChanType; } ChanDir GetDir() const { return m_dir; } void SetDir(ChanDir dir) { m_dir = dir; } const GoASTExpr *GetValue() const { return m_value_up.get(); } void SetValue(GoASTExpr *value) { m_value_up.reset(value); } private: friend class GoASTNode; ChanDir m_dir; std::unique_ptr m_value_up; GoASTChanType(const GoASTChanType &) = delete; const GoASTChanType &operator=(const GoASTChanType &) = delete; }; class GoASTCommClause : public GoASTStmt { public: GoASTCommClause() : GoASTStmt(eCommClause) {} ~GoASTCommClause() override = default; const char *GetKindName() const override { return "CommClause"; } static bool classof(const GoASTNode *n) { return n->GetKind() == eCommClause; } const GoASTStmt *GetComm() const { return m_comm_up.get(); } void SetComm(GoASTStmt *comm) { m_comm_up.reset(comm); } size_t NumBody() const { return m_body.size(); } const GoASTStmt *GetBody(int i) const { return m_body[i].get(); } void AddBody(GoASTStmt *body) { m_body.push_back(std::unique_ptr(body)); } private: friend class GoASTNode; std::unique_ptr m_comm_up; std::vector> m_body; GoASTCommClause(const GoASTCommClause &) = delete; const GoASTCommClause &operator=(const GoASTCommClause &) = delete; }; class GoASTCompositeLit : public GoASTExpr { public: GoASTCompositeLit() : GoASTExpr(eCompositeLit) {} ~GoASTCompositeLit() override = default; const char *GetKindName() const override { return "CompositeLit"; } static bool classof(const GoASTNode *n) { return n->GetKind() == eCompositeLit; } const GoASTExpr *GetType() const { return m_type_up.get(); } void SetType(GoASTExpr *type) { m_type_up.reset(type); } size_t NumElts() const { return m_elts.size(); } const GoASTExpr *GetElts(int i) const { return m_elts[i].get(); } void AddElts(GoASTExpr *elts) { m_elts.push_back(std::unique_ptr(elts)); } private: friend class GoASTNode; std::unique_ptr m_type_up; std::vector> m_elts; GoASTCompositeLit(const GoASTCompositeLit &) = delete; const GoASTCompositeLit &operator=(const GoASTCompositeLit &) = delete; }; class GoASTDeclStmt : public GoASTStmt { public: explicit GoASTDeclStmt(GoASTDecl *decl) : GoASTStmt(eDeclStmt), m_decl_up(decl) {} ~GoASTDeclStmt() override = default; const char *GetKindName() const override { return "DeclStmt"; } static bool classof(const GoASTNode *n) { return n->GetKind() == eDeclStmt; } const GoASTDecl *GetDecl() const { return m_decl_up.get(); } void SetDecl(GoASTDecl *decl) { m_decl_up.reset(decl); } private: friend class GoASTNode; std::unique_ptr m_decl_up; GoASTDeclStmt(const GoASTDeclStmt &) = delete; const GoASTDeclStmt &operator=(const GoASTDeclStmt &) = delete; }; class GoASTDeferStmt : public GoASTStmt { public: explicit GoASTDeferStmt(GoASTCallExpr *call) : GoASTStmt(eDeferStmt), m_call_up(call) {} ~GoASTDeferStmt() override = default; const char *GetKindName() const override { return "DeferStmt"; } static bool classof(const GoASTNode *n) { return n->GetKind() == eDeferStmt; } const GoASTCallExpr *GetCall() const { return m_call_up.get(); } void SetCall(GoASTCallExpr *call) { m_call_up.reset(call); } private: friend class GoASTNode; std::unique_ptr m_call_up; GoASTDeferStmt(const GoASTDeferStmt &) = delete; const GoASTDeferStmt &operator=(const GoASTDeferStmt &) = delete; }; class GoASTEllipsis : public GoASTExpr { public: explicit GoASTEllipsis(GoASTExpr *elt) : GoASTExpr(eEllipsis), m_elt_up(elt) {} ~GoASTEllipsis() override = default; const char *GetKindName() const override { return "Ellipsis"; } static bool classof(const GoASTNode *n) { return n->GetKind() == eEllipsis; } const GoASTExpr *GetElt() const { return m_elt_up.get(); } void SetElt(GoASTExpr *elt) { m_elt_up.reset(elt); } private: friend class GoASTNode; std::unique_ptr m_elt_up; GoASTEllipsis(const GoASTEllipsis &) = delete; const GoASTEllipsis &operator=(const GoASTEllipsis &) = delete; }; class GoASTEmptyStmt : public GoASTStmt { public: GoASTEmptyStmt() : GoASTStmt(eEmptyStmt) {} ~GoASTEmptyStmt() override = default; const char *GetKindName() const override { return "EmptyStmt"; } static bool classof(const GoASTNode *n) { return n->GetKind() == eEmptyStmt; } GoASTEmptyStmt(const GoASTEmptyStmt &) = delete; const GoASTEmptyStmt &operator=(const GoASTEmptyStmt &) = delete; }; class GoASTExprStmt : public GoASTStmt { public: explicit GoASTExprStmt(GoASTExpr *x) : GoASTStmt(eExprStmt), m_x_up(x) {} ~GoASTExprStmt() override = default; const char *GetKindName() const override { return "ExprStmt"; } static bool classof(const GoASTNode *n) { return n->GetKind() == eExprStmt; } const GoASTExpr *GetX() const { return m_x_up.get(); } void SetX(GoASTExpr *x) { m_x_up.reset(x); } private: friend class GoASTNode; std::unique_ptr m_x_up; GoASTExprStmt(const GoASTExprStmt &) = delete; const GoASTExprStmt &operator=(const GoASTExprStmt &) = delete; }; class GoASTField : public GoASTNode { public: GoASTField() : GoASTNode(eField) {} ~GoASTField() override = default; const char *GetKindName() const override { return "Field"; } static bool classof(const GoASTNode *n) { return n->GetKind() == eField; } size_t NumNames() const { return m_names.size(); } const GoASTIdent *GetNames(int i) const { return m_names[i].get(); } void AddNames(GoASTIdent *names) { m_names.push_back(std::unique_ptr(names)); } const GoASTExpr *GetType() const { return m_type_up.get(); } void SetType(GoASTExpr *type) { m_type_up.reset(type); } const GoASTBasicLit *GetTag() const { return m_tag_up.get(); } void SetTag(GoASTBasicLit *tag) { m_tag_up.reset(tag); } private: friend class GoASTNode; std::vector> m_names; std::unique_ptr m_type_up; std::unique_ptr m_tag_up; GoASTField(const GoASTField &) = delete; const GoASTField &operator=(const GoASTField &) = delete; }; class GoASTFieldList : public GoASTNode { public: GoASTFieldList() : GoASTNode(eFieldList) {} ~GoASTFieldList() override = default; const char *GetKindName() const override { return "FieldList"; } static bool classof(const GoASTNode *n) { return n->GetKind() == eFieldList; } size_t NumList() const { return m_list.size(); } const GoASTField *GetList(int i) const { return m_list[i].get(); } void AddList(GoASTField *list) { m_list.push_back(std::unique_ptr(list)); } private: friend class GoASTNode; std::vector> m_list; GoASTFieldList(const GoASTFieldList &) = delete; const GoASTFieldList &operator=(const GoASTFieldList &) = delete; }; class GoASTForStmt : public GoASTStmt { public: GoASTForStmt(GoASTStmt *init, GoASTExpr *cond, GoASTStmt *post, GoASTBlockStmt *body) : GoASTStmt(eForStmt), m_init_up(init), m_cond_up(cond), m_post_up(post), m_body_up(body) {} ~GoASTForStmt() override = default; const char *GetKindName() const override { return "ForStmt"; } static bool classof(const GoASTNode *n) { return n->GetKind() == eForStmt; } const GoASTStmt *GetInit() const { return m_init_up.get(); } void SetInit(GoASTStmt *init) { m_init_up.reset(init); } const GoASTExpr *GetCond() const { return m_cond_up.get(); } void SetCond(GoASTExpr *cond) { m_cond_up.reset(cond); } const GoASTStmt *GetPost() const { return m_post_up.get(); } void SetPost(GoASTStmt *post) { m_post_up.reset(post); } const GoASTBlockStmt *GetBody() const { return m_body_up.get(); } void SetBody(GoASTBlockStmt *body) { m_body_up.reset(body); } private: friend class GoASTNode; std::unique_ptr m_init_up; std::unique_ptr m_cond_up; std::unique_ptr m_post_up; std::unique_ptr m_body_up; GoASTForStmt(const GoASTForStmt &) = delete; const GoASTForStmt &operator=(const GoASTForStmt &) = delete; }; class GoASTFuncType : public GoASTExpr { public: GoASTFuncType(GoASTFieldList *params, GoASTFieldList *results) : GoASTExpr(eFuncType), m_params_up(params), m_results_up(results) {} ~GoASTFuncType() override = default; const char *GetKindName() const override { return "FuncType"; } static bool classof(const GoASTNode *n) { return n->GetKind() == eFuncType; } const GoASTFieldList *GetParams() const { return m_params_up.get(); } void SetParams(GoASTFieldList *params) { m_params_up.reset(params); } const GoASTFieldList *GetResults() const { return m_results_up.get(); } void SetResults(GoASTFieldList *results) { m_results_up.reset(results); } private: friend class GoASTNode; std::unique_ptr m_params_up; std::unique_ptr m_results_up; GoASTFuncType(const GoASTFuncType &) = delete; const GoASTFuncType &operator=(const GoASTFuncType &) = delete; }; class GoASTFuncDecl : public GoASTDecl { public: GoASTFuncDecl(GoASTFieldList *recv, GoASTIdent *name, GoASTFuncType *type, GoASTBlockStmt *body) : GoASTDecl(eFuncDecl), m_recv_up(recv), m_name_up(name), m_type_up(type), m_body_up(body) {} ~GoASTFuncDecl() override = default; const char *GetKindName() const override { return "FuncDecl"; } static bool classof(const GoASTNode *n) { return n->GetKind() == eFuncDecl; } const GoASTFieldList *GetRecv() const { return m_recv_up.get(); } void SetRecv(GoASTFieldList *recv) { m_recv_up.reset(recv); } const GoASTIdent *GetName() const { return m_name_up.get(); } void SetName(GoASTIdent *name) { m_name_up.reset(name); } const GoASTFuncType *GetType() const { return m_type_up.get(); } void SetType(GoASTFuncType *type) { m_type_up.reset(type); } const GoASTBlockStmt *GetBody() const { return m_body_up.get(); } void SetBody(GoASTBlockStmt *body) { m_body_up.reset(body); } private: friend class GoASTNode; std::unique_ptr m_recv_up; std::unique_ptr m_name_up; std::unique_ptr m_type_up; std::unique_ptr m_body_up; GoASTFuncDecl(const GoASTFuncDecl &) = delete; const GoASTFuncDecl &operator=(const GoASTFuncDecl &) = delete; }; class GoASTFuncLit : public GoASTExpr { public: GoASTFuncLit(GoASTFuncType *type, GoASTBlockStmt *body) : GoASTExpr(eFuncLit), m_type_up(type), m_body_up(body) {} ~GoASTFuncLit() override = default; const char *GetKindName() const override { return "FuncLit"; } static bool classof(const GoASTNode *n) { return n->GetKind() == eFuncLit; } const GoASTFuncType *GetType() const { return m_type_up.get(); } void SetType(GoASTFuncType *type) { m_type_up.reset(type); } const GoASTBlockStmt *GetBody() const { return m_body_up.get(); } void SetBody(GoASTBlockStmt *body) { m_body_up.reset(body); } private: friend class GoASTNode; std::unique_ptr m_type_up; std::unique_ptr m_body_up; GoASTFuncLit(const GoASTFuncLit &) = delete; const GoASTFuncLit &operator=(const GoASTFuncLit &) = delete; }; class GoASTGenDecl : public GoASTDecl { public: explicit GoASTGenDecl(TokenType tok) : GoASTDecl(eGenDecl), m_tok(tok) {} ~GoASTGenDecl() override = default; const char *GetKindName() const override { return "GenDecl"; } static bool classof(const GoASTNode *n) { return n->GetKind() == eGenDecl; } TokenType GetTok() const { return m_tok; } void SetTok(TokenType tok) { m_tok = tok; } size_t NumSpecs() const { return m_specs.size(); } const GoASTSpec *GetSpecs(int i) const { return m_specs[i].get(); } void AddSpecs(GoASTSpec *specs) { m_specs.push_back(std::unique_ptr(specs)); } private: friend class GoASTNode; TokenType m_tok; std::vector> m_specs; GoASTGenDecl(const GoASTGenDecl &) = delete; const GoASTGenDecl &operator=(const GoASTGenDecl &) = delete; }; class GoASTGoStmt : public GoASTStmt { public: explicit GoASTGoStmt(GoASTCallExpr *call) : GoASTStmt(eGoStmt), m_call_up(call) {} ~GoASTGoStmt() override = default; const char *GetKindName() const override { return "GoStmt"; } static bool classof(const GoASTNode *n) { return n->GetKind() == eGoStmt; } const GoASTCallExpr *GetCall() const { return m_call_up.get(); } void SetCall(GoASTCallExpr *call) { m_call_up.reset(call); } private: friend class GoASTNode; std::unique_ptr m_call_up; GoASTGoStmt(const GoASTGoStmt &) = delete; const GoASTGoStmt &operator=(const GoASTGoStmt &) = delete; }; class GoASTIfStmt : public GoASTStmt { public: GoASTIfStmt(GoASTStmt *init, GoASTExpr *cond, GoASTBlockStmt *body, GoASTStmt *els) : GoASTStmt(eIfStmt), m_init_up(init), m_cond_up(cond), m_body_up(body), m_els_up(els) {} ~GoASTIfStmt() override = default; const char *GetKindName() const override { return "IfStmt"; } static bool classof(const GoASTNode *n) { return n->GetKind() == eIfStmt; } const GoASTStmt *GetInit() const { return m_init_up.get(); } void SetInit(GoASTStmt *init) { m_init_up.reset(init); } const GoASTExpr *GetCond() const { return m_cond_up.get(); } void SetCond(GoASTExpr *cond) { m_cond_up.reset(cond); } const GoASTBlockStmt *GetBody() const { return m_body_up.get(); } void SetBody(GoASTBlockStmt *body) { m_body_up.reset(body); } const GoASTStmt *GetEls() const { return m_els_up.get(); } void SetEls(GoASTStmt *els) { m_els_up.reset(els); } private: friend class GoASTNode; std::unique_ptr m_init_up; std::unique_ptr m_cond_up; std::unique_ptr m_body_up; std::unique_ptr m_els_up; GoASTIfStmt(const GoASTIfStmt &) = delete; const GoASTIfStmt &operator=(const GoASTIfStmt &) = delete; }; class GoASTImportSpec : public GoASTSpec { public: GoASTImportSpec(GoASTIdent *name, GoASTBasicLit *path) : GoASTSpec(eImportSpec), m_name_up(name), m_path_up(path) {} ~GoASTImportSpec() override = default; const char *GetKindName() const override { return "ImportSpec"; } static bool classof(const GoASTNode *n) { return n->GetKind() == eImportSpec; } const GoASTIdent *GetName() const { return m_name_up.get(); } void SetName(GoASTIdent *name) { m_name_up.reset(name); } const GoASTBasicLit *GetPath() const { return m_path_up.get(); } void SetPath(GoASTBasicLit *path) { m_path_up.reset(path); } private: friend class GoASTNode; std::unique_ptr m_name_up; std::unique_ptr m_path_up; GoASTImportSpec(const GoASTImportSpec &) = delete; const GoASTImportSpec &operator=(const GoASTImportSpec &) = delete; }; class GoASTIncDecStmt : public GoASTStmt { public: GoASTIncDecStmt(GoASTExpr *x, TokenType tok) : GoASTStmt(eIncDecStmt), m_x_up(x), m_tok(tok) {} ~GoASTIncDecStmt() override = default; const char *GetKindName() const override { return "IncDecStmt"; } static bool classof(const GoASTNode *n) { return n->GetKind() == eIncDecStmt; } const GoASTExpr *GetX() const { return m_x_up.get(); } void SetX(GoASTExpr *x) { m_x_up.reset(x); } TokenType GetTok() const { return m_tok; } void SetTok(TokenType tok) { m_tok = tok; } private: friend class GoASTNode; std::unique_ptr m_x_up; TokenType m_tok; GoASTIncDecStmt(const GoASTIncDecStmt &) = delete; const GoASTIncDecStmt &operator=(const GoASTIncDecStmt &) = delete; }; class GoASTIndexExpr : public GoASTExpr { public: GoASTIndexExpr(GoASTExpr *x, GoASTExpr *index) : GoASTExpr(eIndexExpr), m_x_up(x), m_index_up(index) {} ~GoASTIndexExpr() override = default; const char *GetKindName() const override { return "IndexExpr"; } static bool classof(const GoASTNode *n) { return n->GetKind() == eIndexExpr; } const GoASTExpr *GetX() const { return m_x_up.get(); } void SetX(GoASTExpr *x) { m_x_up.reset(x); } const GoASTExpr *GetIndex() const { return m_index_up.get(); } void SetIndex(GoASTExpr *index) { m_index_up.reset(index); } private: friend class GoASTNode; std::unique_ptr m_x_up; std::unique_ptr m_index_up; GoASTIndexExpr(const GoASTIndexExpr &) = delete; const GoASTIndexExpr &operator=(const GoASTIndexExpr &) = delete; }; class GoASTInterfaceType : public GoASTExpr { public: explicit GoASTInterfaceType(GoASTFieldList *methods) : GoASTExpr(eInterfaceType), m_methods_up(methods) {} ~GoASTInterfaceType() override = default; const char *GetKindName() const override { return "InterfaceType"; } static bool classof(const GoASTNode *n) { return n->GetKind() == eInterfaceType; } const GoASTFieldList *GetMethods() const { return m_methods_up.get(); } void SetMethods(GoASTFieldList *methods) { m_methods_up.reset(methods); } private: friend class GoASTNode; std::unique_ptr m_methods_up; GoASTInterfaceType(const GoASTInterfaceType &) = delete; const GoASTInterfaceType &operator=(const GoASTInterfaceType &) = delete; }; class GoASTKeyValueExpr : public GoASTExpr { public: GoASTKeyValueExpr(GoASTExpr *key, GoASTExpr *value) : GoASTExpr(eKeyValueExpr), m_key_up(key), m_value_up(value) {} ~GoASTKeyValueExpr() override = default; const char *GetKindName() const override { return "KeyValueExpr"; } static bool classof(const GoASTNode *n) { return n->GetKind() == eKeyValueExpr; } const GoASTExpr *GetKey() const { return m_key_up.get(); } void SetKey(GoASTExpr *key) { m_key_up.reset(key); } const GoASTExpr *GetValue() const { return m_value_up.get(); } void SetValue(GoASTExpr *value) { m_value_up.reset(value); } private: friend class GoASTNode; std::unique_ptr m_key_up; std::unique_ptr m_value_up; GoASTKeyValueExpr(const GoASTKeyValueExpr &) = delete; const GoASTKeyValueExpr &operator=(const GoASTKeyValueExpr &) = delete; }; class GoASTLabeledStmt : public GoASTStmt { public: GoASTLabeledStmt(GoASTIdent *label, GoASTStmt *stmt) : GoASTStmt(eLabeledStmt), m_label_up(label), m_stmt_up(stmt) {} ~GoASTLabeledStmt() override = default; const char *GetKindName() const override { return "LabeledStmt"; } static bool classof(const GoASTNode *n) { return n->GetKind() == eLabeledStmt; } const GoASTIdent *GetLabel() const { return m_label_up.get(); } void SetLabel(GoASTIdent *label) { m_label_up.reset(label); } const GoASTStmt *GetStmt() const { return m_stmt_up.get(); } void SetStmt(GoASTStmt *stmt) { m_stmt_up.reset(stmt); } private: friend class GoASTNode; std::unique_ptr m_label_up; std::unique_ptr m_stmt_up; GoASTLabeledStmt(const GoASTLabeledStmt &) = delete; const GoASTLabeledStmt &operator=(const GoASTLabeledStmt &) = delete; }; class GoASTMapType : public GoASTExpr { public: GoASTMapType(GoASTExpr *key, GoASTExpr *value) : GoASTExpr(eMapType), m_key_up(key), m_value_up(value) {} ~GoASTMapType() override = default; const char *GetKindName() const override { return "MapType"; } static bool classof(const GoASTNode *n) { return n->GetKind() == eMapType; } const GoASTExpr *GetKey() const { return m_key_up.get(); } void SetKey(GoASTExpr *key) { m_key_up.reset(key); } const GoASTExpr *GetValue() const { return m_value_up.get(); } void SetValue(GoASTExpr *value) { m_value_up.reset(value); } private: friend class GoASTNode; std::unique_ptr m_key_up; std::unique_ptr m_value_up; GoASTMapType(const GoASTMapType &) = delete; const GoASTMapType &operator=(const GoASTMapType &) = delete; }; class GoASTParenExpr : public GoASTExpr { public: explicit GoASTParenExpr(GoASTExpr *x) : GoASTExpr(eParenExpr), m_x_up(x) {} ~GoASTParenExpr() override = default; const char *GetKindName() const override { return "ParenExpr"; } static bool classof(const GoASTNode *n) { return n->GetKind() == eParenExpr; } const GoASTExpr *GetX() const { return m_x_up.get(); } void SetX(GoASTExpr *x) { m_x_up.reset(x); } private: friend class GoASTNode; std::unique_ptr m_x_up; GoASTParenExpr(const GoASTParenExpr &) = delete; const GoASTParenExpr &operator=(const GoASTParenExpr &) = delete; }; class GoASTRangeStmt : public GoASTStmt { public: GoASTRangeStmt(GoASTExpr *key, GoASTExpr *value, bool define, GoASTExpr *x, GoASTBlockStmt *body) : GoASTStmt(eRangeStmt), m_key_up(key), m_value_up(value), m_define(define), m_x_up(x), m_body_up(body) {} ~GoASTRangeStmt() override = default; const char *GetKindName() const override { return "RangeStmt"; } static bool classof(const GoASTNode *n) { return n->GetKind() == eRangeStmt; } const GoASTExpr *GetKey() const { return m_key_up.get(); } void SetKey(GoASTExpr *key) { m_key_up.reset(key); } const GoASTExpr *GetValue() const { return m_value_up.get(); } void SetValue(GoASTExpr *value) { m_value_up.reset(value); } bool GetDefine() const { return m_define; } void SetDefine(bool define) { m_define = define; } const GoASTExpr *GetX() const { return m_x_up.get(); } void SetX(GoASTExpr *x) { m_x_up.reset(x); } const GoASTBlockStmt *GetBody() const { return m_body_up.get(); } void SetBody(GoASTBlockStmt *body) { m_body_up.reset(body); } private: friend class GoASTNode; std::unique_ptr m_key_up; std::unique_ptr m_value_up; bool m_define; std::unique_ptr m_x_up; std::unique_ptr m_body_up; GoASTRangeStmt(const GoASTRangeStmt &) = delete; const GoASTRangeStmt &operator=(const GoASTRangeStmt &) = delete; }; class GoASTReturnStmt : public GoASTStmt { public: GoASTReturnStmt() : GoASTStmt(eReturnStmt) {} ~GoASTReturnStmt() override = default; const char *GetKindName() const override { return "ReturnStmt"; } static bool classof(const GoASTNode *n) { return n->GetKind() == eReturnStmt; } size_t NumResults() const { return m_results.size(); } const GoASTExpr *GetResults(int i) const { return m_results[i].get(); } void AddResults(GoASTExpr *results) { m_results.push_back(std::unique_ptr(results)); } private: friend class GoASTNode; std::vector> m_results; GoASTReturnStmt(const GoASTReturnStmt &) = delete; const GoASTReturnStmt &operator=(const GoASTReturnStmt &) = delete; }; class GoASTSelectStmt : public GoASTStmt { public: explicit GoASTSelectStmt(GoASTBlockStmt *body) : GoASTStmt(eSelectStmt), m_body_up(body) {} ~GoASTSelectStmt() override = default; const char *GetKindName() const override { return "SelectStmt"; } static bool classof(const GoASTNode *n) { return n->GetKind() == eSelectStmt; } const GoASTBlockStmt *GetBody() const { return m_body_up.get(); } void SetBody(GoASTBlockStmt *body) { m_body_up.reset(body); } private: friend class GoASTNode; std::unique_ptr m_body_up; GoASTSelectStmt(const GoASTSelectStmt &) = delete; const GoASTSelectStmt &operator=(const GoASTSelectStmt &) = delete; }; class GoASTSelectorExpr : public GoASTExpr { public: GoASTSelectorExpr(GoASTExpr *x, GoASTIdent *sel) : GoASTExpr(eSelectorExpr), m_x_up(x), m_sel_up(sel) {} ~GoASTSelectorExpr() override = default; const char *GetKindName() const override { return "SelectorExpr"; } static bool classof(const GoASTNode *n) { return n->GetKind() == eSelectorExpr; } const GoASTExpr *GetX() const { return m_x_up.get(); } void SetX(GoASTExpr *x) { m_x_up.reset(x); } const GoASTIdent *GetSel() const { return m_sel_up.get(); } void SetSel(GoASTIdent *sel) { m_sel_up.reset(sel); } private: friend class GoASTNode; std::unique_ptr m_x_up; std::unique_ptr m_sel_up; GoASTSelectorExpr(const GoASTSelectorExpr &) = delete; const GoASTSelectorExpr &operator=(const GoASTSelectorExpr &) = delete; }; class GoASTSendStmt : public GoASTStmt { public: GoASTSendStmt(GoASTExpr *chan, GoASTExpr *value) : GoASTStmt(eSendStmt), m_chan_up(chan), m_value_up(value) {} ~GoASTSendStmt() override = default; const char *GetKindName() const override { return "SendStmt"; } static bool classof(const GoASTNode *n) { return n->GetKind() == eSendStmt; } const GoASTExpr *GetChan() const { return m_chan_up.get(); } void SetChan(GoASTExpr *chan) { m_chan_up.reset(chan); } const GoASTExpr *GetValue() const { return m_value_up.get(); } void SetValue(GoASTExpr *value) { m_value_up.reset(value); } private: friend class GoASTNode; std::unique_ptr m_chan_up; std::unique_ptr m_value_up; GoASTSendStmt(const GoASTSendStmt &) = delete; const GoASTSendStmt &operator=(const GoASTSendStmt &) = delete; }; class GoASTSliceExpr : public GoASTExpr { public: GoASTSliceExpr(GoASTExpr *x, GoASTExpr *low, GoASTExpr *high, GoASTExpr *max, bool slice3) : GoASTExpr(eSliceExpr), m_x_up(x), m_low_up(low), m_high_up(high), m_max_up(max), m_slice3(slice3) {} ~GoASTSliceExpr() override = default; const char *GetKindName() const override { return "SliceExpr"; } static bool classof(const GoASTNode *n) { return n->GetKind() == eSliceExpr; } const GoASTExpr *GetX() const { return m_x_up.get(); } void SetX(GoASTExpr *x) { m_x_up.reset(x); } const GoASTExpr *GetLow() const { return m_low_up.get(); } void SetLow(GoASTExpr *low) { m_low_up.reset(low); } const GoASTExpr *GetHigh() const { return m_high_up.get(); } void SetHigh(GoASTExpr *high) { m_high_up.reset(high); } const GoASTExpr *GetMax() const { return m_max_up.get(); } void SetMax(GoASTExpr *max) { m_max_up.reset(max); } bool GetSlice3() const { return m_slice3; } void SetSlice3(bool slice3) { m_slice3 = slice3; } private: friend class GoASTNode; std::unique_ptr m_x_up; std::unique_ptr m_low_up; std::unique_ptr m_high_up; std::unique_ptr m_max_up; bool m_slice3; GoASTSliceExpr(const GoASTSliceExpr &) = delete; const GoASTSliceExpr &operator=(const GoASTSliceExpr &) = delete; }; class GoASTStarExpr : public GoASTExpr { public: explicit GoASTStarExpr(GoASTExpr *x) : GoASTExpr(eStarExpr), m_x_up(x) {} ~GoASTStarExpr() override = default; const char *GetKindName() const override { return "StarExpr"; } static bool classof(const GoASTNode *n) { return n->GetKind() == eStarExpr; } const GoASTExpr *GetX() const { return m_x_up.get(); } void SetX(GoASTExpr *x) { m_x_up.reset(x); } private: friend class GoASTNode; std::unique_ptr m_x_up; GoASTStarExpr(const GoASTStarExpr &) = delete; const GoASTStarExpr &operator=(const GoASTStarExpr &) = delete; }; class GoASTStructType : public GoASTExpr { public: explicit GoASTStructType(GoASTFieldList *fields) : GoASTExpr(eStructType), m_fields_up(fields) {} ~GoASTStructType() override = default; const char *GetKindName() const override { return "StructType"; } static bool classof(const GoASTNode *n) { return n->GetKind() == eStructType; } const GoASTFieldList *GetFields() const { return m_fields_up.get(); } void SetFields(GoASTFieldList *fields) { m_fields_up.reset(fields); } private: friend class GoASTNode; std::unique_ptr m_fields_up; GoASTStructType(const GoASTStructType &) = delete; const GoASTStructType &operator=(const GoASTStructType &) = delete; }; class GoASTSwitchStmt : public GoASTStmt { public: GoASTSwitchStmt(GoASTStmt *init, GoASTExpr *tag, GoASTBlockStmt *body) : GoASTStmt(eSwitchStmt), m_init_up(init), m_tag_up(tag), m_body_up(body) {} ~GoASTSwitchStmt() override = default; const char *GetKindName() const override { return "SwitchStmt"; } static bool classof(const GoASTNode *n) { return n->GetKind() == eSwitchStmt; } const GoASTStmt *GetInit() const { return m_init_up.get(); } void SetInit(GoASTStmt *init) { m_init_up.reset(init); } const GoASTExpr *GetTag() const { return m_tag_up.get(); } void SetTag(GoASTExpr *tag) { m_tag_up.reset(tag); } const GoASTBlockStmt *GetBody() const { return m_body_up.get(); } void SetBody(GoASTBlockStmt *body) { m_body_up.reset(body); } private: friend class GoASTNode; std::unique_ptr m_init_up; std::unique_ptr m_tag_up; std::unique_ptr m_body_up; GoASTSwitchStmt(const GoASTSwitchStmt &) = delete; const GoASTSwitchStmt &operator=(const GoASTSwitchStmt &) = delete; }; class GoASTTypeAssertExpr : public GoASTExpr { public: GoASTTypeAssertExpr(GoASTExpr *x, GoASTExpr *type) : GoASTExpr(eTypeAssertExpr), m_x_up(x), m_type_up(type) {} ~GoASTTypeAssertExpr() override = default; const char *GetKindName() const override { return "TypeAssertExpr"; } static bool classof(const GoASTNode *n) { return n->GetKind() == eTypeAssertExpr; } const GoASTExpr *GetX() const { return m_x_up.get(); } void SetX(GoASTExpr *x) { m_x_up.reset(x); } const GoASTExpr *GetType() const { return m_type_up.get(); } void SetType(GoASTExpr *type) { m_type_up.reset(type); } private: friend class GoASTNode; std::unique_ptr m_x_up; std::unique_ptr m_type_up; GoASTTypeAssertExpr(const GoASTTypeAssertExpr &) = delete; const GoASTTypeAssertExpr &operator=(const GoASTTypeAssertExpr &) = delete; }; class GoASTTypeSpec : public GoASTSpec { public: GoASTTypeSpec(GoASTIdent *name, GoASTExpr *type) : GoASTSpec(eTypeSpec), m_name_up(name), m_type_up(type) {} ~GoASTTypeSpec() override = default; const char *GetKindName() const override { return "TypeSpec"; } static bool classof(const GoASTNode *n) { return n->GetKind() == eTypeSpec; } const GoASTIdent *GetName() const { return m_name_up.get(); } void SetName(GoASTIdent *name) { m_name_up.reset(name); } const GoASTExpr *GetType() const { return m_type_up.get(); } void SetType(GoASTExpr *type) { m_type_up.reset(type); } private: friend class GoASTNode; std::unique_ptr m_name_up; std::unique_ptr m_type_up; GoASTTypeSpec(const GoASTTypeSpec &) = delete; const GoASTTypeSpec &operator=(const GoASTTypeSpec &) = delete; }; class GoASTTypeSwitchStmt : public GoASTStmt { public: GoASTTypeSwitchStmt(GoASTStmt *init, GoASTStmt *assign, GoASTBlockStmt *body) : GoASTStmt(eTypeSwitchStmt), m_init_up(init), m_assign_up(assign), m_body_up(body) {} ~GoASTTypeSwitchStmt() override = default; const char *GetKindName() const override { return "TypeSwitchStmt"; } static bool classof(const GoASTNode *n) { return n->GetKind() == eTypeSwitchStmt; } const GoASTStmt *GetInit() const { return m_init_up.get(); } void SetInit(GoASTStmt *init) { m_init_up.reset(init); } const GoASTStmt *GetAssign() const { return m_assign_up.get(); } void SetAssign(GoASTStmt *assign) { m_assign_up.reset(assign); } const GoASTBlockStmt *GetBody() const { return m_body_up.get(); } void SetBody(GoASTBlockStmt *body) { m_body_up.reset(body); } private: friend class GoASTNode; std::unique_ptr m_init_up; std::unique_ptr m_assign_up; std::unique_ptr m_body_up; GoASTTypeSwitchStmt(const GoASTTypeSwitchStmt &) = delete; const GoASTTypeSwitchStmt &operator=(const GoASTTypeSwitchStmt &) = delete; }; class GoASTUnaryExpr : public GoASTExpr { public: GoASTUnaryExpr(TokenType op, GoASTExpr *x) : GoASTExpr(eUnaryExpr), m_op(op), m_x_up(x) {} ~GoASTUnaryExpr() override = default; const char *GetKindName() const override { return "UnaryExpr"; } static bool classof(const GoASTNode *n) { return n->GetKind() == eUnaryExpr; } TokenType GetOp() const { return m_op; } void SetOp(TokenType op) { m_op = op; } const GoASTExpr *GetX() const { return m_x_up.get(); } void SetX(GoASTExpr *x) { m_x_up.reset(x); } private: friend class GoASTNode; TokenType m_op; std::unique_ptr m_x_up; GoASTUnaryExpr(const GoASTUnaryExpr &) = delete; const GoASTUnaryExpr &operator=(const GoASTUnaryExpr &) = delete; }; class GoASTValueSpec : public GoASTSpec { public: GoASTValueSpec() : GoASTSpec(eValueSpec) {} ~GoASTValueSpec() override = default; const char *GetKindName() const override { return "ValueSpec"; } static bool classof(const GoASTNode *n) { return n->GetKind() == eValueSpec; } size_t NumNames() const { return m_names.size(); } const GoASTIdent *GetNames(int i) const { return m_names[i].get(); } void AddNames(GoASTIdent *names) { m_names.push_back(std::unique_ptr(names)); } const GoASTExpr *GetType() const { return m_type_up.get(); } void SetType(GoASTExpr *type) { m_type_up.reset(type); } size_t NumValues() const { return m_values.size(); } const GoASTExpr *GetValues(int i) const { return m_values[i].get(); } void AddValues(GoASTExpr *values) { m_values.push_back(std::unique_ptr(values)); } private: friend class GoASTNode; std::vector> m_names; std::unique_ptr m_type_up; std::vector> m_values; GoASTValueSpec(const GoASTValueSpec &) = delete; const GoASTValueSpec &operator=(const GoASTValueSpec &) = delete; }; template R GoASTDecl::Visit(V *v) const { switch (GetKind()) { case eBadDecl: return v->VisitBadDecl(llvm::cast(this)); case eFuncDecl: return v->VisitFuncDecl(llvm::cast(this)); case eGenDecl: return v->VisitGenDecl(llvm::cast(this)); default: assert(false && "Invalid kind"); } } template R GoASTExpr::Visit(V *v) const { switch (GetKind()) { case eArrayType: return v->VisitArrayType(llvm::cast(this)); case eBadExpr: return v->VisitBadExpr(llvm::cast(this)); case eBasicLit: return v->VisitBasicLit(llvm::cast(this)); case eBinaryExpr: return v->VisitBinaryExpr(llvm::cast(this)); case eIdent: return v->VisitIdent(llvm::cast(this)); case eCallExpr: return v->VisitCallExpr(llvm::cast(this)); case eChanType: return v->VisitChanType(llvm::cast(this)); case eCompositeLit: return v->VisitCompositeLit(llvm::cast(this)); case eEllipsis: return v->VisitEllipsis(llvm::cast(this)); case eFuncType: return v->VisitFuncType(llvm::cast(this)); case eFuncLit: return v->VisitFuncLit(llvm::cast(this)); case eIndexExpr: return v->VisitIndexExpr(llvm::cast(this)); case eInterfaceType: return v->VisitInterfaceType(llvm::cast(this)); case eKeyValueExpr: return v->VisitKeyValueExpr(llvm::cast(this)); case eMapType: return v->VisitMapType(llvm::cast(this)); case eParenExpr: return v->VisitParenExpr(llvm::cast(this)); case eSelectorExpr: return v->VisitSelectorExpr(llvm::cast(this)); case eSliceExpr: return v->VisitSliceExpr(llvm::cast(this)); case eStarExpr: return v->VisitStarExpr(llvm::cast(this)); case eStructType: return v->VisitStructType(llvm::cast(this)); case eTypeAssertExpr: return v->VisitTypeAssertExpr(llvm::cast(this)); case eUnaryExpr: return v->VisitUnaryExpr(llvm::cast(this)); default: assert(false && "Invalid kind"); return R(); } } template R GoASTSpec::Visit(V *v) const { switch (GetKind()) { case eImportSpec: return v->VisitImportSpec(llvm::cast(this)); case eTypeSpec: return v->VisitTypeSpec(llvm::cast(this)); case eValueSpec: return v->VisitValueSpec(llvm::cast(this)); default: assert(false && "Invalid kind"); } } template R GoASTStmt::Visit(V *v) const { switch (GetKind()) { case eAssignStmt: return v->VisitAssignStmt(llvm::cast(this)); case eBadStmt: return v->VisitBadStmt(llvm::cast(this)); case eBlockStmt: return v->VisitBlockStmt(llvm::cast(this)); case eBranchStmt: return v->VisitBranchStmt(llvm::cast(this)); case eCaseClause: return v->VisitCaseClause(llvm::cast(this)); case eCommClause: return v->VisitCommClause(llvm::cast(this)); case eDeclStmt: return v->VisitDeclStmt(llvm::cast(this)); case eDeferStmt: return v->VisitDeferStmt(llvm::cast(this)); case eEmptyStmt: return v->VisitEmptyStmt(llvm::cast(this)); case eExprStmt: return v->VisitExprStmt(llvm::cast(this)); case eForStmt: return v->VisitForStmt(llvm::cast(this)); case eGoStmt: return v->VisitGoStmt(llvm::cast(this)); case eIfStmt: return v->VisitIfStmt(llvm::cast(this)); case eIncDecStmt: return v->VisitIncDecStmt(llvm::cast(this)); case eLabeledStmt: return v->VisitLabeledStmt(llvm::cast(this)); case eRangeStmt: return v->VisitRangeStmt(llvm::cast(this)); case eReturnStmt: return v->VisitReturnStmt(llvm::cast(this)); case eSelectStmt: return v->VisitSelectStmt(llvm::cast(this)); case eSendStmt: return v->VisitSendStmt(llvm::cast(this)); case eSwitchStmt: return v->VisitSwitchStmt(llvm::cast(this)); case eTypeSwitchStmt: return v->VisitTypeSwitchStmt(llvm::cast(this)); default: assert(false && "Invalid kind"); } } template void GoASTNode::WalkChildren(V &v) { switch (m_kind) { case eArrayType: { GoASTArrayType *n = llvm::cast(this); (void)n; v(n->m_len_up.get()); v(n->m_elt_up.get()); return; } case eAssignStmt: { GoASTAssignStmt *n = llvm::cast(this); (void)n; for (auto &e : n->m_lhs) { v(e.get()); } for (auto &e : n->m_rhs) { v(e.get()); } return; } case eBasicLit: { GoASTBasicLit *n = llvm::cast(this); (void)n; return; } case eBinaryExpr: { GoASTBinaryExpr *n = llvm::cast(this); (void)n; v(n->m_x_up.get()); v(n->m_y_up.get()); return; } case eBlockStmt: { GoASTBlockStmt *n = llvm::cast(this); (void)n; for (auto &e : n->m_list) { v(e.get()); } return; } case eIdent: { GoASTIdent *n = llvm::cast(this); (void)n; return; } case eBranchStmt: { GoASTBranchStmt *n = llvm::cast(this); (void)n; v(n->m_label_up.get()); return; } case eCallExpr: { GoASTCallExpr *n = llvm::cast(this); (void)n; v(n->m_fun_up.get()); for (auto &e : n->m_args) { v(e.get()); } return; } case eCaseClause: { GoASTCaseClause *n = llvm::cast(this); (void)n; for (auto &e : n->m_list) { v(e.get()); } for (auto &e : n->m_body) { v(e.get()); } return; } case eChanType: { GoASTChanType *n = llvm::cast(this); (void)n; v(n->m_value_up.get()); return; } case eCommClause: { GoASTCommClause *n = llvm::cast(this); (void)n; v(n->m_comm_up.get()); for (auto &e : n->m_body) { v(e.get()); } return; } case eCompositeLit: { GoASTCompositeLit *n = llvm::cast(this); (void)n; v(n->m_type_up.get()); for (auto &e : n->m_elts) { v(e.get()); } return; } case eDeclStmt: { GoASTDeclStmt *n = llvm::cast(this); (void)n; v(n->m_decl_up.get()); return; } case eDeferStmt: { GoASTDeferStmt *n = llvm::cast(this); (void)n; v(n->m_call_up.get()); return; } case eEllipsis: { GoASTEllipsis *n = llvm::cast(this); (void)n; v(n->m_elt_up.get()); return; } case eExprStmt: { GoASTExprStmt *n = llvm::cast(this); (void)n; v(n->m_x_up.get()); return; } case eField: { GoASTField *n = llvm::cast(this); (void)n; for (auto &e : n->m_names) { v(e.get()); } v(n->m_type_up.get()); v(n->m_tag_up.get()); return; } case eFieldList: { GoASTFieldList *n = llvm::cast(this); (void)n; for (auto &e : n->m_list) { v(e.get()); } return; } case eForStmt: { GoASTForStmt *n = llvm::cast(this); (void)n; v(n->m_init_up.get()); v(n->m_cond_up.get()); v(n->m_post_up.get()); v(n->m_body_up.get()); return; } case eFuncType: { GoASTFuncType *n = llvm::cast(this); (void)n; v(n->m_params_up.get()); v(n->m_results_up.get()); return; } case eFuncDecl: { GoASTFuncDecl *n = llvm::cast(this); (void)n; v(n->m_recv_up.get()); v(n->m_name_up.get()); v(n->m_type_up.get()); v(n->m_body_up.get()); return; } case eFuncLit: { GoASTFuncLit *n = llvm::cast(this); (void)n; v(n->m_type_up.get()); v(n->m_body_up.get()); return; } case eGenDecl: { GoASTGenDecl *n = llvm::cast(this); (void)n; for (auto &e : n->m_specs) { v(e.get()); } return; } case eGoStmt: { GoASTGoStmt *n = llvm::cast(this); (void)n; v(n->m_call_up.get()); return; } case eIfStmt: { GoASTIfStmt *n = llvm::cast(this); (void)n; v(n->m_init_up.get()); v(n->m_cond_up.get()); v(n->m_body_up.get()); v(n->m_els_up.get()); return; } case eImportSpec: { GoASTImportSpec *n = llvm::cast(this); (void)n; v(n->m_name_up.get()); v(n->m_path_up.get()); return; } case eIncDecStmt: { GoASTIncDecStmt *n = llvm::cast(this); (void)n; v(n->m_x_up.get()); return; } case eIndexExpr: { GoASTIndexExpr *n = llvm::cast(this); (void)n; v(n->m_x_up.get()); v(n->m_index_up.get()); return; } case eInterfaceType: { GoASTInterfaceType *n = llvm::cast(this); (void)n; v(n->m_methods_up.get()); return; } case eKeyValueExpr: { GoASTKeyValueExpr *n = llvm::cast(this); (void)n; v(n->m_key_up.get()); v(n->m_value_up.get()); return; } case eLabeledStmt: { GoASTLabeledStmt *n = llvm::cast(this); (void)n; v(n->m_label_up.get()); v(n->m_stmt_up.get()); return; } case eMapType: { GoASTMapType *n = llvm::cast(this); (void)n; v(n->m_key_up.get()); v(n->m_value_up.get()); return; } case eParenExpr: { GoASTParenExpr *n = llvm::cast(this); (void)n; v(n->m_x_up.get()); return; } case eRangeStmt: { GoASTRangeStmt *n = llvm::cast(this); (void)n; v(n->m_key_up.get()); v(n->m_value_up.get()); v(n->m_x_up.get()); v(n->m_body_up.get()); return; } case eReturnStmt: { GoASTReturnStmt *n = llvm::cast(this); (void)n; for (auto &e : n->m_results) { v(e.get()); } return; } case eSelectStmt: { GoASTSelectStmt *n = llvm::cast(this); (void)n; v(n->m_body_up.get()); return; } case eSelectorExpr: { GoASTSelectorExpr *n = llvm::cast(this); (void)n; v(n->m_x_up.get()); v(n->m_sel_up.get()); return; } case eSendStmt: { GoASTSendStmt *n = llvm::cast(this); (void)n; v(n->m_chan_up.get()); v(n->m_value_up.get()); return; } case eSliceExpr: { GoASTSliceExpr *n = llvm::cast(this); (void)n; v(n->m_x_up.get()); v(n->m_low_up.get()); v(n->m_high_up.get()); v(n->m_max_up.get()); return; } case eStarExpr: { GoASTStarExpr *n = llvm::cast(this); (void)n; v(n->m_x_up.get()); return; } case eStructType: { GoASTStructType *n = llvm::cast(this); (void)n; v(n->m_fields_up.get()); return; } case eSwitchStmt: { GoASTSwitchStmt *n = llvm::cast(this); (void)n; v(n->m_init_up.get()); v(n->m_tag_up.get()); v(n->m_body_up.get()); return; } case eTypeAssertExpr: { GoASTTypeAssertExpr *n = llvm::cast(this); (void)n; v(n->m_x_up.get()); v(n->m_type_up.get()); return; } case eTypeSpec: { GoASTTypeSpec *n = llvm::cast(this); (void)n; v(n->m_name_up.get()); v(n->m_type_up.get()); return; } case eTypeSwitchStmt: { GoASTTypeSwitchStmt *n = llvm::cast(this); (void)n; v(n->m_init_up.get()); v(n->m_assign_up.get()); v(n->m_body_up.get()); return; } case eUnaryExpr: { GoASTUnaryExpr *n = llvm::cast(this); (void)n; v(n->m_x_up.get()); return; } case eValueSpec: { GoASTValueSpec *n = llvm::cast(this); (void)n; for (auto &e : n->m_names) { v(e.get()); } v(n->m_type_up.get()); for (auto &e : n->m_values) { v(e.get()); } return; } case eEmptyStmt: case eBadDecl: case eBadExpr: case eBadStmt: break; } } } // namespace lldb_private #endif