}
};
-class BangProcMacro
-{
-private:
- std::string name;
- NodeId node_id;
- ProcMacro::BangMacro macro;
-
-public:
- BangProcMacro (ProcMacro::Bang macro)
- : name (macro.name),
- node_id (Analysis::Mappings::get ()->get_next_node_id ()),
- macro (macro.macro)
- {}
-
- const std::string &get_name () const { return name; }
-
- NodeId get_node_id () const { return node_id; }
-
- ProcMacro::BangMacro get_handle () const { return macro; }
-};
-
-class AttributeProcMacro
-{
-private:
- std::string name;
- NodeId node_id;
- ProcMacro::AttributeMacro macro;
-
-public:
- AttributeProcMacro (ProcMacro::Attribute macro)
- : name (macro.name),
- node_id (Analysis::Mappings::get ()->get_next_node_id ()),
- macro (macro.macro)
- {}
-
- const std::string &get_name () const { return name; }
-
- NodeId get_node_id () const { return node_id; }
-
- ProcMacro::AttributeMacro get_handle () const { return macro; }
-};
-
-class CustomDeriveProcMacro
-{
-private:
- std::string trait_name;
- std::vector<std::string> attributes;
- NodeId node_id;
- ProcMacro::CustomDeriveMacro macro;
-
-public:
- CustomDeriveProcMacro (ProcMacro::CustomDerive macro)
- : trait_name (macro.trait_name),
- attributes (macro.attributes, macro.attributes + macro.attr_size),
- node_id (Analysis::Mappings::get ()->get_next_node_id ()),
- macro (macro.macro)
- {}
-
- const std::string &get_trait_name () const { return trait_name; }
-
- NodeId get_node_id () const { return node_id; }
-
- ProcMacro::CustomDeriveMacro get_handle () const { return macro; }
-};
-
// A crate AST object - holds all the data for a single compilation unit
struct Crate
{
NodeId node_id;
- std::vector<AttributeProcMacro> attribute_macros;
- std::vector<CustomDeriveProcMacro> derive_macros;
- std::vector<BangProcMacro> bang_macros;
-
public:
// Constructor
Crate (std::vector<std::unique_ptr<Item>> items,
NodeId get_node_id () const { return node_id; }
const std::vector<Attribute> &get_inner_attrs () const { return inner_attrs; }
- const std::vector<AttributeProcMacro> &get_attribute_macros () const
- {
- return attribute_macros;
- }
-
- const std::vector<CustomDeriveProcMacro> &get_derive_macros () const
- {
- return derive_macros;
- }
-
- const std::vector<BangProcMacro> &get_bang_macros () const
- {
- return bang_macros;
- }
-
std::vector<std::unique_ptr<AST::Item>> take_items ()
{
return std::move (items);
{
items = std::move (new_items);
}
-
- void add_bang_macro (ProcMacro::Bang macro) { bang_macros.push_back (macro); }
- void add_attribute_macro (ProcMacro::Attribute macro)
- {
- attribute_macros.push_back (macro);
- }
- void add_derive_macro (ProcMacro::CustomDerive macro)
- {
- derive_macros.push_back (macro);
- }
};
// Base path expression AST node - abstract
template <typename T>
AST::Fragment expand_derive_proc_macro (T &item, AST::SimplePath &path)
{
- ProcMacro::CustomDerive macro;
+ CustomDeriveProcMacro macro;
if (!mappings->lookup_derive_proc_macro_invocation (path, macro))
{
rust_error_at (path.get_locus (), "Macro not found");
auto c = collector.collect_tokens ();
std::vector<const_TokenPtr> vec (c.cbegin (), c.cend ());
- return parse_proc_macro_output (macro.macro (convert (vec)));
+ return parse_proc_macro_output (macro.get_handle () (convert (vec)));
}
template <typename T>
AST::Fragment expand_bang_proc_macro (T &item,
AST::MacroInvocation &invocation)
{
- ProcMacro::Bang macro;
+ BangProcMacro macro;
if (!mappings->lookup_bang_proc_macro_invocation (invocation, macro))
{
rust_error_at (invocation.get_locus (), "Macro not found");
auto c = collector.collect_tokens ();
std::vector<const_TokenPtr> vec (c.cbegin (), c.cend ());
- return parse_proc_macro_output (macro.macro (convert (vec)));
+ return parse_proc_macro_output (macro.get_handle () (convert (vec)));
}
template <typename T>
AST::Fragment expand_attribute_proc_macro (T &item, AST::SimplePath &path)
{
- ProcMacro::Attribute macro;
+ AttributeProcMacro macro;
if (!mappings->lookup_attribute_proc_macro_invocation (path, macro))
{
rust_error_at (path.get_locus (), "Macro not found");
// FIXME: Handle attributes
return parse_proc_macro_output (
- macro.macro (ProcMacro::TokenStream::make_tokenstream (), convert (vec)));
+ macro.get_handle () (ProcMacro::TokenStream::make_tokenstream (),
+ convert (vec)));
}
/**
#include "rust-proc-macro.h"
#include "rust-lex.h"
#include "rust-token-converter.h"
+#include "rust-attributes.h"
#ifndef _WIN32
#include <dlfcn.h>
#endif
namespace Rust {
+BangProcMacro::BangProcMacro (ProcMacro::Bang macro)
+ : name (macro.name),
+ node_id (Analysis::Mappings::get ()->get_next_node_id ()),
+ macro (macro.macro)
+{}
+
+AttributeProcMacro::AttributeProcMacro (ProcMacro::Attribute macro)
+ : name (macro.name),
+ node_id (Analysis::Mappings::get ()->get_next_node_id ()),
+ macro (macro.macro)
+{}
+
+CustomDeriveProcMacro::CustomDeriveProcMacro (ProcMacro::CustomDerive macro)
+ : trait_name (macro.trait_name),
+ attributes (macro.attributes, macro.attributes + macro.attr_size),
+ node_id (Analysis::Mappings::get ()->get_next_node_id ()),
+ macro (macro.macro)
+{}
+
const std::string PROC_MACRO_DECL_PREFIX = "__gccrs_proc_macro_decls_";
namespace {
#define RUST_PROC_MACRO_H
#include "libproc_macro_internal/proc_macro.h"
+#include "rust-mapping-common.h"
namespace Rust {
+
+class BangProcMacro
+{
+private:
+ std::string name;
+ NodeId node_id;
+ ProcMacro::BangMacro macro;
+
+public:
+ BangProcMacro (ProcMacro::Bang macro);
+ BangProcMacro () = default;
+
+ const std::string &get_name () const { return name; }
+
+ NodeId get_node_id () const { return node_id; }
+
+ ProcMacro::BangMacro get_handle () const { return macro; }
+};
+
+class AttributeProcMacro
+{
+private:
+ std::string name;
+ NodeId node_id;
+ ProcMacro::AttributeMacro macro;
+
+public:
+ AttributeProcMacro (ProcMacro::Attribute macro);
+ AttributeProcMacro () = default;
+
+ const std::string &get_name () const { return name; }
+
+ NodeId get_node_id () const { return node_id; }
+
+ ProcMacro::AttributeMacro get_handle () const { return macro; }
+};
+
+class CustomDeriveProcMacro
+{
+private:
+ std::string trait_name;
+ std::vector<std::string> attributes;
+ NodeId node_id;
+ ProcMacro::CustomDeriveMacro macro;
+
+public:
+ CustomDeriveProcMacro (ProcMacro::CustomDerive macro);
+ CustomDeriveProcMacro () = default;
+
+ const std::string &get_trait_name () const { return trait_name; }
+
+ NodeId get_node_id () const { return node_id; }
+
+ ProcMacro::CustomDeriveMacro get_handle () const { return macro; }
+};
+
/**
* Load a procedural macro library and collect its entrypoints.
*
for (auto &item : crate.items)
item->accept_vis (*this);
- for (auto &derive : crate.get_derive_macros ())
+ std::vector<CustomDeriveProcMacro> derive_macros;
+ std::vector<AttributeProcMacro> attribute_macros;
+ std::vector<BangProcMacro> bang_macros;
+
+ Analysis::Mappings::get ()->lookup_attribute_proc_macros (
+ crate.get_node_id (), attribute_macros);
+ Analysis::Mappings::get ()->lookup_bang_proc_macros (crate.get_node_id (),
+ bang_macros);
+ Analysis::Mappings::get ()->lookup_derive_proc_macros (crate.get_node_id (),
+ derive_macros);
+
+ for (auto &derive : derive_macros)
{
auto res = ctx.macros.insert_at_root (derive.get_trait_name (),
derive.get_node_id ());
derive.get_trait_name ().c_str ());
}
}
- for (auto &attribute : crate.get_attribute_macros ())
+ for (auto &attribute : attribute_macros)
{
auto res = ctx.macros.insert_at_root (attribute.get_name (),
attribute.get_node_id ());
attribute.get_name ().c_str ());
}
}
- for (auto &bang : crate.get_bang_macros ())
+ for (auto &bang : bang_macros)
{
auto res
= ctx.macros.insert_at_root (bang.get_name (), bang.get_node_id ());
AST::Crate &parsed_crate
= mappings->insert_ast_crate (std::move (metadata_crate), crate_num);
+ std::vector<AttributeProcMacro> attribute_macros;
+ std::vector<CustomDeriveProcMacro> derive_macros;
+ std::vector<BangProcMacro> bang_macros;
+
for (auto ¯o : extern_crate.get_proc_macros ())
{
switch (macro.tag)
{
case ProcMacro::CUSTOM_DERIVE:
- parsed_crate.add_derive_macro (macro.payload.custom_derive);
+ derive_macros.push_back (macro.payload.custom_derive);
break;
case ProcMacro::ATTR:
- parsed_crate.add_attribute_macro (macro.payload.attribute);
+ attribute_macros.push_back (macro.payload.attribute);
break;
case ProcMacro::BANG:
- parsed_crate.add_bang_macro (macro.payload.bang);
+ bang_macros.push_back (macro.payload.bang);
break;
default:
gcc_unreachable ();
}
}
+ mappings->insert_attribute_proc_macros (crate_num, attribute_macros);
+ mappings->insert_bang_proc_macros (crate_num, bang_macros);
+ mappings->insert_derive_proc_macros (crate_num, derive_macros);
+
// name resolve it
Resolver::NameResolution::Resolve (parsed_crate);
}
void
-Mappings::insert_derive_proc_macros (
- CrateNum num, std::vector<ProcMacro::CustomDerive> macros)
+Mappings::insert_derive_proc_macros (CrateNum num,
+ std::vector<CustomDeriveProcMacro> macros)
{
auto it = procmacrosDeriveMappings.find (num);
rust_assert (it == procmacrosDeriveMappings.end ());
void
Mappings::insert_bang_proc_macros (CrateNum num,
- std::vector<ProcMacro::Bang> macros)
+ std::vector<BangProcMacro> macros)
{
auto it = procmacrosBangMappings.find (num);
rust_assert (it == procmacrosBangMappings.end ());
}
void
-Mappings::insert_attribute_proc_macros (
- CrateNum num, std::vector<ProcMacro::Attribute> macros)
+Mappings::insert_attribute_proc_macros (CrateNum num,
+ std::vector<AttributeProcMacro> macros)
{
auto it = procmacrosAttributeMappings.find (num);
rust_assert (it == procmacrosAttributeMappings.end ());
}
bool
-Mappings::lookup_derive_proc_macros (
- CrateNum num, std::vector<ProcMacro::CustomDerive> ¯os)
+Mappings::lookup_derive_proc_macros (CrateNum num,
+ std::vector<CustomDeriveProcMacro> ¯os)
{
auto it = procmacrosDeriveMappings.find (num);
if (it == procmacrosDeriveMappings.end ())
}
bool
Mappings::lookup_bang_proc_macros (CrateNum num,
- std::vector<ProcMacro::Bang> ¯os)
+ std::vector<BangProcMacro> ¯os)
{
auto it = procmacrosBangMappings.find (num);
if (it == procmacrosBangMappings.end ())
return true;
}
bool
-Mappings::lookup_attribute_proc_macros (
- CrateNum num, std::vector<ProcMacro::Attribute> ¯os)
+Mappings::lookup_attribute_proc_macros (CrateNum num,
+ std::vector<AttributeProcMacro> ¯os)
{
auto it = procmacrosAttributeMappings.find (num);
if (it == procmacrosAttributeMappings.end ())
}
void
-Mappings::insert_derive_proc_macro_def (NodeId id,
- ProcMacro::CustomDerive macro)
+Mappings::insert_derive_proc_macro_def (NodeId id, CustomDeriveProcMacro macro)
{
auto it = procmacroDeriveMappings.find (id);
rust_assert (it == procmacroDeriveMappings.end ());
}
void
-Mappings::insert_bang_proc_macro_def (NodeId id, ProcMacro::Bang macro)
+Mappings::insert_bang_proc_macro_def (NodeId id, BangProcMacro macro)
{
auto it = procmacroBangMappings.find (id);
rust_assert (it == procmacroBangMappings.end ());
}
void
-Mappings::insert_attribute_proc_macro_def (NodeId id,
- ProcMacro::Attribute macro)
+Mappings::insert_attribute_proc_macro_def (NodeId id, AttributeProcMacro macro)
{
auto it = procmacroAttributeMappings.find (id);
rust_assert (it == procmacroAttributeMappings.end ());
}
bool
-Mappings::lookup_derive_proc_macro_def (NodeId id,
- ProcMacro::CustomDerive ¯o)
+Mappings::lookup_derive_proc_macro_def (NodeId id, CustomDeriveProcMacro ¯o)
{
auto it = procmacroDeriveMappings.find (id);
if (it == procmacroDeriveMappings.end ())
}
bool
-Mappings::lookup_bang_proc_macro_def (NodeId id, ProcMacro::Bang ¯o)
+Mappings::lookup_bang_proc_macro_def (NodeId id, BangProcMacro ¯o)
{
auto it = procmacroBangMappings.find (id);
if (it == procmacroBangMappings.end ())
}
bool
-Mappings::lookup_attribute_proc_macro_def (NodeId id,
- ProcMacro::Attribute ¯o)
+Mappings::lookup_attribute_proc_macro_def (NodeId id, AttributeProcMacro ¯o)
{
auto it = procmacroAttributeMappings.find (id);
if (it == procmacroAttributeMappings.end ())
void
Mappings::insert_derive_proc_macro_invocation (AST::SimplePath &invoc,
- ProcMacro::CustomDerive def)
+ CustomDeriveProcMacro def)
{
auto it = procmacroDeriveInvocations.find (invoc.get_node_id ());
rust_assert (it == procmacroDeriveInvocations.end ());
bool
Mappings::lookup_derive_proc_macro_invocation (AST::SimplePath &invoc,
- ProcMacro::CustomDerive &def)
+ CustomDeriveProcMacro &def)
{
auto it = procmacroDeriveInvocations.find (invoc.get_node_id ());
if (it == procmacroDeriveInvocations.end ())
void
Mappings::insert_bang_proc_macro_invocation (AST::MacroInvocation &invoc,
- ProcMacro::Bang def)
+ BangProcMacro def)
{
auto it = procmacroBangInvocations.find (invoc.get_macro_node_id ());
rust_assert (it == procmacroBangInvocations.end ());
bool
Mappings::lookup_bang_proc_macro_invocation (AST::MacroInvocation &invoc,
- ProcMacro::Bang &def)
+ BangProcMacro &def)
{
auto it = procmacroBangInvocations.find (invoc.get_macro_node_id ());
if (it == procmacroBangInvocations.end ())
void
Mappings::insert_attribute_proc_macro_invocation (AST::SimplePath &invoc,
- ProcMacro::Attribute def)
+ AttributeProcMacro def)
{
auto it = procmacroAttributeInvocations.find (invoc.get_node_id ());
rust_assert (it == procmacroAttributeInvocations.end ());
bool
Mappings::lookup_attribute_proc_macro_invocation (AST::SimplePath &invoc,
- ProcMacro::Attribute &def)
+ AttributeProcMacro &def)
{
auto it = procmacroAttributeInvocations.find (invoc.get_node_id ());
if (it == procmacroAttributeInvocations.end ())
#include "rust-lang-item.h"
#include "rust-privacy-common.h"
#include "libproc_macro_internal/proc_macro.h"
+#include "rust-proc-macro.h"
namespace Rust {
namespace Analysis {
std::vector<NodeId> &get_exported_macros ();
void insert_derive_proc_macros (CrateNum num,
- std::vector<ProcMacro::CustomDerive> macros);
+ std::vector<CustomDeriveProcMacro> macros);
void insert_bang_proc_macros (CrateNum num,
- std::vector<ProcMacro::Bang> macros);
+ std::vector<BangProcMacro> macros);
void insert_attribute_proc_macros (CrateNum num,
- std::vector<ProcMacro::Attribute> macros);
+ std::vector<AttributeProcMacro> macros);
bool lookup_derive_proc_macros (CrateNum num,
- std::vector<ProcMacro::CustomDerive> ¯os);
+ std::vector<CustomDeriveProcMacro> ¯os);
bool lookup_bang_proc_macros (CrateNum num,
- std::vector<ProcMacro::Bang> ¯os);
+ std::vector<BangProcMacro> ¯os);
bool lookup_attribute_proc_macros (CrateNum num,
- std::vector<ProcMacro::Attribute> ¯os);
+ std::vector<AttributeProcMacro> ¯os);
- void insert_derive_proc_macro_def (NodeId id, ProcMacro::CustomDerive macro);
- void insert_bang_proc_macro_def (NodeId id, ProcMacro::Bang macro);
- void insert_attribute_proc_macro_def (NodeId id, ProcMacro::Attribute macro);
+ void insert_derive_proc_macro_def (NodeId id, CustomDeriveProcMacro macro);
+ void insert_bang_proc_macro_def (NodeId id, BangProcMacro macro);
+ void insert_attribute_proc_macro_def (NodeId id, AttributeProcMacro macro);
- bool lookup_derive_proc_macro_def (NodeId id, ProcMacro::CustomDerive ¯o);
- bool lookup_bang_proc_macro_def (NodeId id, ProcMacro::Bang ¯o);
- bool lookup_attribute_proc_macro_def (NodeId id, ProcMacro::Attribute ¯o);
+ bool lookup_derive_proc_macro_def (NodeId id, CustomDeriveProcMacro ¯o);
+ bool lookup_bang_proc_macro_def (NodeId id, BangProcMacro ¯o);
+ bool lookup_attribute_proc_macro_def (NodeId id, AttributeProcMacro ¯o);
void insert_derive_proc_macro_invocation (AST::SimplePath &invoc,
- ProcMacro::CustomDerive def);
+ CustomDeriveProcMacro def);
bool lookup_derive_proc_macro_invocation (AST::SimplePath &invoc,
- ProcMacro::CustomDerive &def);
+ CustomDeriveProcMacro &def);
void insert_bang_proc_macro_invocation (AST::MacroInvocation &invoc,
- ProcMacro::Bang def);
+ BangProcMacro def);
bool lookup_bang_proc_macro_invocation (AST::MacroInvocation &invoc_id,
- ProcMacro::Bang &def);
+ BangProcMacro &def);
void insert_attribute_proc_macro_invocation (AST::SimplePath &invoc,
- ProcMacro::Attribute def);
+ AttributeProcMacro def);
bool lookup_attribute_proc_macro_invocation (AST::SimplePath &invoc,
- ProcMacro::Attribute &def);
+ AttributeProcMacro &def);
void insert_visibility (NodeId id, Privacy::ModuleVisibility visibility);
bool lookup_visibility (NodeId id, Privacy::ModuleVisibility &def);
std::vector<NodeId> exportedMacros;
// Procedural macros
- std::map<CrateNum, std::vector<ProcMacro::CustomDerive>>
+ std::map<CrateNum, std::vector<CustomDeriveProcMacro>>
procmacrosDeriveMappings;
- std::map<CrateNum, std::vector<ProcMacro::Bang>> procmacrosBangMappings;
- std::map<CrateNum, std::vector<ProcMacro::Attribute>>
+ std::map<CrateNum, std::vector<BangProcMacro>> procmacrosBangMappings;
+ std::map<CrateNum, std::vector<AttributeProcMacro>>
procmacrosAttributeMappings;
- std::map<NodeId, ProcMacro::CustomDerive> procmacroDeriveMappings;
- std::map<NodeId, ProcMacro::Bang> procmacroBangMappings;
- std::map<NodeId, ProcMacro::Attribute> procmacroAttributeMappings;
- std::map<NodeId, ProcMacro::CustomDerive> procmacroDeriveInvocations;
- std::map<NodeId, ProcMacro::Bang> procmacroBangInvocations;
- std::map<NodeId, ProcMacro::Attribute> procmacroAttributeInvocations;
+ std::map<NodeId, CustomDeriveProcMacro> procmacroDeriveMappings;
+ std::map<NodeId, BangProcMacro> procmacroBangMappings;
+ std::map<NodeId, AttributeProcMacro> procmacroAttributeMappings;
+ std::map<NodeId, CustomDeriveProcMacro> procmacroDeriveInvocations;
+ std::map<NodeId, BangProcMacro> procmacroBangInvocations;
+ std::map<NodeId, AttributeProcMacro> procmacroAttributeInvocations;
// crate names
std::map<CrateNum, std::string> crate_names;