diff options
author | John Hodge <tpg@mutabah.net> | 2016-06-08 12:37:51 +0800 |
---|---|---|
committer | John Hodge <tpg@mutabah.net> | 2016-06-08 12:37:51 +0800 |
commit | 40071822728499b9028400ddac3cd32fb884b2a0 (patch) | |
tree | beabbf632622601b307beb8308f1098e9da91a15 /src/include/synext_decorator.hpp | |
parent | d91e9415d3a3cd4c9cc5bfcee548d6b3b98867f5 (diff) | |
download | mrust-40071822728499b9028400ddac3cd32fb884b2a0.tar.gz |
Expand format_args! - Parse and (partially) emit
Diffstat (limited to 'src/include/synext_decorator.hpp')
-rw-r--r-- | src/include/synext_decorator.hpp | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/src/include/synext_decorator.hpp b/src/include/synext_decorator.hpp new file mode 100644 index 00000000..5ae1af53 --- /dev/null +++ b/src/include/synext_decorator.hpp @@ -0,0 +1,75 @@ +/* + */ +#pragma once +#ifndef _SYNEXT_DECORATOR_HPP_ +#define _SYNEXT_DECORATOR_HPP_ + +#include <string> +#include <memory> +#include <span.hpp> +#include "../ast/item.hpp" + +class TypeRef; +namespace AST { + class Crate; + class MetaItem; + class Path; + + struct StructItem; + struct TupleItem; + struct EnumVariant; + + class Module; + class Item; + + class Expr; + class ExprNode; + struct ExprNode_Match_Arm; + + class MacroInvocation; + + class ImplDef; +} + +enum class AttrStage +{ + EarlyPre, + EarlyPost, + LatePre, + LatePost, +}; + +class ExpandDecorator +{ + void unexpected(const Span& sp, const AST::MetaItem& mi, const char* loc_str) const; +public: + virtual AttrStage stage() const = 0; + + virtual void handle(const Span& sp, const AST::MetaItem& mi, AST::Crate& crate) const { unexpected(sp, mi, "crate"); } + virtual void handle(const Span& sp, const AST::MetaItem& mi, AST::Crate& crate, AST::MacroInvocation& mac) const { unexpected(sp, mi, "macro invocation"); } + virtual void handle(const Span& sp, const AST::MetaItem& mi, AST::Crate& crate, const AST::Path& path, AST::Module& mod, AST::Item&i) const { unexpected(sp, mi, "item"); } + // NOTE: To delete, set the type to `_` + virtual void handle(const Span& sp, const AST::MetaItem& mi, AST::Crate& crate, const AST::Module& mod, AST::ImplDef& impl) const { unexpected(sp, mi, "impl"); } + // NOTE: To delete, clear the name + virtual void handle(const Span& sp, const AST::MetaItem& mi, AST::Crate& crate, ::AST::StructItem& si) const { unexpected(sp, mi, "struct item"); } + // NOTE: To delete, make the type invalid + virtual void handle(const Span& sp, const AST::MetaItem& mi, AST::Crate& crate, ::AST::TupleItem& si) const { unexpected(sp, mi, "tuple item"); } + // NOTE: To delete, clear the name + virtual void handle(const Span& sp, const AST::MetaItem& mi, AST::Crate& crate, ::AST::EnumVariant& ev) const { unexpected(sp, mi, "enum variant"); } + + virtual void handle(const Span& sp, const AST::MetaItem& mi, AST::Crate& crate, ::std::unique_ptr<AST::ExprNode>& expr) const { unexpected(sp, mi, "expression"); } + // NOTE: To delete, clear the patterns vector + virtual void handle(const Span& sp, const AST::MetaItem& mi, AST::Crate& crate, ::AST::ExprNode_Match_Arm& expr) const { unexpected(sp, mi, "match arm"); } +}; + +#define STATIC_DECORATOR(ident, _handler_class) \ + struct register_##_handler_class##_c {\ + register_##_handler_class##_c() {\ + Register_Synext_Decorator( ident, ::std::unique_ptr<ExpandDecorator>(new _handler_class()) ); \ + } \ + } s_register_##_handler_class; + +extern void Register_Synext_Decorator(::std::string name, ::std::unique_ptr<ExpandDecorator> handler); + +#endif + |