| //===-- 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 "lldb/lldb-forward.h" |
| #include "lldb/lldb-private.h" |
| #include "llvm/Support/Casting.h" |
| #include "Plugins/ExpressionParser/Go/GoLexer.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 <typename V> 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 <typename R, typename V> 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 <typename R, typename V> 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 <typename R, typename V> 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 <typename R, typename V> 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<GoASTExpr> m_len_up; |
| std::unique_ptr<GoASTExpr> 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<GoASTExpr>(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<GoASTExpr>(rhs)); |
| } |
| |
| bool |
| GetDefine() const |
| { |
| return m_define; |
| } |
| void |
| SetDefine(bool define) |
| { |
| m_define = define; |
| } |
| |
| private: |
| friend class GoASTNode; |
| std::vector<std::unique_ptr<GoASTExpr> > m_lhs; |
| std::vector<std::unique_ptr<GoASTExpr> > 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<GoASTExpr> m_x_up; |
| std::unique_ptr<GoASTExpr> 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<GoASTStmt>(list)); |
| } |
| |
| private: |
| friend class GoASTNode; |
| std::vector<std::unique_ptr<GoASTStmt> > 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<GoASTIdent> 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<GoASTExpr>(args)); |
| } |
| |
| bool |
| GetEllipsis() const |
| { |
| return m_ellipsis; |
| } |
| void |
| SetEllipsis(bool ellipsis) |
| { |
| m_ellipsis = ellipsis; |
| } |
| |
| private: |
| friend class GoASTNode; |
| std::unique_ptr<GoASTExpr> m_fun_up; |
| std::vector<std::unique_ptr<GoASTExpr> > 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<GoASTExpr>(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<GoASTStmt>(body)); |
| } |
| |
| private: |
| friend class GoASTNode; |
| std::vector<std::unique_ptr<GoASTExpr> > m_list; |
| std::vector<std::unique_ptr<GoASTStmt> > 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<GoASTExpr> 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<GoASTStmt>(body)); |
| } |
| |
| private: |
| friend class GoASTNode; |
| std::unique_ptr<GoASTStmt> m_comm_up; |
| std::vector<std::unique_ptr<GoASTStmt> > 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<GoASTExpr>(elts)); |
| } |
| |
| private: |
| friend class GoASTNode; |
| std::unique_ptr<GoASTExpr> m_type_up; |
| std::vector<std::unique_ptr<GoASTExpr> > 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<GoASTDecl> 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<GoASTCallExpr> 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<GoASTExpr> 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<GoASTExpr> 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<GoASTIdent>(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<std::unique_ptr<GoASTIdent> > m_names; |
| std::unique_ptr<GoASTExpr> m_type_up; |
| std::unique_ptr<GoASTBasicLit> 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<GoASTField>(list)); |
| } |
| |
| private: |
| friend class GoASTNode; |
| std::vector<std::unique_ptr<GoASTField> > 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<GoASTStmt> m_init_up; |
| std::unique_ptr<GoASTExpr> m_cond_up; |
| std::unique_ptr<GoASTStmt> m_post_up; |
| std::unique_ptr<GoASTBlockStmt> 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<GoASTFieldList> m_params_up; |
| std::unique_ptr<GoASTFieldList> 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<GoASTFieldList> m_recv_up; |
| std::unique_ptr<GoASTIdent> m_name_up; |
| std::unique_ptr<GoASTFuncType> m_type_up; |
| std::unique_ptr<GoASTBlockStmt> 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<GoASTFuncType> m_type_up; |
| std::unique_ptr<GoASTBlockStmt> 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<GoASTSpec>(specs)); |
| } |
| |
| private: |
| friend class GoASTNode; |
| TokenType m_tok; |
| std::vector<std::unique_ptr<GoASTSpec> > 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<GoASTCallExpr> 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<GoASTStmt> m_init_up; |
| std::unique_ptr<GoASTExpr> m_cond_up; |
| std::unique_ptr<GoASTBlockStmt> m_body_up; |
| std::unique_ptr<GoASTStmt> 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<GoASTIdent> m_name_up; |
| std::unique_ptr<GoASTBasicLit> 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<GoASTExpr> 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<GoASTExpr> m_x_up; |
| std::unique_ptr<GoASTExpr> 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<GoASTFieldList> 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<GoASTExpr> m_key_up; |
| std::unique_ptr<GoASTExpr> 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<GoASTIdent> m_label_up; |
| std::unique_ptr<GoASTStmt> 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<GoASTExpr> m_key_up; |
| std::unique_ptr<GoASTExpr> 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<GoASTExpr> 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<GoASTExpr> m_key_up; |
| std::unique_ptr<GoASTExpr> m_value_up; |
| bool m_define; |
| std::unique_ptr<GoASTExpr> m_x_up; |
| std::unique_ptr<GoASTBlockStmt> 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<GoASTExpr>(results)); |
| } |
| |
| private: |
| friend class GoASTNode; |
| std::vector<std::unique_ptr<GoASTExpr> > 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<GoASTBlockStmt> 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<GoASTExpr> m_x_up; |
| std::unique_ptr<GoASTIdent> 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<GoASTExpr> m_chan_up; |
| std::unique_ptr<GoASTExpr> 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<GoASTExpr> m_x_up; |
| std::unique_ptr<GoASTExpr> m_low_up; |
| std::unique_ptr<GoASTExpr> m_high_up; |
| std::unique_ptr<GoASTExpr> 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<GoASTExpr> 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<GoASTFieldList> 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<GoASTStmt> m_init_up; |
| std::unique_ptr<GoASTExpr> m_tag_up; |
| std::unique_ptr<GoASTBlockStmt> 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<GoASTExpr> m_x_up; |
| std::unique_ptr<GoASTExpr> 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<GoASTIdent> m_name_up; |
| std::unique_ptr<GoASTExpr> 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<GoASTStmt> m_init_up; |
| std::unique_ptr<GoASTStmt> m_assign_up; |
| std::unique_ptr<GoASTBlockStmt> 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<GoASTExpr> 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<GoASTIdent>(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<GoASTExpr>(values)); |
| } |
| |
| private: |
| friend class GoASTNode; |
| std::vector<std::unique_ptr<GoASTIdent> > m_names; |
| std::unique_ptr<GoASTExpr> m_type_up; |
| std::vector<std::unique_ptr<GoASTExpr> > m_values; |
| |
| GoASTValueSpec(const GoASTValueSpec &) = delete; |
| const GoASTValueSpec &operator=(const GoASTValueSpec &) = delete; |
| }; |
| |
| |
| template <typename R, typename V> |
| R GoASTDecl::Visit(V* v) const |
| { |
| switch(GetKind()) |
| { |
| case eBadDecl: |
| return v->VisitBadDecl(llvm::cast<const GoASTBadDecl>(this)); |
| case eFuncDecl: |
| return v->VisitFuncDecl(llvm::cast<const GoASTFuncDecl>(this)); |
| case eGenDecl: |
| return v->VisitGenDecl(llvm::cast<const GoASTGenDecl>(this)); |
| default: |
| assert(false && "Invalid kind"); |
| } |
| } |
| |
| template <typename R, typename V> |
| R GoASTExpr::Visit(V* v) const |
| { |
| switch(GetKind()) |
| { |
| case eArrayType: |
| return v->VisitArrayType(llvm::cast<const GoASTArrayType>(this)); |
| case eBadExpr: |
| return v->VisitBadExpr(llvm::cast<const GoASTBadExpr>(this)); |
| case eBasicLit: |
| return v->VisitBasicLit(llvm::cast<const GoASTBasicLit>(this)); |
| case eBinaryExpr: |
| return v->VisitBinaryExpr(llvm::cast<const GoASTBinaryExpr>(this)); |
| case eIdent: |
| return v->VisitIdent(llvm::cast<const GoASTIdent>(this)); |
| case eCallExpr: |
| return v->VisitCallExpr(llvm::cast<const GoASTCallExpr>(this)); |
| case eChanType: |
| return v->VisitChanType(llvm::cast<const GoASTChanType>(this)); |
| case eCompositeLit: |
| return v->VisitCompositeLit(llvm::cast<const GoASTCompositeLit>(this)); |
| case eEllipsis: |
| return v->VisitEllipsis(llvm::cast<const GoASTEllipsis>(this)); |
| case eFuncType: |
| return v->VisitFuncType(llvm::cast<const GoASTFuncType>(this)); |
| case eFuncLit: |
| return v->VisitFuncLit(llvm::cast<const GoASTFuncLit>(this)); |
| case eIndexExpr: |
| return v->VisitIndexExpr(llvm::cast<const GoASTIndexExpr>(this)); |
| case eInterfaceType: |
| return v->VisitInterfaceType(llvm::cast<const GoASTInterfaceType>(this)); |
| case eKeyValueExpr: |
| return v->VisitKeyValueExpr(llvm::cast<const GoASTKeyValueExpr>(this)); |
| case eMapType: |
| return v->VisitMapType(llvm::cast<const GoASTMapType>(this)); |
| case eParenExpr: |
| return v->VisitParenExpr(llvm::cast<const GoASTParenExpr>(this)); |
| case eSelectorExpr: |
| return v->VisitSelectorExpr(llvm::cast<const GoASTSelectorExpr>(this)); |
| case eSliceExpr: |
| return v->VisitSliceExpr(llvm::cast<const GoASTSliceExpr>(this)); |
| case eStarExpr: |
| return v->VisitStarExpr(llvm::cast<const GoASTStarExpr>(this)); |
| case eStructType: |
| return v->VisitStructType(llvm::cast<const GoASTStructType>(this)); |
| case eTypeAssertExpr: |
| return v->VisitTypeAssertExpr(llvm::cast<const GoASTTypeAssertExpr>(this)); |
| case eUnaryExpr: |
| return v->VisitUnaryExpr(llvm::cast<const GoASTUnaryExpr>(this)); |
| default: |
| assert(false && "Invalid kind"); |
| return R(); |
| } |
| } |
| |
| template <typename R, typename V> |
| R GoASTSpec::Visit(V* v) const |
| { |
| switch(GetKind()) |
| { |
| case eImportSpec: |
| return v->VisitImportSpec(llvm::cast<const GoASTImportSpec>(this)); |
| case eTypeSpec: |
| return v->VisitTypeSpec(llvm::cast<const GoASTTypeSpec>(this)); |
| case eValueSpec: |
| return v->VisitValueSpec(llvm::cast<const GoASTValueSpec>(this)); |
| default: |
| assert(false && "Invalid kind"); |
| } |
| } |
| |
| template <typename R, typename V> |
| R GoASTStmt::Visit(V* v) const |
| { |
| switch(GetKind()) |
| { |
| case eAssignStmt: |
| return v->VisitAssignStmt(llvm::cast<const GoASTAssignStmt>(this)); |
| case eBadStmt: |
| return v->VisitBadStmt(llvm::cast<const GoASTBadStmt>(this)); |
| case eBlockStmt: |
| return v->VisitBlockStmt(llvm::cast<const GoASTBlockStmt>(this)); |
| case eBranchStmt: |
| return v->VisitBranchStmt(llvm::cast<const GoASTBranchStmt>(this)); |
| case eCaseClause: |
| return v->VisitCaseClause(llvm::cast<const GoASTCaseClause>(this)); |
| case eCommClause: |
| return v->VisitCommClause(llvm::cast<const GoASTCommClause>(this)); |
| case eDeclStmt: |
| return v->VisitDeclStmt(llvm::cast<const GoASTDeclStmt>(this)); |
| case eDeferStmt: |
| return v->VisitDeferStmt(llvm::cast<const GoASTDeferStmt>(this)); |
| case eEmptyStmt: |
| return v->VisitEmptyStmt(llvm::cast<const GoASTEmptyStmt>(this)); |
| case eExprStmt: |
| return v->VisitExprStmt(llvm::cast<const GoASTExprStmt>(this)); |
| case eForStmt: |
| return v->VisitForStmt(llvm::cast<const GoASTForStmt>(this)); |
| case eGoStmt: |
| return v->VisitGoStmt(llvm::cast<const GoASTGoStmt>(this)); |
| case eIfStmt: |
| return v->VisitIfStmt(llvm::cast<const GoASTIfStmt>(this)); |
| case eIncDecStmt: |
| return v->VisitIncDecStmt(llvm::cast<const GoASTIncDecStmt>(this)); |
| case eLabeledStmt: |
| return v->VisitLabeledStmt(llvm::cast<const GoASTLabeledStmt>(this)); |
| case eRangeStmt: |
| return v->VisitRangeStmt(llvm::cast<const GoASTRangeStmt>(this)); |
| case eReturnStmt: |
| return v->VisitReturnStmt(llvm::cast<const GoASTReturnStmt>(this)); |
| case eSelectStmt: |
| return v->VisitSelectStmt(llvm::cast<const GoASTSelectStmt>(this)); |
| case eSendStmt: |
| return v->VisitSendStmt(llvm::cast<const GoASTSendStmt>(this)); |
| case eSwitchStmt: |
| return v->VisitSwitchStmt(llvm::cast<const GoASTSwitchStmt>(this)); |
| case eTypeSwitchStmt: |
| return v->VisitTypeSwitchStmt(llvm::cast<const GoASTTypeSwitchStmt>(this)); |
| default: |
| assert(false && "Invalid kind"); |
| } |
| } |
| |
| template <typename V> |
| void GoASTNode::WalkChildren(V &v) |
| { |
| switch (m_kind) |
| { |
| |
| |
| case eArrayType: |
| { |
| GoASTArrayType *n = llvm::cast<GoASTArrayType>(this); |
| (void)n; |
| v(n->m_len_up.get()); |
| v(n->m_elt_up.get()); |
| return; |
| } |
| case eAssignStmt: |
| { |
| GoASTAssignStmt *n = llvm::cast<GoASTAssignStmt>(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<GoASTBasicLit>(this); |
| (void)n; |
| return; |
| } |
| case eBinaryExpr: |
| { |
| GoASTBinaryExpr *n = llvm::cast<GoASTBinaryExpr>(this); |
| (void)n; |
| v(n->m_x_up.get()); |
| v(n->m_y_up.get()); |
| return; |
| } |
| case eBlockStmt: |
| { |
| GoASTBlockStmt *n = llvm::cast<GoASTBlockStmt>(this); |
| (void)n; |
| for (auto& e : n->m_list) { v(e.get()); } |
| return; |
| } |
| case eIdent: |
| { |
| GoASTIdent *n = llvm::cast<GoASTIdent>(this); |
| (void)n; |
| return; |
| } |
| case eBranchStmt: |
| { |
| GoASTBranchStmt *n = llvm::cast<GoASTBranchStmt>(this); |
| (void)n; |
| v(n->m_label_up.get()); |
| return; |
| } |
| case eCallExpr: |
| { |
| GoASTCallExpr *n = llvm::cast<GoASTCallExpr>(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<GoASTCaseClause>(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<GoASTChanType>(this); |
| (void)n; |
| v(n->m_value_up.get()); |
| return; |
| } |
| case eCommClause: |
| { |
| GoASTCommClause *n = llvm::cast<GoASTCommClause>(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<GoASTCompositeLit>(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<GoASTDeclStmt>(this); |
| (void)n; |
| v(n->m_decl_up.get()); |
| return; |
| } |
| case eDeferStmt: |
| { |
| GoASTDeferStmt *n = llvm::cast<GoASTDeferStmt>(this); |
| (void)n; |
| v(n->m_call_up.get()); |
| return; |
| } |
| case eEllipsis: |
| { |
| GoASTEllipsis *n = llvm::cast<GoASTEllipsis>(this); |
| (void)n; |
| v(n->m_elt_up.get()); |
| return; |
| } |
| case eExprStmt: |
| { |
| GoASTExprStmt *n = llvm::cast<GoASTExprStmt>(this); |
| (void)n; |
| v(n->m_x_up.get()); |
| return; |
| } |
| case eField: |
| { |
| GoASTField *n = llvm::cast<GoASTField>(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<GoASTFieldList>(this); |
| (void)n; |
| for (auto& e : n->m_list) { v(e.get()); } |
| return; |
| } |
| case eForStmt: |
| { |
| GoASTForStmt *n = llvm::cast<GoASTForStmt>(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<GoASTFuncType>(this); |
| (void)n; |
| v(n->m_params_up.get()); |
| v(n->m_results_up.get()); |
| return; |
| } |
| case eFuncDecl: |
| { |
| GoASTFuncDecl *n = llvm::cast<GoASTFuncDecl>(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<GoASTFuncLit>(this); |
| (void)n; |
| v(n->m_type_up.get()); |
| v(n->m_body_up.get()); |
| return; |
| } |
| case eGenDecl: |
| { |
| GoASTGenDecl *n = llvm::cast<GoASTGenDecl>(this); |
| (void)n; |
| for (auto& e : n->m_specs) { v(e.get()); } |
| return; |
| } |
| case eGoStmt: |
| { |
| GoASTGoStmt *n = llvm::cast<GoASTGoStmt>(this); |
| (void)n; |
| v(n->m_call_up.get()); |
| return; |
| } |
| case eIfStmt: |
| { |
| GoASTIfStmt *n = llvm::cast<GoASTIfStmt>(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<GoASTImportSpec>(this); |
| (void)n; |
| v(n->m_name_up.get()); |
| v(n->m_path_up.get()); |
| return; |
| } |
| case eIncDecStmt: |
| { |
| GoASTIncDecStmt *n = llvm::cast<GoASTIncDecStmt>(this); |
| (void)n; |
| v(n->m_x_up.get()); |
| return; |
| } |
| case eIndexExpr: |
| { |
| GoASTIndexExpr *n = llvm::cast<GoASTIndexExpr>(this); |
| (void)n; |
| v(n->m_x_up.get()); |
| v(n->m_index_up.get()); |
| return; |
| } |
| case eInterfaceType: |
| { |
| GoASTInterfaceType *n = llvm::cast<GoASTInterfaceType>(this); |
| (void)n; |
| v(n->m_methods_up.get()); |
| return; |
| } |
| case eKeyValueExpr: |
| { |
| GoASTKeyValueExpr *n = llvm::cast<GoASTKeyValueExpr>(this); |
| (void)n; |
| v(n->m_key_up.get()); |
| v(n->m_value_up.get()); |
| return; |
| } |
| case eLabeledStmt: |
| { |
| GoASTLabeledStmt *n = llvm::cast<GoASTLabeledStmt>(this); |
| (void)n; |
| v(n->m_label_up.get()); |
| v(n->m_stmt_up.get()); |
| return; |
| } |
| case eMapType: |
| { |
| GoASTMapType *n = llvm::cast<GoASTMapType>(this); |
| (void)n; |
| v(n->m_key_up.get()); |
| v(n->m_value_up.get()); |
| return; |
| } |
| case eParenExpr: |
| { |
| GoASTParenExpr *n = llvm::cast<GoASTParenExpr>(this); |
| (void)n; |
| v(n->m_x_up.get()); |
| return; |
| } |
| case eRangeStmt: |
| { |
| GoASTRangeStmt *n = llvm::cast<GoASTRangeStmt>(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<GoASTReturnStmt>(this); |
| (void)n; |
| for (auto& e : n->m_results) { v(e.get()); } |
| return; |
| } |
| case eSelectStmt: |
| { |
| GoASTSelectStmt *n = llvm::cast<GoASTSelectStmt>(this); |
| (void)n; |
| v(n->m_body_up.get()); |
| return; |
| } |
| case eSelectorExpr: |
| { |
| GoASTSelectorExpr *n = llvm::cast<GoASTSelectorExpr>(this); |
| (void)n; |
| v(n->m_x_up.get()); |
| v(n->m_sel_up.get()); |
| return; |
| } |
| case eSendStmt: |
| { |
| GoASTSendStmt *n = llvm::cast<GoASTSendStmt>(this); |
| (void)n; |
| v(n->m_chan_up.get()); |
| v(n->m_value_up.get()); |
| return; |
| } |
| case eSliceExpr: |
| { |
| GoASTSliceExpr *n = llvm::cast<GoASTSliceExpr>(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<GoASTStarExpr>(this); |
| (void)n; |
| v(n->m_x_up.get()); |
| return; |
| } |
| case eStructType: |
| { |
| GoASTStructType *n = llvm::cast<GoASTStructType>(this); |
| (void)n; |
| v(n->m_fields_up.get()); |
| return; |
| } |
| case eSwitchStmt: |
| { |
| GoASTSwitchStmt *n = llvm::cast<GoASTSwitchStmt>(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<GoASTTypeAssertExpr>(this); |
| (void)n; |
| v(n->m_x_up.get()); |
| v(n->m_type_up.get()); |
| return; |
| } |
| case eTypeSpec: |
| { |
| GoASTTypeSpec *n = llvm::cast<GoASTTypeSpec>(this); |
| (void)n; |
| v(n->m_name_up.get()); |
| v(n->m_type_up.get()); |
| return; |
| } |
| case eTypeSwitchStmt: |
| { |
| GoASTTypeSwitchStmt *n = llvm::cast<GoASTTypeSwitchStmt>(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<GoASTUnaryExpr>(this); |
| (void)n; |
| v(n->m_x_up.get()); |
| return; |
| } |
| case eValueSpec: |
| { |
| GoASTValueSpec *n = llvm::cast<GoASTValueSpec>(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 |
| |