visit (static_cast<AttrInputLiteral &> (attrib.get_attr_input ()));
break;
}
+ case AST::AttrInput::AttrInputType::MACRO: {
+ visit (static_cast<AttrInputMacro &> (attrib.get_attr_input ()));
+ break;
+ }
case AST::AttrInput::AttrInputType::META_ITEM: {
visit (static_cast<AttrInputMetaItemContainer &> (
attrib.get_attr_input ()));
visit (literal.get_literal ());
}
+void
+TokenCollector::visit (AttrInputMacro ¯o)
+{
+ tokens.push_back (Rust::Token::make (EQUAL, Location ()));
+ visit (macro.get_macro ());
+}
+
void
TokenCollector::visit (MetaItemLitExpr &item)
{
// rust-expr.h
void visit (LiteralExpr &expr);
void visit (AttrInputLiteral &attr_input);
+ void visit (AttrInputMacro &attr_input);
void visit (MetaItemLitExpr &meta_item);
void visit (MetaItemPathLit &meta_item);
void visit (BorrowExpr &expr);
Dump::visit (AttrInputLiteral &)
{}
+void
+Dump::visit (AttrInputMacro &)
+{}
+
void
Dump::visit (MetaItemLitExpr &)
{}
// rust-expr.h
void visit (LiteralExpr &expr);
void visit (AttrInputLiteral &attr_input);
+ void visit (AttrInputMacro &attr_input);
void visit (MetaItemLitExpr &meta_item);
void visit (MetaItemPathLit &meta_item);
void visit (BorrowExpr &expr);
class ExprWithBlock;
class LiteralExpr;
class AttrInputLiteral;
+class AttrInputMacro;
class MetaItemLitExpr;
class MetaItemPathLit;
class OperatorExpr;
// rust-expr.h
virtual void visit (LiteralExpr &expr) = 0;
virtual void visit (AttrInputLiteral &attr_input) = 0;
+ virtual void visit (AttrInputMacro &attr_input) = 0;
virtual void visit (MetaItemLitExpr &meta_item) = 0;
virtual void visit (MetaItemPathLit &meta_item) = 0;
virtual void visit (BorrowExpr &expr) = 0;
return str + ")";
}
+std::string
+AttrInputMacro::as_string () const
+{
+ return " = " + macro->as_string ();
+}
+
/* Override that calls the function recursively on all items contained within
* the module. */
void
}
}
+// needed here because "rust-expr.h" doesn't include "rust-macro.h"
+AttrInputMacro::AttrInputMacro (const AttrInputMacro &oth)
+ : macro (oth.macro->clone_macro_invocation_impl ())
+{}
+
+void
+AttrInputMacro::operator= (const AttrInputMacro &oth)
+{
+ macro = std::unique_ptr<MacroInvocation> (
+ oth.macro->clone_macro_invocation_impl ());
+}
+
/* Visitor implementations - these are short but inlining can't happen anyway
* due to virtual functions and I didn't want to make the ast header includes
* any longer than they already are. */
vis.visit (*this);
}
+void
+AttrInputMacro::accept_vis (ASTVisitor &vis)
+{
+ vis.visit (*this);
+}
+
void
MetaItemLitExpr::accept_vis (ASTVisitor &vis)
{
enum AttrInputType
{
LITERAL,
+ MACRO,
META_ITEM,
TOKEN_TREE,
};
}
};
+// Like an AttrInputLiteral, but stores a MacroInvocation
+class AttrInputMacro : public AttrInput
+{
+ std::unique_ptr<MacroInvocation> macro;
+
+public:
+ AttrInputMacro (std::unique_ptr<MacroInvocation> macro)
+ : macro (std::move (macro))
+ {}
+
+ AttrInputMacro (const AttrInputMacro &oth);
+
+ AttrInputMacro (AttrInputMacro &&oth) : macro (std::move (oth.macro)) {}
+
+ void operator= (const AttrInputMacro &oth);
+
+ void operator= (AttrInputMacro &&oth) { macro = std::move (oth.macro); }
+
+ std::string as_string () const override;
+
+ void accept_vis (ASTVisitor &vis) override;
+
+ // assuming this can't be a cfg predicate
+ bool check_cfg_predicate (const Session &) const override { return false; }
+
+ // assuming this is like AttrInputLiteral
+ bool is_meta_item () const override { return false; }
+
+ std::unique_ptr<MacroInvocation> &get_macro () { return macro; }
+
+ AttrInputType get_attr_input_type () const final override
+ {
+ return AttrInput::AttrInputType::MACRO;
+ }
+
+protected:
+ AttrInputMacro *clone_attr_input_impl () const override
+ {
+ return new AttrInputMacro (*this);
+ }
+};
+
/* literal expr only meta item inner - TODO possibly replace with inheritance of
* LiteralExpr itself? */
class MetaItemLitExpr : public MetaItemInner
void visit (AST::QualifiedPathInType &path) override {}
void visit (AST::LiteralExpr &expr) override {}
void visit (AST::AttrInputLiteral &attr_input) override {}
+ void visit (AST::AttrInputMacro &attr_input) override {}
void visit (AST::MetaItemLitExpr &meta_item) override {}
void visit (AST::MetaItemPathLit &meta_item) override {}
void visit (AST::BorrowExpr &expr) override {}
// shouldn't require?
}
void
+CfgStrip::visit (AST::AttrInputMacro &)
+{
+ // shouldn't require?
+}
+void
CfgStrip::visit (AST::MetaItemLitExpr &)
{
// shouldn't require?
void visit (AST::LiteralExpr &expr) override;
void visit (AST::AttrInputLiteral &) override;
+ void visit (AST::AttrInputMacro &) override;
void visit (AST::MetaItemLitExpr &) override;
void visit (AST::MetaItemPathLit &) override;
void visit (AST::BorrowExpr &expr) override;
ExpandVisitor::visit (AST::AttrInputLiteral &)
{}
+void
+ExpandVisitor::visit (AST::AttrInputMacro ¯o)
+{
+ rust_sorry_at (Location (), "macros in attributes not supported");
+}
+
void
ExpandVisitor::visit (AST::MetaItemLitExpr &)
{}
void visit (AST::LiteralExpr &expr) override;
void visit (AST::AttrInputLiteral &) override;
+ void visit (AST::AttrInputMacro &) override;
void visit (AST::MetaItemLitExpr &) override;
void visit (AST::MetaItemPathLit &) override;
void visit (AST::BorrowExpr &expr) override;
ASTLoweringBase::visit (AST::AttrInputLiteral &)
{}
void
+ASTLoweringBase::visit (AST::AttrInputMacro &)
+{}
+void
ASTLoweringBase::visit (AST::MetaItemLitExpr &)
{}
void
// rust-expr.h
virtual void visit (AST::LiteralExpr &expr);
virtual void visit (AST::AttrInputLiteral &attr_input);
+ virtual void visit (AST::AttrInputMacro &attr_input);
virtual void visit (AST::MetaItemLitExpr &meta_item);
virtual void visit (AST::MetaItemPathLit &meta_item);
virtual void visit (AST::BorrowExpr &expr);
ResolverBase::visit (AST::AttrInputLiteral &)
{}
+void
+ResolverBase::visit (AST::AttrInputMacro &)
+{}
+
void
ResolverBase::visit (AST::MetaItemLitExpr &)
{}
void visit (AST::QualifiedPathInType &);
void visit (AST::LiteralExpr &);
void visit (AST::AttrInputLiteral &);
+ void visit (AST::AttrInputMacro &);
void visit (AST::MetaItemLitExpr &);
void visit (AST::MetaItemPathLit &);
void visit (AST::BorrowExpr &);
EarlyNameResolver::visit (AST::AttrInputLiteral &)
{}
+void
+EarlyNameResolver::visit (AST::AttrInputMacro &)
+{}
+
void
EarlyNameResolver::visit (AST::MetaItemLitExpr &)
{}
virtual void visit (AST::QualifiedPathInType &path);
virtual void visit (AST::LiteralExpr &expr);
virtual void visit (AST::AttrInputLiteral &attr_input);
+ virtual void visit (AST::AttrInputMacro &attr_input);
virtual void visit (AST::MetaItemLitExpr &meta_item);
virtual void visit (AST::MetaItemPathLit &meta_item);
virtual void visit (AST::BorrowExpr &expr);
switch (attribute.get_attr_input ().get_attr_input_type ())
{
case AST::AttrInput::LITERAL:
+ case AST::AttrInput::MACRO:
case AST::AttrInput::META_ITEM:
break;
// FIXME: Handle them as well
AttributeChecker::visit (AST::AttrInputLiteral &)
{}
+void
+AttributeChecker::visit (AST::AttrInputMacro &)
+{}
+
void
AttributeChecker::visit (AST::MetaItemLitExpr &)
{}
// rust-expr.h
void visit (AST::LiteralExpr &expr);
void visit (AST::AttrInputLiteral &attr_input);
+ void visit (AST::AttrInputMacro &attr_input);
void visit (AST::MetaItemLitExpr &meta_item);
void visit (AST::MetaItemPathLit &meta_item);
void visit (AST::BorrowExpr &expr);