diff options
author | John Hodge <tpg@mutabah.net> | 2016-10-15 10:49:58 +0800 |
---|---|---|
committer | John Hodge <tpg@mutabah.net> | 2016-10-15 10:49:58 +0800 |
commit | 843ef4abc659b3816e2a9f20622fef1a75240ecf (patch) | |
tree | f804abf08d8a6cbee4dc9fed43d7508127af03a6 | |
parent | f6c60250561ab65f15a8453fe5b137cee6ad92a5 (diff) | |
download | mrust-843ef4abc659b3816e2a9f20622fef1a75240ecf.tar.gz |
HIR - Rough support for associated consts
-rw-r--r-- | src/hir/deserialise.cpp | 13 | ||||
-rw-r--r-- | src/hir/from_ast.cpp | 18 | ||||
-rw-r--r-- | src/hir/hir.hpp | 5 | ||||
-rw-r--r-- | src/hir/serialise.cpp | 9 | ||||
-rw-r--r-- | src/hir/visitor.cpp | 6 | ||||
-rw-r--r-- | src/hir_conv/constant_evaluation.cpp | 10 | ||||
-rw-r--r-- | src/hir_typeck/expr_visit.cpp | 2 |
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 |