diff options
author | John Hodge <tpg@mutabah.net> | 2015-03-06 19:55:17 +0800 |
---|---|---|
committer | John Hodge <tpg@mutabah.net> | 2015-03-06 19:55:17 +0800 |
commit | 6d7c84bd9d8d5e2bec8bc86d22d53975bde6e833 (patch) | |
tree | dddee2de5214120a9808d2f7a367288807703b54 /src/ast/expr.hpp | |
parent | 414883e7b61d14edb242d320dcf0e5dea3e75e85 (diff) | |
download | mrust-6d7c84bd9d8d5e2bec8bc86d22d53975bde6e833.tar.gz |
Bugfixes exposed by fixing formatted output
Diffstat (limited to 'src/ast/expr.hpp')
-rw-r--r-- | src/ast/expr.hpp | 83 |
1 files changed, 64 insertions, 19 deletions
diff --git a/src/ast/expr.hpp b/src/ast/expr.hpp index 2744b75e..bbb82bde 100644 --- a/src/ast/expr.hpp +++ b/src/ast/expr.hpp @@ -25,6 +25,7 @@ public: virtual ~ExprNode() = 0; virtual void visit(NodeVisitor& nv) = 0; + //virtual void visit(NodeVisitor& nv) const = 0; virtual void print(::std::ostream& os) const = 0; TypeRef& get_res_type() { return m_res_type; } @@ -33,7 +34,11 @@ public: static ::std::unique_ptr<ExprNode> from_deserialiser(Deserialiser& d); }; -#define NODE_METHODS() virtual void visit(NodeVisitor& nv) override; virtual void print(::std::ostream& os) const override; SERIALISABLE_PROTOTYPES(); +#define NODE_METHODS() \ + virtual void visit(NodeVisitor& nv) override;\ + virtual void print(::std::ostream& os) const override; \ + SERIALISABLE_PROTOTYPES();/* \ + virtual void visit(NodeVisitor& nv) const override;*/ struct ExprNode_Block: public ExprNode @@ -336,27 +341,65 @@ public: if(cnode.get()) cnode->visit(*this); } + virtual bool is_const() const { return false; } + + #define NT(nt) \ + virtual void visit(nt& node) = 0/*; \ + virtual void visit(const nt& node) = 0*/ + NT(ExprNode_Block); + NT(ExprNode_Macro); + NT(ExprNode_Return); + NT(ExprNode_LetBinding); + NT(ExprNode_Assign); + NT(ExprNode_CallPath); + NT(ExprNode_CallMethod); + NT(ExprNode_CallObject); + NT(ExprNode_Match); + NT(ExprNode_If); - virtual void visit(ExprNode_Block& node); - virtual void visit(ExprNode_Macro& node); - virtual void visit(ExprNode_Return& node); - virtual void visit(ExprNode_LetBinding& node); - virtual void visit(ExprNode_Assign& node); - virtual void visit(ExprNode_CallPath& node); - virtual void visit(ExprNode_CallMethod& node); - virtual void visit(ExprNode_CallObject& node); - virtual void visit(ExprNode_Match& node); - virtual void visit(ExprNode_If& node); + NT(ExprNode_Integer); + NT(ExprNode_StructLiteral); + NT(ExprNode_Tuple); + NT(ExprNode_NamedValue); - virtual void visit(ExprNode_Integer& node); - virtual void visit(ExprNode_StructLiteral& node); - virtual void visit(ExprNode_Tuple& node); - virtual void visit(ExprNode_NamedValue& node); + NT(ExprNode_Field); + NT(ExprNode_Deref); + NT(ExprNode_Cast); + NT(ExprNode_BinOp); + #undef NT +}; +class NodeVisitorDef: + public NodeVisitor +{ +public: + inline void visit(const unique_ptr<ExprNode>& cnode) { + if(cnode.get()) + cnode->visit(*this); + } + #define NT(nt) \ + virtual void visit(nt& node) override;/* \ + virtual void visit(const nt& node) override*/ + NT(ExprNode_Block); + NT(ExprNode_Macro); + NT(ExprNode_Return); + NT(ExprNode_LetBinding); + NT(ExprNode_Assign); + NT(ExprNode_CallPath); + NT(ExprNode_CallMethod); + NT(ExprNode_CallObject); + NT(ExprNode_Match); + NT(ExprNode_If); + + NT(ExprNode_Integer); + NT(ExprNode_StructLiteral); + NT(ExprNode_Tuple); + NT(ExprNode_NamedValue); - virtual void visit(ExprNode_Field& node); - virtual void visit(ExprNode_Deref& node); - virtual void visit(ExprNode_Cast& node); - virtual void visit(ExprNode_BinOp& node); + NT(ExprNode_Field); + NT(ExprNode_Deref); + NT(ExprNode_Cast); + NT(ExprNode_BinOp); + #undef NT }; class Expr: @@ -379,8 +422,10 @@ public: bool is_valid() const { return m_node.get() != nullptr; } ExprNode& node() { assert(m_node.get()); return *m_node; } + const ExprNode& node() const { assert(m_node.get()); return *m_node; } ::std::shared_ptr<ExprNode> take_node() { assert(m_node.get()); return ::std::move(m_node); } void visit_nodes(NodeVisitor& v); + void visit_nodes(NodeVisitor& v) const; friend ::std::ostream& operator<<(::std::ostream& os, const Expr& pat); |