summaryrefslogtreecommitdiff
path: root/src/hir
diff options
context:
space:
mode:
Diffstat (limited to 'src/hir')
-rw-r--r--src/hir/expr.cpp4
-rw-r--r--src/hir/expr.hpp3
-rw-r--r--src/hir/from_ast.cpp7
-rw-r--r--src/hir/path.hpp3
-rw-r--r--src/hir/pattern.hpp1
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;