diff options
author | John Hodge <tpg@mutabah.net> | 2016-10-23 15:40:43 +0800 |
---|---|---|
committer | John Hodge <tpg@mutabah.net> | 2016-10-23 15:40:43 +0800 |
commit | 061b63d4fd88e5802927bd42d4b0fd8d5f6fc0f8 (patch) | |
tree | 8fa3e208023596e78ab252d8281c939bf4f173f6 | |
parent | 2bf4e8bfeb83f135f9429256e301673c1a63ce09 (diff) | |
download | mrust-061b63d4fd88e5802927bd42d4b0fd8d5f6fc0f8.tar.gz |
AST - Remove TypeRef from node template
-rw-r--r-- | src/ast/dump.cpp | 5 | ||||
-rw-r--r-- | src/ast/expr.cpp | 9 | ||||
-rw-r--r-- | src/ast/expr.hpp | 19 | ||||
-rw-r--r-- | src/expand/mod.cpp | 4 | ||||
-rw-r--r-- | src/hir/from_ast_expr.cpp | 9 | ||||
-rw-r--r-- | src/parse/expr.cpp | 2 |
6 files changed, 44 insertions, 4 deletions
diff --git a/src/ast/dump.cpp b/src/ast/dump.cpp index ad7c4ef7..f1b0a619 100644 --- a/src/ast/dump.cpp +++ b/src/ast/dump.cpp @@ -470,6 +470,11 @@ public: AST::NodeVisitor::visit(n.m_value); m_os << " as " << n.m_type; } + virtual void visit(AST::ExprNode_TypeAnnotation& n) override { + m_expr_root = false; + AST::NodeVisitor::visit(n.m_value); + m_os << ": " << n.m_type; + } virtual void visit(AST::ExprNode_BinOp& n) override { m_expr_root = false; WRAPIF(n.m_left diff --git a/src/ast/expr.cpp b/src/ast/expr.cpp index 5c9afa5d..3f2abd2b 100644 --- a/src/ast/expr.cpp +++ b/src/ast/expr.cpp @@ -325,6 +325,11 @@ NODE(ExprNode_Cast, { },{ return NEWNODE(ExprNode_Cast, m_value->clone(), TypeRef(m_type)); }) +NODE(ExprNode_TypeAnnotation, { + os << "(" << *m_value << ": " << m_type << ")"; +},{ + return NEWNODE(ExprNode_TypeAnnotation, m_value->clone(), TypeRef(m_type)); +}) NODE(ExprNode_BinOp, { os << "(" << *m_left << " "; @@ -511,6 +516,10 @@ NV(ExprNode_Cast, { visit(node.m_value); }) +NV(ExprNode_TypeAnnotation, +{ + visit(node.m_value); +}) NV(ExprNode_BinOp, { visit(node.m_left); diff --git a/src/ast/expr.hpp b/src/ast/expr.hpp index 1d1ccdae..e2c318b1 100644 --- a/src/ast/expr.hpp +++ b/src/ast/expr.hpp @@ -20,7 +20,6 @@ class NodeVisitor; class ExprNode { - TypeRef m_res_type = TypeRef(Span()); MetaItems m_attrs; Position m_pos; public: @@ -39,7 +38,6 @@ public: } MetaItems& attrs() { return m_attrs; } - TypeRef& get_res_type() { return m_res_type; } static ::std::unique_ptr<ExprNode> from_deserialiser(Deserialiser& d); }; typedef ::std::unique_ptr<ExprNode> ExprNodeP; @@ -497,6 +495,21 @@ struct ExprNode_Cast: NODE_METHODS(); }; +// Type annotation (': _') +struct ExprNode_TypeAnnotation: + public ExprNode +{ + unique_ptr<ExprNode> m_value; + TypeRef m_type; + + ExprNode_TypeAnnotation(unique_ptr<ExprNode>&& value, TypeRef&& dst_type): + m_value( move(value) ), + m_type( move(dst_type) ) + { + } + NODE_METHODS(); +}; + // Binary operation struct ExprNode_BinOp: public ExprNode @@ -610,6 +623,7 @@ public: NT(ExprNode_Index); NT(ExprNode_Deref); NT(ExprNode_Cast); + NT(ExprNode_TypeAnnotation); NT(ExprNode_BinOp); NT(ExprNode_UniOp); #undef NT @@ -653,6 +667,7 @@ public: NT(ExprNode_Index); NT(ExprNode_Deref); NT(ExprNode_Cast); + NT(ExprNode_TypeAnnotation); NT(ExprNode_BinOp); NT(ExprNode_UniOp); #undef NT diff --git a/src/expand/mod.cpp b/src/expand/mod.cpp index ba8f6977..ad141a46 100644 --- a/src/expand/mod.cpp +++ b/src/expand/mod.cpp @@ -501,6 +501,10 @@ struct CExpandExpr: this->visit_nodelete(node, node.m_value); Expand_Type(crate, modstack, this->cur_mod(), node.m_type); } + void visit(::AST::ExprNode_TypeAnnotation& node) override { + this->visit_nodelete(node, node.m_value); + Expand_Type(crate, modstack, this->cur_mod(), node.m_type); + } void visit(::AST::ExprNode_BinOp& node) override { this->visit_nodelete(node, node.m_left); this->visit_nodelete(node, node.m_right); diff --git a/src/hir/from_ast_expr.cpp b/src/hir/from_ast_expr.cpp index 159aed89..b0ea4169 100644 --- a/src/hir/from_ast_expr.cpp +++ b/src/hir/from_ast_expr.cpp @@ -218,12 +218,19 @@ struct LowerHIR_ExprNode_Visitor: break; } } - virtual void visit(::AST::ExprNode_Cast & v) override { + virtual void visit(::AST::ExprNode_Cast& v) override { m_rv.reset( new ::HIR::ExprNode_Cast( v.span(), LowerHIR_ExprNode_Inner( *v.m_value ), LowerHIR_Type(v.m_type) ) ); } + virtual void visit(::AST::ExprNode_TypeAnnotation& v) override { + // TODO: A proper node? + m_rv.reset( new ::HIR::ExprNode_Unsize( v.span(), + LowerHIR_ExprNode_Inner( *v.m_value ), + LowerHIR_Type(v.m_type) + ) ); + } virtual void visit(::AST::ExprNode_CallPath& v) override { ::std::vector< ::HIR::ExprNodeP> args; diff --git a/src/parse/expr.cpp b/src/parse/expr.cpp index 471e6c34..ddac8a2b 100644 --- a/src/parse/expr.cpp +++ b/src/parse/expr.cpp @@ -811,7 +811,7 @@ ExprNodeP Parse_Expr12(TokenStream& lex) auto rv = Parse_Expr13(lex);
if(GET_TOK(tok, lex) == TOK_COLON)
{
- rv->get_res_type() = Parse_Type(lex);
+ rv = NEWNODE( AST::ExprNode_TypeAnnotation, mv$(rv), Parse_Type(lex) );
}
else
{
|