summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Hodge <tpg@mutabah.net>2016-10-23 15:40:43 +0800
committerJohn Hodge <tpg@mutabah.net>2016-10-23 15:40:43 +0800
commit061b63d4fd88e5802927bd42d4b0fd8d5f6fc0f8 (patch)
tree8fa3e208023596e78ab252d8281c939bf4f173f6
parent2bf4e8bfeb83f135f9429256e301673c1a63ce09 (diff)
downloadmrust-061b63d4fd88e5802927bd42d4b0fd8d5f6fc0f8.tar.gz
AST - Remove TypeRef from node template
-rw-r--r--src/ast/dump.cpp5
-rw-r--r--src/ast/expr.cpp9
-rw-r--r--src/ast/expr.hpp19
-rw-r--r--src/expand/mod.cpp4
-rw-r--r--src/hir/from_ast_expr.cpp9
-rw-r--r--src/parse/expr.cpp2
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
{