summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/hir/expr.cpp37
-rw-r--r--src/hir/expr.hpp2
-rw-r--r--src/hir_expand/closures.cpp14
-rw-r--r--src/hir_typeck/expr_cs.cpp5
4 files changed, 31 insertions, 27 deletions
diff --git a/src/hir/expr.cpp b/src/hir/expr.cpp
index 02e7ed98..531a516d 100644
--- a/src/hir/expr.cpp
+++ b/src/hir/expr.cpp
@@ -1,4 +1,9 @@
/*
+ * MRustC - Rust Compiler
+ * - By John Hodge (Mutabah/thePowersGang)
+ *
+ * hir/expr.cpp
+ * - HIR expression helper code
*/
#include <hir/expr.hpp>
@@ -23,7 +28,7 @@ DEF_VISIT(ExprNode_Return, node,
visit_node_ptr(node.m_value);
)
DEF_VISIT(ExprNode_Let, node,
- visit_pattern(node.m_pattern);
+ visit_pattern(node.span(), node.m_pattern);
visit_type(node.m_type);
if( node.m_value ) {
visit_node_ptr(node.m_value);
@@ -38,7 +43,7 @@ DEF_VISIT(ExprNode_Match, node,
for(auto& arm : node.m_arms)
{
for(auto& pat : arm.m_patterns)
- visit_pattern(pat);
+ visit_pattern(node.span(), pat);
if( arm.m_cond )
visit_node_ptr(arm.m_cond);
visit_node_ptr(arm.m_code);
@@ -160,7 +165,7 @@ DEF_VISIT(ExprNode_ArraySized, node,
DEF_VISIT(ExprNode_Closure, node,
for(auto& arg : node.m_args) {
- visit_pattern(arg.first);
+ visit_pattern(node.span(), arg.first);
visit_type(arg.second);
}
visit_type(node.m_return);
@@ -173,38 +178,38 @@ DEF_VISIT(ExprNode_Closure, node,
#undef DEF_VISIT
// TODO: Merge this with the stuff in ::HIR::Visitor
-void ::HIR::ExprVisitorDef::visit_pattern(::HIR::Pattern& pat)
+void ::HIR::ExprVisitorDef::visit_pattern(const Span& sp, ::HIR::Pattern& pat)
{
TU_MATCH(::HIR::Pattern::Data, (pat.m_data), (e),
(Any,
),
(Box,
- this->visit_pattern(*e.sub);
+ this->visit_pattern(sp, *e.sub);
),
(Ref,
- this->visit_pattern(*e.sub);
+ this->visit_pattern(sp, *e.sub);
),
(Tuple,
for(auto& subpat : e.sub_patterns)
- this->visit_pattern(subpat);
+ this->visit_pattern(sp, subpat);
),
(SplitTuple,
for(auto& subpat : e.leading)
- this->visit_pattern(subpat);
+ this->visit_pattern(sp, subpat);
for(auto& subpat : e.trailing)
- this->visit_pattern(subpat);
+ this->visit_pattern(sp, subpat);
),
(StructValue,
// Nothing.
),
(StructTuple,
for(auto& subpat : e.sub_patterns)
- this->visit_pattern(subpat);
+ this->visit_pattern(sp, subpat);
),
(Struct,
for(auto& fld_pat : e.sub_patterns)
{
- this->visit_pattern(fld_pat.second);
+ this->visit_pattern(sp, fld_pat.second);
}
),
// Refutable
@@ -216,21 +221,21 @@ void ::HIR::ExprVisitorDef::visit_pattern(::HIR::Pattern& pat)
),
(EnumTuple,
for(auto& subpat : e.sub_patterns)
- this->visit_pattern(subpat);
+ this->visit_pattern(sp, subpat);
),
(EnumStruct,
for(auto& fld_pat : e.sub_patterns)
- this->visit_pattern(fld_pat.second);
+ this->visit_pattern(sp, fld_pat.second);
),
(Slice,
for(auto& subpat : e.sub_patterns)
- this->visit_pattern(subpat);
+ this->visit_pattern(sp, subpat);
),
(SplitSlice,
for(auto& subpat : e.leading)
- this->visit_pattern(subpat);
+ this->visit_pattern(sp, subpat);
for(auto& subpat : e.trailing)
- this->visit_pattern(subpat);
+ this->visit_pattern(sp, subpat);
)
)
}
diff --git a/src/hir/expr.hpp b/src/hir/expr.hpp
index a5a1346a..1b732e4a 100644
--- a/src/hir/expr.hpp
+++ b/src/hir/expr.hpp
@@ -875,7 +875,7 @@ public:
NV(ExprNode_Closure);
#undef NV
- virtual void visit_pattern(::HIR::Pattern& pat);
+ virtual void visit_pattern(const Span& sp, ::HIR::Pattern& pat);
virtual void visit_type(::HIR::TypeRef& ty);
virtual void visit_trait_path(::HIR::TraitPath& p);
virtual void visit_path_params(::HIR::PathParams& ty);
diff --git a/src/hir_expand/closures.cpp b/src/hir_expand/closures.cpp
index 2523eb68..efe67a5c 100644
--- a/src/hir_expand/closures.cpp
+++ b/src/hir_expand/closures.cpp
@@ -72,7 +72,7 @@ namespace {
{
}
- void visit_pattern(::HIR::Pattern& pat) override {
+ void visit_pattern(const Span& sp, ::HIR::Pattern& pat) override {
if( pat.m_binding.is_valid() ) {
auto binding_it = ::std::find(m_local_vars.begin(), m_local_vars.end(), pat.m_binding.m_slot);
if( binding_it != m_local_vars.end() ) {
@@ -80,15 +80,15 @@ namespace {
pat.m_binding.m_slot = 1 + binding_it - m_local_vars.begin();
}
else {
- BUG(Span(), "Pattern binds to non-local");
+ BUG(sp, "Pattern binds to non-local");
}
}
TU_IFLET(::HIR::Pattern::Data, (pat.m_data), SplitSlice, e,
- TODO(Span(), "Fixup binding in split slice");
+ TODO(sp, "Fixup binding in split slice");
)
- ::HIR::ExprVisitorDef::visit_pattern(pat);
+ ::HIR::ExprVisitorDef::visit_pattern(sp, pat);
}
void visit_type(::HIR::TypeRef& ty) override {
@@ -637,7 +637,7 @@ namespace {
for(const auto& arg : node.m_args) {
args_pat_inner.push_back( arg.first.clone() );
- ev.visit_pattern( args_pat_inner.back() );
+ ev.visit_pattern(sp, args_pat_inner.back() );
args_ty_inner.push_back( clone_ty_with(sp, arg.second, cb_replace) );
}
::HIR::TypeRef args_ty { mv$(args_ty_inner) };
@@ -760,11 +760,11 @@ namespace {
}
}
- void visit_pattern(::HIR::Pattern& pat) override
+ void visit_pattern(const Span& sp, ::HIR::Pattern& pat) override
{
if( !m_closure_stack.empty() )
{
- add_closure_def_from_pattern(Span(), pat);
+ add_closure_def_from_pattern(sp, pat);
}
}
void visit(::HIR::ExprNode_Variable& node) override
diff --git a/src/hir_typeck/expr_cs.cpp b/src/hir_typeck/expr_cs.cpp
index 091184a5..473fb143 100644
--- a/src/hir_typeck/expr_cs.cpp
+++ b/src/hir_typeck/expr_cs.cpp
@@ -2849,8 +2849,7 @@ namespace {
::HIR::ExprVisitorDef::visit_node_ptr(node_ptr);
}
- void visit_pattern(::HIR::Pattern& pat) override {
- static Span sp;
+ void visit_pattern(const Span& sp, ::HIR::Pattern& pat) override {
TU_MATCH_DEF( ::HIR::Pattern::Data, (pat.m_data), (e),
(
),
@@ -2886,7 +2885,7 @@ namespace {
this->check_type_resolved_genericpath(sp, e.path);
)
)
- ::HIR::ExprVisitorDef::visit_pattern(pat);
+ ::HIR::ExprVisitorDef::visit_pattern(sp, pat);
}
void visit(::HIR::ExprNode_Let& node) override {