summaryrefslogtreecommitdiff
path: root/src/hir/from_ast.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/hir/from_ast.cpp')
-rw-r--r--src/hir/from_ast.cpp26
1 files changed, 22 insertions, 4 deletions
diff --git a/src/hir/from_ast.cpp b/src/hir/from_ast.cpp
index b80759ff..927239ff 100644
--- a/src/hir/from_ast.cpp
+++ b/src/hir/from_ast.cpp
@@ -23,6 +23,7 @@
::HIR::SimplePath path_Sized;
::std::string g_core_crate;
+::std::string g_crate_name;
::HIR::Crate* g_crate_ptr = nullptr;
// --------------------------------------------------------------------
@@ -498,6 +499,8 @@
{
TU_IFLET(::AST::Path::Class, path.m_class, Absolute, e,
::HIR::SimplePath rv( e.crate );
+ if( rv.m_crate_name == "" )
+ rv.m_crate_name = g_crate_name;
for( const auto& node : e.nodes )
{
if( ! node.args().is_empty() )
@@ -914,6 +917,8 @@ namespace {
::HIR::Trait LowerHIR_Trait(::HIR::SimplePath trait_path, const ::AST::Trait& f)
{
TRACE_FUNCTION_F(trait_path);
+ trait_path.m_crate_name = g_crate_name;
+
bool trait_reqires_sized = false;
auto params = LowerHIR_GenericParams(f.params(), &trait_reqires_sized);
@@ -985,7 +990,9 @@ namespace {
),
(Function,
::HIR::TypeRef self_type {"Self", 0xFFFF};
- rv.m_values.insert( ::std::make_pair(item.name, ::HIR::TraitValueItem::make_Function( LowerHIR_Function(item_path, item.data.attrs, i, self_type) )) );
+ auto fcn = LowerHIR_Function(item_path, item.data.attrs, i, self_type);
+ fcn.m_save_code = true;
+ rv.m_values.insert( ::std::make_pair(item.name, ::HIR::TraitValueItem::make_Function( mv$(fcn) )) );
),
(Static,
if( i.s_class() == ::AST::Static::CONST )
@@ -1061,6 +1068,13 @@ namespace {
}
}
+ bool force_emit = false;
+ if( const auto* a = attrs.get("inline") )
+ {
+ (void)a;
+ force_emit = true;
+ }
+
::HIR::Linkage linkage;
// Convert #[link_name/no_mangle] attributes into the name
@@ -1094,6 +1108,7 @@ namespace {
}
return ::HIR::Function {
+ force_emit,
mv$(linkage),
receiver,
f.abi(), f.is_unsafe(), f.is_const(),
@@ -1478,8 +1493,11 @@ public:
::HIR::CratePtr LowerHIR_FromAST(::AST::Crate crate)
{
::HIR::Crate rv;
+ rv.m_crate_name = crate.m_crate_name;
+
g_crate_ptr = &rv;
- g_core_crate = (crate.m_load_std == ::AST::Crate::LOAD_NONE ? "" : "core");
+ g_crate_name = crate.m_crate_name;
+ g_core_crate = (crate.m_load_std == ::AST::Crate::LOAD_NONE ? crate.m_crate_name : "core");
auto& macros = rv.m_exported_macros;
// - Extract exported macros
@@ -1544,11 +1562,11 @@ public:
ERROR(sp, E0000, "Conflicting definitions of lang item '" << name << "'. " << path << " and " << irv.first->second);
}
}
- rv.m_ext_crates.insert( ::std::make_pair( ext_crate.first, mv$(ext_crate.second.m_hir) ) );
+ rv.m_ext_crates.insert( ::std::make_pair( ext_crate.first, ::HIR::ExternCrate { mv$(ext_crate.second.m_hir), ext_crate.second.m_filename } ) );
}
path_Sized = rv.get_lang_item_path(sp, "sized");
- rv.m_root_module = LowerHIR_Module( crate.m_root_module, ::HIR::ItemPath() );
+ rv.m_root_module = LowerHIR_Module( crate.m_root_module, ::HIR::ItemPath(crate.m_crate_name) );
LowerHIR_Module_Impls(crate.m_root_module, rv);