summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Hodge <tpg@ucc.asn.au>2017-11-12 18:31:27 +0800
committerJohn Hodge <tpg@ucc.asn.au>2017-11-12 18:31:27 +0800
commit1392ffdbf7a682222b99304946253aa0b70b8dc5 (patch)
treea858d940aaa92cd5f81952ac06685bf351e64ade
parent4912b243930dba3111e090f57f9e3ffa9f7deeb9 (diff)
downloadmrust-1392ffdbf7a682222b99304946253aa0b70b8dc5.tar.gz
All - proc_macro support through to attempting to run them
-rw-r--r--lib/libproc_macro/src/lib.rs11
-rw-r--r--src/expand/derive.cpp2
-rw-r--r--src/expand/macro_rules.cpp5
-rw-r--r--src/hir/deserialise.cpp2
-rw-r--r--src/hir/from_ast.cpp13
-rw-r--r--src/hir/serialise.cpp2
-rw-r--r--src/main.cpp2
-rw-r--r--src/mir/optimise.cpp2
-rw-r--r--tools/minicargo/build.cpp5
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: