return str + "\n";
}
+void
+Crate::inject_extern_crate (std::string name)
+{
+ items.push_back (std::make_unique<AST::ExternCrate> (
+ AST::ExternCrate (name, AST::Visibility::create_public (UNKNOWN_LOCATION),
+ {}, UNKNOWN_LOCATION)));
+}
+
std::string
Attribute::as_string () const
{
// TODO: is this the best way to do this?
}
+ void inject_extern_crate (std::string name);
+
NodeId get_node_id () const { return node_id; }
const std::vector<Attribute> &get_inner_attrs () const { return inner_attrs; }
std::vector<Attribute> &get_inner_attrs () { return inner_attrs; }
return true;
}
+static bool
+has_attribute (AST::Crate crate, std::string attribute)
+{
+ auto &crate_attrs = crate.get_inner_attrs ();
+ auto has_attr = [&attribute] (AST::Attribute &attr) {
+ return attr.as_string () == attribute;
+ };
+ return std::any_of (crate_attrs.begin (), crate_attrs.end (), has_attr);
+}
+
void
Session::init ()
{
Analysis::AttributeChecker ().go (parsed_crate);
+ if (!has_attribute (parsed_crate, std::string (Values::Attributes::NO_CORE)))
+ {
+ parsed_crate.inject_extern_crate ("core");
+ }
+
if (last_step == CompileOptions::CompileStep::Expansion)
return;
static constexpr auto &MUST_USE = "must_use";
static constexpr auto &LANG = "lang";
static constexpr auto &LINK_NAME = "link_name";
+ static constexpr auto &NO_CORE = "no_core";
static constexpr auto &LINK_SECTION = "link_section";
static constexpr auto &NO_MANGLE = "no_mangle";
static constexpr auto &EXPORT_NAME = "export_name";