diff options
-rw-r--r-- | lib/libproc_macro/src/lib.rs | 11 | ||||
-rw-r--r-- | src/expand/derive.cpp | 2 | ||||
-rw-r--r-- | src/expand/macro_rules.cpp | 5 | ||||
-rw-r--r-- | src/hir/deserialise.cpp | 2 | ||||
-rw-r--r-- | src/hir/from_ast.cpp | 13 | ||||
-rw-r--r-- | src/hir/serialise.cpp | 2 | ||||
-rw-r--r-- | src/main.cpp | 2 | ||||
-rw-r--r-- | src/mir/optimise.cpp | 2 | ||||
-rw-r--r-- | tools/minicargo/build.cpp | 5 |
9 files changed, 39 insertions, 5 deletions
diff --git a/lib/libproc_macro/src/lib.rs b/lib/libproc_macro/src/lib.rs index a8e34f53..5db439b2 100644 --- a/lib/libproc_macro/src/lib.rs +++ b/lib/libproc_macro/src/lib.rs @@ -515,3 +515,14 @@ pub fn send_token_stream(ts: TokenStream) } } } + +pub struct MacroDesc +{ + name: &'static str, + handler: fn(TokenStream)->TokenStream, +} + +pub fn main(macros: &[MacroDesc]) +{ +} + diff --git a/src/expand/derive.cpp b/src/expand/derive.cpp index 9d8169ad..d0328e98 100644 --- a/src/expand/derive.cpp +++ b/src/expand/derive.cpp @@ -2213,7 +2213,7 @@ static void derive_item(const Span& sp, const AST::Crate& crate, AST::Module& mo } // Support custom derive - auto mac_name = FMT("deriving#" << trait.name()); + auto mac_name = FMT("derive#" << trait.name()); // - Requires support all through the chain. for(const auto& mac_path : mod.m_macro_imports) { diff --git a/src/expand/macro_rules.cpp b/src/expand/macro_rules.cpp index 7faa8223..e297d670 100644 --- a/src/expand/macro_rules.cpp +++ b/src/expand/macro_rules.cpp @@ -60,6 +60,11 @@ class CMacroUseHandler: DEBUG("Imported " << name << "!"); mod.add_macro_import( name, mac ); }); + for(const auto& p : ec.m_hir->m_proc_macros) + { + mod.m_macro_imports.push_back(::std::make_pair( p.m_components, nullptr )); + mod.m_macro_imports.back().first.insert( mod.m_macro_imports.back().first.begin(), p.m_crate_name ); + } } ) else TU_IFLET( ::AST::Item, i, Module, submod, diff --git a/src/hir/deserialise.cpp b/src/hir/deserialise.cpp index c5867542..8023be3c 100644 --- a/src/hir/deserialise.cpp +++ b/src/hir/deserialise.cpp @@ -1210,6 +1210,8 @@ namespace { rv.m_ext_libs = deserialise_vec< ::HIR::ExternLibrary>(); rv.m_link_paths = deserialise_vec< ::std::string>(); + rv.m_proc_macros = deserialise_vec< ::HIR::SimplePath>(); + return rv; } } diff --git a/src/hir/from_ast.cpp b/src/hir/from_ast.cpp index 8c072cc5..ddee6bdb 100644 --- a/src/hir/from_ast.cpp +++ b/src/hir/from_ast.cpp @@ -1702,6 +1702,19 @@ public: } } } + // - Proc Macros + if( crate.m_crate_type == ::AST::Crate::Type::ProcMacro ) + { + for(const auto& ent : crate.m_proc_macros) + { + // Register under an invalid simplepath + rv.m_proc_macros.push_back( ::HIR::SimplePath("", { ent.first }) ); + } + } + else + { + ASSERT_BUG(Span(), crate.m_proc_macros.size() == 0, "Procedural macros defined in non proc-macro crate"); + } auto sp = Span(); // - Store the lang item paths so conversion code can use them. diff --git a/src/hir/serialise.cpp b/src/hir/serialise.cpp index d80154ed..2705293c 100644 --- a/src/hir/serialise.cpp +++ b/src/hir/serialise.cpp @@ -273,6 +273,8 @@ namespace { } serialise_vec(crate.m_ext_libs); serialise_vec(crate.m_link_paths); + + serialise_vec(crate.m_proc_macros); } void serialise(const ::HIR::ExternLibrary& lib) { diff --git a/src/main.cpp b/src/main.cpp index 7769b4bc..bd21013d 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -328,7 +328,7 @@ int main(int argc, char *argv[]) // Allocator and panic strategies CompilePhaseV("Implicit Crates", [&]() { - if( crate.m_crate_type == ::AST::Crate::Type::Executable || params.test_harness ) + if( crate.m_crate_type == ::AST::Crate::Type::Executable || params.test_harness || crate.m_crate_type == ::AST::Crate::Type::ProcMacro ) { // TODO: Detect if an allocator crate is already present. crate.load_extern_crate(Span(), "alloc_system"); diff --git a/src/mir/optimise.cpp b/src/mir/optimise.cpp index 2d336457..42c58acb 100644 --- a/src/mir/optimise.cpp +++ b/src/mir/optimise.cpp @@ -1731,7 +1731,7 @@ bool MIR_Optimise_ConstPropagte(::MIR::TypeResolve& state, ::MIR::Function& fcn) } else if( tef.name == "mrustc_slice_len" ) { - MIR_ASSERT(state, te.args.at(0).is_LValue(), "Argument to `get_dst_meta` must be a lvalue"); + MIR_ASSERT(state, te.args.at(0).is_LValue(), "Argument to `mrustc_slice_len` must be a lvalue"); auto& e = te.args.at(0).as_LValue(); bb.statements.push_back(::MIR::Statement::make_Assign({ mv$(te.ret_val), ::MIR::RValue::make_DstMeta({ mv$(e) }) })); bb.terminator = ::MIR::Terminator::make_Goto(te.ret_block); diff --git a/tools/minicargo/build.cpp b/tools/minicargo/build.cpp index 51d861d2..00733271 100644 --- a/tools/minicargo/build.cpp +++ b/tools/minicargo/build.cpp @@ -359,8 +359,9 @@ Builder::Builder(BuildOptions opts): switch(target.m_type) { case PackageTarget::Type::Lib: - if(crate_type) - *crate_type = "rlib"; + if(crate_type) { + *crate_type = target.m_is_proc_macro ? "proc-macro" : "rlib"; + } outfile /= ::format("lib", target.m_name, crate_suffix, ".hir"); break; case PackageTarget::Type::Bin: |