void visit (HIR::LetStmt &) override {}
void visit (HIR::ExprStmtWithoutBlock &) override {}
void visit (HIR::ExprStmtWithBlock &) override {}
+ void visit (HIR::ExportedMacro &) override {}
protected:
CompileItem (Context *ctx, TyTy::BaseType *concrete, Location ref_locus)
void visit (HIR::ImplBlock &) override {}
void visit (HIR::ExternBlock &) override {}
void visit (HIR::EmptyStmt &) override {}
+ void visit (HIR::ExportedMacro &) override {}
private:
CompileStmt (Context *ctx);
stmt.get_expr ()->accept_vis (*this);
}
+void
+PrivacyReporter::visit (HIR::ExportedMacro &)
+{}
+
} // namespace Privacy
} // namespace Rust
virtual void visit (HIR::LetStmt &stmt);
virtual void visit (HIR::ExprStmtWithoutBlock &stmt);
virtual void visit (HIR::ExprStmtWithBlock &stmt);
+ virtual void visit (HIR::ExportedMacro ¯o);
Analysis::Mappings &mappings;
Rust::Resolver::Resolver &resolver;
block.get_locus ());
}
+void
+PubRestrictedVisitor::visit (HIR::ExportedMacro ¯o)
+{
+ is_restriction_valid (macro.get_mappings ().get_nodeid (),
+ macro.get_locus ());
+}
+
} // namespace Privacy
} // namespace Rust
virtual void visit (HIR::Trait &trait);
virtual void visit (HIR::ImplBlock &impl);
virtual void visit (HIR::ExternBlock &block);
+ virtual void visit (HIR::ExportedMacro ¯o);
private:
/* Stack of ancestor modules visited by this visitor */
ReachabilityVisitor::visit (HIR::ExternBlock &)
{}
+void
+ReachabilityVisitor::visit (HIR::ExportedMacro ¯o)
+{}
+
// FIXME: How can we visit Blocks in the current configuration? Have a full
// visitor?
} // namespace Privacy
virtual void visit (HIR::Trait &trait);
virtual void visit (HIR::ImplBlock &impl);
virtual void visit (HIR::ExternBlock &block);
+ virtual void visit (HIR::ExportedMacro ¯o);
private:
ReachLevel current_level;
VisibilityResolver::visit (HIR::ExternBlock &)
{}
+void
+VisibilityResolver::visit (HIR::ExportedMacro ¯o)
+{
+ resolve_and_update (¯o);
+}
+
} // namespace Privacy
} // namespace Rust
virtual void visit (HIR::Trait &trait);
virtual void visit (HIR::ImplBlock &impl);
virtual void visit (HIR::ExternBlock &block);
+ virtual void visit (HIR::ExportedMacro ¯o);
private:
Analysis::Mappings &mappings;
ConstChecker::visit (BareFunctionType &)
{}
+void
+ConstChecker::visit (ExportedMacro &)
+{}
+
} // namespace HIR
} // namespace Rust
virtual void visit (SliceType &type) override;
virtual void visit (InferredType &type) override;
virtual void visit (BareFunctionType &type) override;
+ virtual void visit (ExportedMacro ¯o) override;
};
} // namespace HIR
UnsafeChecker::visit (BareFunctionType &)
{}
+void
+UnsafeChecker::visit (ExportedMacro &)
+{}
+
} // namespace HIR
} // namespace Rust
virtual void visit (SliceType &type) override;
virtual void visit (InferredType &type) override;
virtual void visit (BareFunctionType &type) override;
+ virtual void visit (ExportedMacro ¯o) override;
};
} // namespace HIR
translated = lower_extern_block (extern_block);
}
+void
+ASTLoweringItem::visit (AST::MacroRulesDefinition &def)
+{
+ bool is_export = false;
+ for (const auto &attr : def.get_outer_attrs ())
+ if (attr.get_path ().as_string () == "macro_export")
+ is_export = true;
+
+ if (is_export)
+ {
+ auto crate_num = mappings->get_current_crate ();
+ Analysis::NodeMapping mapping (crate_num, def.get_node_id (),
+ mappings->get_next_hir_id (crate_num),
+ mappings->get_next_localdef_id (
+ crate_num));
+ auto locus = def.get_locus ();
+
+ translated
+ = new HIR::ExportedMacro (mapping, def.get_outer_attrs (), locus);
+ }
+}
+
HIR::SimplePath
ASTLoweringSimplePath::translate (const AST::SimplePath &path)
{
void visit (AST::Trait &trait) override;
void visit (AST::TraitImpl &impl_block) override;
void visit (AST::ExternBlock &extern_block) override;
+ void visit (AST::MacroRulesDefinition ¯o) override;
private:
ASTLoweringItem () : translated (nullptr) {}
void
Dump::visit (BareFunctionType &)
{}
+void
+Dump::visit (ExportedMacro &)
+{}
} // namespace HIR
} // namespace Rust
virtual void visit (SliceType &) override;
virtual void visit (InferredType &) override;
virtual void visit (BareFunctionType &) override;
+ virtual void visit (ExportedMacro &) override;
};
} // namespace HIR
class GenericParam;
class LifetimeParam;
+// FIXME: ARTHUR: Move this somewhere else
+class ExportedMacro;
+
class TraitItem;
class ImplItem;
struct Crate;
}*/
};
+class ExportedMacro : public VisItem
+{
+ Location locus;
+
+public:
+ ExportedMacro (Analysis::NodeMapping mapping, AST::AttrVec outer_attrs,
+ Location locus)
+ : VisItem (mapping, Visibility (Visibility::PUBLIC),
+ std::move (outer_attrs)),
+ locus (locus)
+ {}
+
+ virtual Location get_locus () const override;
+ virtual ItemKind get_item_kind () const override;
+ virtual ExportedMacro *clone_item_impl () const override;
+
+ void accept_vis (HIRFullVisitor &vis) override;
+ void accept_vis (HIRStmtVisitor &vis) override;
+ void accept_vis (HIRVisItemVisitor &vis) override;
+};
+
} // namespace HIR
} // namespace Rust
virtual void visit (SliceType &type) = 0;
virtual void visit (InferredType &type) = 0;
virtual void visit (BareFunctionType &type) = 0;
+ virtual void visit (ExportedMacro ¯o) = 0;
};
class HIRFullVisitorBase : public HIRFullVisitor
virtual void visit (SliceType &) override {}
virtual void visit (InferredType &) override {}
virtual void visit (BareFunctionType &) override {}
+ virtual void visit (ExportedMacro &) override {}
};
class HIRExternalItemVisitor
virtual void visit (Trait &trait) = 0;
virtual void visit (ImplBlock &impl) = 0;
virtual void visit (ExternBlock &block) = 0;
+ virtual void visit (ExportedMacro ¯o) = 0;
};
class HIRImplVisitor
virtual void visit (LetStmt &stmt) = 0;
virtual void visit (ExprStmtWithoutBlock &stmt) = 0;
virtual void visit (ExprStmtWithBlock &stmt) = 0;
+ virtual void visit (ExportedMacro ¯o) = 0;
};
class HIRExpressionVisitor
ConstGenericParam::accept_vis (HIRFullVisitor &)
{}
+void
+ExportedMacro::accept_vis (HIRVisItemVisitor &vis)
+{
+ vis.visit (*this);
+}
+
+void
+ExportedMacro::accept_vis (HIRFullVisitor &vis)
+{
+ vis.visit (*this);
+}
+
+void
+ExportedMacro::accept_vis (HIRStmtVisitor &vis)
+{
+ vis.visit (*this);
+}
+
+Location
+ExportedMacro::get_locus () const
+{
+ return locus;
+}
+
+Item::ItemKind
+ExportedMacro::get_item_kind () const
+{
+ return ItemKind::MacroExport;
+}
+
+ExportedMacro *
+ExportedMacro::clone_item_impl () const
+{
+ return new ExportedMacro (*this);
+}
+
} // namespace HIR
} // namespace Rust
Trait,
Impl,
Module,
+ MacroExport,
};
virtual ItemKind get_item_kind () const = 0;
void visit (HIR::StaticItem &) override {}
void visit (HIR::ImplBlock &) override {}
void visit (HIR::ExternBlock &) override {}
+ void visit (HIR::ExportedMacro &) override {}
void visit (HIR::Trait &trait) override { ctx.emit_trait (trait); }
// nothing to do
void visit (HIR::ExternCrate &) override {}
void visit (HIR::UseDeclaration &) override {}
+ void visit (HIR::ExportedMacro &) override {}
protected:
std::vector<TyTy::SubstitutionParamMapping>
infered = TypeCheckType::Resolve (&path);
}
+void
+TypeCheckStmt::visit (HIR::ExportedMacro &path)
+{}
+
void
TypeCheckStmt::visit (HIR::TupleStruct &struct_decl)
{
void visit (HIR::ImplBlock &impl) override;
void visit (HIR::TypePath &path) override;
void visit (HIR::QualifiedPathInType &path) override;
+ void visit (HIR::ExportedMacro &path) override;
// FIXME
// this seems like it should not be part of this visitor
dump += "ctor: " + type_string (expr.get_mappings ());
}
+ void visit (HIR::ExportedMacro &) override {}
+
protected:
std::string type_string (const Analysis::NodeMapping &mappings)
{
{"repr", CODE_GENERATION},
{"path", EXPANSION},
{"macro_use", NAME_RESOLUTION},
+ {"macro_export", CODE_GENERATION}, // FIXME: And NAME_RESOLUTION as well
// FIXME: This is not implemented yet, see
// https://github.com/Rust-GCC/gccrs/issues/1475
{"target_feature", CODE_GENERATION},