diff options
Diffstat (limited to 'src')
| -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
      {
 | 
