summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Hodge <tpg@mutabah.net>2016-10-15 10:49:58 +0800
committerJohn Hodge <tpg@mutabah.net>2016-10-15 10:49:58 +0800
commit843ef4abc659b3816e2a9f20622fef1a75240ecf (patch)
treef804abf08d8a6cbee4dc9fed43d7508127af03a6
parentf6c60250561ab65f15a8453fe5b137cee6ad92a5 (diff)
downloadmrust-843ef4abc659b3816e2a9f20622fef1a75240ecf.tar.gz
HIR - Rough support for associated consts
-rw-r--r--src/hir/deserialise.cpp13
-rw-r--r--src/hir/from_ast.cpp18
-rw-r--r--src/hir/hir.hpp5
-rw-r--r--src/hir/serialise.cpp9
-rw-r--r--src/hir/visitor.cpp6
-rw-r--r--src/hir_conv/constant_evaluation.cpp10
-rw-r--r--src/hir_typeck/expr_visit.cpp2
7 files changed, 47 insertions, 16 deletions
diff --git a/src/hir/deserialise.cpp b/src/hir/deserialise.cpp
index f9ad4460..75efdccf 100644
--- a/src/hir/deserialise.cpp
+++ b/src/hir/deserialise.cpp
@@ -228,6 +228,14 @@ namespace {
read_bool(), read_bool(), deserialise_function()
} ) );
}
+ size_t const_count = read_count();
+ for(size_t i = 0; i < const_count; i ++)
+ {
+ auto name = read_string();
+ rv.m_constants.insert( ::std::make_pair( mv$(name), ::HIR::TypeImpl::VisImplEnt< ::HIR::Constant> {
+ read_bool(), read_bool(), deserialise_constant()
+ } ) );
+ }
// m_src_module doesn't matter after typeck
return rv;
}
@@ -253,8 +261,8 @@ namespace {
for(size_t i = 0; i < const_count; i ++)
{
auto name = read_string();
- rv.m_constants.insert( ::std::make_pair( mv$(name), ::HIR::TraitImpl::ImplEnt< ::HIR::ExprPtr> {
- read_bool(), deserialise_exprptr()
+ rv.m_constants.insert( ::std::make_pair( mv$(name), ::HIR::TraitImpl::ImplEnt< ::HIR::Constant> {
+ read_bool(), deserialise_constant()
} ) );
}
size_t type_count = read_count();
@@ -914,6 +922,7 @@ namespace {
switch( read_tag() )
{
#define _(x, ...) case ::HIR::Literal::TAG_##x: return ::HIR::Literal::make_##x(__VA_ARGS__);
+ _(Invalid, {})
_(List, deserialise_vec< ::HIR::Literal>() )
_(Variant, {
static_cast<unsigned int>(read_count()),
diff --git a/src/hir/from_ast.cpp b/src/hir/from_ast.cpp
index 3fc9e7ee..3c7215f4 100644
--- a/src/hir/from_ast.cpp
+++ b/src/hir/from_ast.cpp
@@ -1168,7 +1168,7 @@ void LowerHIR_Module_Impls(const ::AST::Module& ast_mod, ::HIR::Crate& hir_crat
DEBUG(path);
::std::map< ::std::string, ::HIR::TraitImpl::ImplEnt< ::HIR::Function> > methods;
- ::std::map< ::std::string, ::HIR::TraitImpl::ImplEnt< ::HIR::ExprPtr> > constants;
+ ::std::map< ::std::string, ::HIR::TraitImpl::ImplEnt< ::HIR::Constant> > constants;
::std::map< ::std::string, ::HIR::TraitImpl::ImplEnt< ::HIR::TypeRef> > types;
for(const auto& item : impl.items())
@@ -1184,7 +1184,11 @@ void LowerHIR_Module_Impls(const ::AST::Module& ast_mod, ::HIR::Crate& hir_crat
),
(Static,
if( e.s_class() == ::AST::Static::CONST ) {
- constants.insert( ::std::make_pair(item.name, ::HIR::TraitImpl::ImplEnt< ::HIR::ExprPtr> { item.is_specialisable, LowerHIR_Expr(e.value()) }) );
+ constants.insert( ::std::make_pair(item.name, ::HIR::TraitImpl::ImplEnt< ::HIR::Constant> { item.is_specialisable, ::HIR::Constant {
+ ::HIR::GenericParams {},
+ LowerHIR_Type( e.type() ),
+ LowerHIR_Expr( e.value() )
+ } }) );
}
else {
TODO(item.data->span, "Associated statics in trait impl");
@@ -1237,7 +1241,7 @@ void LowerHIR_Module_Impls(const ::AST::Module& ast_mod, ::HIR::Crate& hir_crat
::HIR::ItemPath path(type);
::std::map< ::std::string, ::HIR::TypeImpl::VisImplEnt< ::HIR::Function> > methods;
- ::std::map< ::std::string, ::HIR::TypeImpl::VisImplEnt< ::HIR::ExprPtr> > constants;
+ ::std::map< ::std::string, ::HIR::TypeImpl::VisImplEnt< ::HIR::Constant> > constants;
for(const auto& item : impl.items())
{
@@ -1252,8 +1256,11 @@ void LowerHIR_Module_Impls(const ::AST::Module& ast_mod, ::HIR::Crate& hir_crat
),
(Static,
if( e.s_class() == ::AST::Static::CONST ) {
- constants.insert( ::std::make_pair(item.name, ::HIR::TypeImpl::VisImplEnt< ::HIR::ExprPtr> { item.is_pub, item.is_specialisable, LowerHIR_Expr(e.value()) }) );
- TODO(item.data->span, "Associated constants in inherent impl");
+ constants.insert( ::std::make_pair(item.name, ::HIR::TypeImpl::VisImplEnt< ::HIR::Constant> { item.is_pub, item.is_specialisable, ::HIR::Constant {
+ ::HIR::GenericParams {},
+ LowerHIR_Type( e.type() ),
+ LowerHIR_Expr( e.value() )
+ } }) );
}
else {
TODO(item.data->span, "Associated statics in inherent impl");
@@ -1269,6 +1276,7 @@ void LowerHIR_Module_Impls(const ::AST::Module& ast_mod, ::HIR::Crate& hir_crat
mv$(params),
mv$(type),
mv$(methods),
+ mv$(constants),
LowerHIR_SimplePath(Span(), ast_mod.path())
} );
diff --git a/src/hir/hir.hpp b/src/hir/hir.hpp
index 0c6a5206..061c929b 100644
--- a/src/hir/hir.hpp
+++ b/src/hir/hir.hpp
@@ -278,7 +278,8 @@ public:
::HIR::GenericParams m_params;
::HIR::TypeRef m_type;
- ::std::map< ::std::string, VisImplEnt< ::HIR::Function> > m_methods;
+ ::std::map< ::std::string, VisImplEnt< ::HIR::Function> > m_methods;
+ ::std::map< ::std::string, VisImplEnt< ::HIR::Constant> > m_constants;
::HIR::SimplePath m_src_module;
@@ -302,7 +303,7 @@ public:
::HIR::TypeRef m_type;
::std::map< ::std::string, ImplEnt< ::HIR::Function> > m_methods;
- ::std::map< ::std::string, ImplEnt< ::HIR::ExprPtr> > m_constants;
+ ::std::map< ::std::string, ImplEnt< ::HIR::Constant> > m_constants;
::std::map< ::std::string, ImplEnt< ::HIR::TypeRef> > m_types;
::HIR::SimplePath m_src_module;
diff --git a/src/hir/serialise.cpp b/src/hir/serialise.cpp
index 238b90d0..0fad2942 100644
--- a/src/hir/serialise.cpp
+++ b/src/hir/serialise.cpp
@@ -346,6 +346,13 @@ namespace {
write_bool(v.second.is_specialisable);
serialise(v.second.data);
}
+ write_count(impl.m_constants.size());
+ for(const auto& v : impl.m_constants) {
+ write_string(v.first);
+ write_bool(v.second.is_pub);
+ write_bool(v.second.is_specialisable);
+ serialise(v.second.data);
+ }
// m_src_module doesn't matter after typeck
}
void serialise_traitimpl(const ::HIR::TraitImpl& impl)
@@ -466,7 +473,7 @@ namespace {
write_tag(lit.tag());
TU_MATCHA( (lit), (e),
(Invalid,
- BUG(Span(), "Literal::Invalid in HIR");
+ //BUG(Span(), "Literal::Invalid encountered in HIR");
),
(List,
serialise_vec(e);
diff --git a/src/hir/visitor.cpp b/src/hir/visitor.cpp
index ab7e67de..88b1be22 100644
--- a/src/hir/visitor.cpp
+++ b/src/hir/visitor.cpp
@@ -97,6 +97,10 @@ void ::HIR::Visitor::visit_type_impl(::HIR::TypeImpl& impl)
DEBUG("method " << method.first);
this->visit_function(p + method.first, method.second.data);
}
+ for(auto& ent : impl.m_constants) {
+ DEBUG("const " << ent.first);
+ this->visit_constant(p + ent.first, ent.second.data);
+ }
}
void ::HIR::Visitor::visit_trait_impl(const ::HIR::SimplePath& trait_path, ::HIR::TraitImpl& impl)
{
@@ -117,7 +121,7 @@ void ::HIR::Visitor::visit_trait_impl(const ::HIR::SimplePath& trait_path, ::HIR
}
for(auto& ent : impl.m_constants) {
DEBUG("const " << ent.first);
- this->visit_expr(ent.second.data);
+ this->visit_constant(p + ent.first, ent.second.data);
}
for(auto& ent : impl.m_types) {
DEBUG("type " << ent.first);
diff --git a/src/hir_conv/constant_evaluation.cpp b/src/hir_conv/constant_evaluation.cpp
index 47a0db6d..d6940982 100644
--- a/src/hir_conv/constant_evaluation.cpp
+++ b/src/hir_conv/constant_evaluation.cpp
@@ -994,10 +994,12 @@ namespace {
void visit_constant(::HIR::ItemPath p, ::HIR::Constant& item) override
{
visit_type(item.m_type);
- assert(item.m_value);
- item.m_value_res = evaluate_constant(item.m_value->span(), m_crate, NewvalState { m_new_values, *m_mod_path, FMT(p.get_name() << "$") }, item.m_value, {});
- DEBUG("constant: " << item.m_type << " = " << item.m_value_res);
- visit_expr(item.m_value);
+ if( item.m_value )
+ {
+ item.m_value_res = evaluate_constant(item.m_value->span(), m_crate, NewvalState { m_new_values, *m_mod_path, FMT(p.get_name() << "$") }, item.m_value, {});
+ DEBUG("constant: " << item.m_type << " = " << item.m_value_res);
+ visit_expr(item.m_value);
+ }
}
void visit_static(::HIR::ItemPath p, ::HIR::Static& item) override
{
diff --git a/src/hir_typeck/expr_visit.cpp b/src/hir_typeck/expr_visit.cpp
index 4b581e0d..ac3da63d 100644
--- a/src/hir_typeck/expr_visit.cpp
+++ b/src/hir_typeck/expr_visit.cpp
@@ -32,7 +32,7 @@ namespace {
// NOTE: This is left here to ensure that any expressions that aren't handled by higher code cause a failure
void visit_expr(::HIR::ExprPtr& exp) override {
- TODO(Span(), "visit_expr");
+ BUG(exp->m_span, "Reached expression");
}
void visit_trait(::HIR::ItemPath p, ::HIR::Trait& item) override