namespace Rust {
namespace Imports {
-ExternCrate::ExternCrate (Import::Stream &stream,
+ExternCrate::ExternCrate (Import::Stream &stream) : import_stream (stream) {}
+
+ExternCrate::ExternCrate (const std::string &crate_name,
std::vector<ProcMacro::Procmacro> macros)
- : import_stream (stream), proc_macros (macros)
+ : proc_macros (macros), crate_name (crate_name)
{}
ExternCrate::~ExternCrate () {}
bool
ExternCrate::ok () const
{
- return !import_stream.saw_error ();
+ return !import_stream->get ().saw_error ();
}
bool
ExternCrate::load (location_t locus)
{
+ rust_assert (this->import_stream.has_value ());
+ auto &import_stream = this->import_stream->get ();
// match header
import_stream.require_bytes (locus, Metadata::kMagicHeader,
sizeof (Metadata::kMagicHeader));
#include "rust-system.h"
#include "rust-imports.h"
+#include "optional.h"
namespace Rust {
namespace Imports {
class ExternCrate
{
public:
- ExternCrate (Import::Stream &stream,
+ ExternCrate (Import::Stream &stream);
+ ExternCrate (const std::string &crate_name,
std::vector<ProcMacro::Procmacro> macros);
~ExternCrate ();
bool is_neg_ok, int *ret);
private:
- Import::Stream &import_stream;
+ tl::optional<std::reference_wrapper<Import::Stream>> import_stream;
std::vector<ProcMacro::Procmacro> proc_macros;
std::string crate_name;
{
for (auto &item : crate.items)
item->accept_vis (*this);
-
- 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 ());
- if (!res)
- {
- rust_error_at (UNKNOWN_LOCATION, ErrorCode::E0428,
- "macro %qs defined multiple times",
- derive.get_trait_name ().c_str ());
- }
- }
- for (auto &attribute : attribute_macros)
- {
- auto res = ctx.macros.insert_at_root (attribute.get_name (),
- attribute.get_node_id ());
- if (!res)
- {
- rust_error_at (UNKNOWN_LOCATION, ErrorCode::E0428,
- "macro %qs defined multiple times",
- attribute.get_name ().c_str ());
- }
- }
- for (auto &bang : bang_macros)
- {
- auto res
- = ctx.macros.insert_at_root (bang.get_name (), bang.get_node_id ());
- if (!res)
- {
- rust_error_at (UNKNOWN_LOCATION, ErrorCode::E0428,
- "macro %qs defined multiple times",
- bang.get_name ().c_str ());
- }
- }
}
void
module.get_name ());
}
+void
+TopLevel::visit (AST::ExternCrate &crate)
+{
+ CrateNum num;
+ if (!Analysis::Mappings::get ()->lookup_crate_name (
+ crate.get_referenced_crate (), num))
+ rust_unreachable ();
+
+ auto attribute_macros
+ = Analysis::Mappings::get ()->lookup_attribute_proc_macros (num);
+
+ auto bang_macros = Analysis::Mappings::get ()->lookup_bang_proc_macros (num);
+
+ auto derive_macros
+ = Analysis::Mappings::get ()->lookup_derive_proc_macros (num);
+
+ auto sub_visitor = [&] () {
+ if (derive_macros.has_value ())
+ for (auto &derive : derive_macros.value ())
+ {
+ auto res = ctx.macros.insert (derive.get_trait_name (),
+ derive.get_node_id ());
+ if (!res)
+ {
+ rust_error_at (UNKNOWN_LOCATION, ErrorCode::E0428,
+ "macro %qs defined multiple times",
+ derive.get_trait_name ().c_str ());
+ }
+ }
+ if (attribute_macros.has_value ())
+ for (auto &attribute : attribute_macros.value ())
+ {
+ auto res = ctx.macros.insert (attribute.get_name (),
+ attribute.get_node_id ());
+ if (!res)
+ {
+ rust_error_at (UNKNOWN_LOCATION, ErrorCode::E0428,
+ "macro %qs defined multiple times",
+ attribute.get_name ().c_str ());
+ }
+ }
+ if (bang_macros.has_value ())
+ for (auto &bang : bang_macros.value ())
+ {
+ auto res = ctx.macros.insert (bang.get_name (), bang.get_node_id ());
+ if (!res)
+ {
+ rust_error_at (UNKNOWN_LOCATION, ErrorCode::E0428,
+ "macro %qs defined multiple times",
+ bang.get_name ().c_str ());
+ }
+ }
+ };
+
+ if (crate.has_as_clause ())
+ ctx.scoped (Rib::Kind::Module, crate.get_node_id (), sub_visitor,
+ crate.get_as_clause ());
+ else
+ ctx.scoped (Rib::Kind::Module, crate.get_node_id (), sub_visitor,
+ crate.get_referenced_crate ());
+}
+
static bool
is_macro_export (AST::MacroRulesDefinition &def)
{
void visit (AST::Enum &enum_item) override;
void visit (AST::Union &union_item) override;
void visit (AST::ConstantItem &const_item) override;
+ void visit (AST::ExternCrate &crate) override;
};
} // namespace Resolver2_0
{
s = Import::open_package (import_name, locus, relative_import_path);
}
- if (s.first == NULL)
+ if (s.first == NULL && s.second.empty ())
{
rust_error_at (locus, "failed to locate crate %<%s%>",
import_name.c_str ());
return UNKNOWN_NODEID;
}
- Imports::ExternCrate extern_crate (*s.first, s.second);
- bool ok = extern_crate.load (locus);
- if (!ok)
+ auto extern_crate = s.first == nullptr
+ ? Imports::ExternCrate (crate_name, s.second)
+ : Imports::ExternCrate (*s.first);
+ if (s.first != nullptr)
{
- rust_error_at (locus, "failed to load crate metadata");
- return UNKNOWN_NODEID;
+ bool ok = extern_crate.load (locus);
+ if (!ok)
+ {
+ rust_error_at (locus, "failed to load crate metadata");
+ return UNKNOWN_NODEID;
+ }
}
// ensure the current vs this crate name don't collide
procmacrosAttributeMappings[num] = macros;
}
-bool
-Mappings::lookup_derive_proc_macros (CrateNum num,
- std::vector<CustomDeriveProcMacro> ¯os)
+tl::optional<std::vector<CustomDeriveProcMacro> &>
+Mappings::lookup_derive_proc_macros (CrateNum num)
{
auto it = procmacrosDeriveMappings.find (num);
if (it == procmacrosDeriveMappings.end ())
- return false;
-
- macros = it->second;
- return true;
+ return tl::nullopt;
+ return it->second;
}
-bool
-Mappings::lookup_bang_proc_macros (CrateNum num,
- std::vector<BangProcMacro> ¯os)
+
+tl::optional<std::vector<BangProcMacro> &>
+Mappings::lookup_bang_proc_macros (CrateNum num)
{
auto it = procmacrosBangMappings.find (num);
if (it == procmacrosBangMappings.end ())
- return false;
-
- macros = it->second;
- return true;
+ return tl::nullopt;
+ return it->second;
}
-bool
-Mappings::lookup_attribute_proc_macros (CrateNum num,
- std::vector<AttributeProcMacro> ¯os)
+
+tl::optional<std::vector<AttributeProcMacro> &>
+Mappings::lookup_attribute_proc_macros (CrateNum num)
{
auto it = procmacrosAttributeMappings.find (num);
if (it == procmacrosAttributeMappings.end ())
- return false;
-
- macros = it->second;
- return true;
+ return tl::nullopt;
+ return it->second;
}
void
#include "rust-privacy-common.h"
#include "libproc_macro_internal/proc_macro.h"
#include "rust-proc-macro.h"
+#include "optional.h"
namespace Rust {
namespace Analysis {
void insert_attribute_proc_macros (CrateNum num,
std::vector<AttributeProcMacro> macros);
- bool lookup_derive_proc_macros (CrateNum num,
- std::vector<CustomDeriveProcMacro> ¯os);
- bool lookup_bang_proc_macros (CrateNum num,
- std::vector<BangProcMacro> ¯os);
- bool lookup_attribute_proc_macros (CrateNum num,
- std::vector<AttributeProcMacro> ¯os);
+ tl::optional<std::vector<CustomDeriveProcMacro> &>
+ lookup_derive_proc_macros (CrateNum num);
+ tl::optional<std::vector<BangProcMacro> &>
+ lookup_bang_proc_macros (CrateNum num);
+ tl::optional<std::vector<AttributeProcMacro> &>
+ lookup_attribute_proc_macros (CrateNum num);
void insert_derive_proc_macro_def (NodeId id, CustomDeriveProcMacro macro);
void insert_bang_proc_macro_def (NodeId id, BangProcMacro macro);