diff options
Diffstat (limited to 'src/hir')
-rw-r--r-- | src/hir/expr.cpp | 4 | ||||
-rw-r--r-- | src/hir/expr.hpp | 3 | ||||
-rw-r--r-- | src/hir/from_ast.cpp | 7 | ||||
-rw-r--r-- | src/hir/path.hpp | 3 | ||||
-rw-r--r-- | src/hir/pattern.hpp | 1 |
5 files changed, 13 insertions, 5 deletions
diff --git a/src/hir/expr.cpp b/src/hir/expr.cpp index 59651c57..e9768e02 100644 --- a/src/hir/expr.cpp +++ b/src/hir/expr.cpp @@ -11,8 +11,10 @@ const Span& ::HIR::ExprNode::span() const return rv; } -#define DEF_VISIT(nt, n, code) void ::HIR::nt::visit(ExprVisitor& nv) { nv.visit(*this); } void ::HIR::ExprVisitorDef::visit(::HIR::nt& n) { code } +#define DEF_VISIT(nt, n, code) void ::HIR::nt::visit(ExprVisitor& nv) { nv.visit_node(*this); nv.visit(*this); } void ::HIR::ExprVisitorDef::visit(::HIR::nt& n) { code } +void ::HIR::ExprVisitor::visit_node(::HIR::ExprNode& node) { +} DEF_VISIT(ExprNode_Block, node, for(const auto& subnode : node.m_nodes) { assert(subnode); diff --git a/src/hir/expr.hpp b/src/hir/expr.hpp index 1f13bea7..5d55393c 100644 --- a/src/hir/expr.hpp +++ b/src/hir/expr.hpp @@ -14,7 +14,7 @@ class ExprVisitor; class ExprNode { public: - //::HIR::TypeRef m_res_type; + ::HIR::TypeRef m_res_type; const Span& span() const; @@ -436,6 +436,7 @@ struct ExprNode_Closure: class ExprVisitor { public: + virtual void visit_node(ExprNode& node); #define NV(nt) virtual void visit(nt& n) = 0; NV(ExprNode_Block) diff --git a/src/hir/from_ast.cpp b/src/hir/from_ast.cpp index 8f306957..a3584663 100644 --- a/src/hir/from_ast.cpp +++ b/src/hir/from_ast.cpp @@ -8,6 +8,7 @@ ::HIR::Module LowerHIR_Module(const ::AST::Module& module, ::HIR::SimplePath path); ::HIR::Function LowerHIR_Function(const ::AST::Function& f); +::HIR::SimplePath LowerHIR_SimplePath(const Span& sp, const ::AST::Path& path, bool allow_final_generic = false); // -------------------------------------------------------------------- ::HIR::GenericParams LowerHIR_GenericParams(const ::AST::GenericParams& gp) @@ -330,7 +331,7 @@ } } -::HIR::SimplePath LowerHIR_SimplePath(const ::AST::Path& path, bool allow_final_generic = false) +::HIR::SimplePath LowerHIR_SimplePath(const Span& sp, const ::AST::Path& path, bool allow_final_generic) { TU_IFLET(::AST::Path::Class, path.m_class, Absolute, e, ::HIR::SimplePath rv( e.crate ); @@ -357,7 +358,7 @@ ::HIR::GenericPath LowerHIR_GenericPath(const Span& sp, const ::AST::Path& path) { TU_IFLET(::AST::Path::Class, path.m_class, Absolute, e, - auto sp = LowerHIR_SimplePath(path, true); + auto simpepath = LowerHIR_SimplePath(sp, path, true); ::HIR::PathParams params; const auto& src_params = e.nodes.back().args(); //for(const auto& param : src_params.m_lifetimes) { @@ -366,7 +367,7 @@ params.m_types.push_back( LowerHIR_Type(param) ); } // TODO: Lifetime params (not encoded in AST::PathNode as yet) - auto rv = ::HIR::GenericPath(mv$(sp), mv$(params)); + auto rv = ::HIR::GenericPath(mv$(simpepath), mv$(params)); DEBUG(path << " => " << rv); return rv; ) diff --git a/src/hir/path.hpp b/src/hir/path.hpp index e482469e..b5bc061b 100644 --- a/src/hir/path.hpp +++ b/src/hir/path.hpp @@ -35,6 +35,9 @@ struct SimplePath bool operator==(const SimplePath& x) const { return m_crate_name == x.m_crate_name && m_components == x.m_components; } + bool operator!=(const SimplePath& x) const { + return !(*this == x); + } bool operator<(const SimplePath& x) const { if( m_crate_name < x.m_crate_name ) return true; if( m_components < x.m_components ) return true; diff --git a/src/hir/pattern.hpp b/src/hir/pattern.hpp index 0db35059..fc763f54 100644 --- a/src/hir/pattern.hpp +++ b/src/hir/pattern.hpp @@ -60,6 +60,7 @@ struct Pattern (Ref, struct { ::HIR::BorrowType type; ::std::unique_ptr<Pattern> sub; } ), (Tuple, struct { ::std::vector<Pattern> sub_patterns; } ), (StructTuple, struct { + // NOTE: Type paths in patterns _can_ have parameters GenericPath path; const Struct* binding; ::std::vector<Pattern> sub_patterns; |