diff options
-rw-r--r-- | src/ast/ast.cpp | 44 | ||||
-rw-r--r-- | src/ast/ast.hpp | 69 | ||||
-rw-r--r-- | src/ast/attrs.hpp | 107 | ||||
-rw-r--r-- | src/ast/crate.cpp | 6 | ||||
-rw-r--r-- | src/ast/crate.hpp | 2 | ||||
-rw-r--r-- | src/ast/dump.cpp | 4 | ||||
-rw-r--r-- | src/ast/expr.hpp | 10 | ||||
-rw-r--r-- | src/expand/cfg.cpp | 20 | ||||
-rw-r--r-- | src/expand/cfg.hpp | 2 | ||||
-rw-r--r-- | src/expand/crate_tags.cpp | 10 | ||||
-rw-r--r-- | src/expand/derive.cpp | 26 | ||||
-rw-r--r-- | src/expand/lang_item.cpp | 8 | ||||
-rw-r--r-- | src/expand/macro_rules.cpp | 6 | ||||
-rw-r--r-- | src/expand/mod.cpp | 23 | ||||
-rw-r--r-- | src/expand/proc_macro.cpp | 6 | ||||
-rw-r--r-- | src/expand/std_prelude.cpp | 10 | ||||
-rw-r--r-- | src/expand/test.cpp | 6 | ||||
-rw-r--r-- | src/hir/from_ast.cpp | 14 | ||||
-rw-r--r-- | src/include/synext_decorator.hpp | 22 | ||||
-rw-r--r-- | src/macro_rules/eval.cpp | 2 | ||||
-rw-r--r-- | src/parse/common.hpp | 10 | ||||
-rw-r--r-- | src/parse/expr.cpp | 8 | ||||
-rw-r--r-- | src/parse/interpolated_fragment.cpp | 8 | ||||
-rw-r--r-- | src/parse/interpolated_fragment.hpp | 4 | ||||
-rw-r--r-- | src/parse/root.cpp | 105 | ||||
-rw-r--r-- | src/parse/token.cpp | 10 | ||||
-rw-r--r-- | src/parse/token.hpp | 4 | ||||
-rw-r--r-- | src/parse/tokenstream.hpp | 4 | ||||
-rw-r--r-- | src/resolve/absolute.cpp | 4 |
29 files changed, 295 insertions, 259 deletions
diff --git a/src/ast/ast.cpp b/src/ast/ast.cpp index a4825a89..641bd633 100644 --- a/src/ast/ast.cpp +++ b/src/ast/ast.cpp @@ -14,8 +14,8 @@ namespace AST { namespace { - ::std::vector<MetaItem> clone_mivec(const ::std::vector<MetaItem>& v) { - ::std::vector<MetaItem> ri; + ::std::vector<Attribute> clone_mivec(const ::std::vector<Attribute>& v) { + ::std::vector<Attribute> ri; ri.reserve(v.size()); for(const auto& i : v) ri.push_back( i.clone() ); @@ -23,19 +23,16 @@ namespace { } } -MetaItems::~MetaItems() +AttributeList AttributeList::clone() const { -} -MetaItems MetaItems::clone() const -{ - return MetaItems( m_span, clone_mivec(m_items) ); + return AttributeList( clone_mivec(m_items) ); } -void MetaItems::push_back(MetaItem i) +void AttributeList::push_back(Attribute i) { m_items.push_back( ::std::move(i) ); } -const MetaItem* MetaItems::get(const char *name) const +const Attribute* AttributeList::get(const char *name) const { for( auto& i : m_items ) { if(i.name() == name) { @@ -46,23 +43,20 @@ const MetaItem* MetaItems::get(const char *name) const return 0; } -MetaItem::~MetaItem() +Attribute Attribute::clone() const { -} -MetaItem MetaItem::clone() const -{ - TU_MATCH(MetaItemData, (m_data), (e), + TU_MATCHA( (m_data), (e), (None, - return MetaItem(m_name); + return Attribute(m_span, m_name); ), (String, - return MetaItem(m_name, e.val); + return Attribute(m_span, m_name, e.val); ), (List, - return MetaItem(m_name, clone_mivec(e.sub_items)); + return Attribute(m_span, m_name, clone_mivec(e.sub_items)); ) ) - throw ::std::runtime_error("MetaItem::clone - Fell off end"); + throw ::std::runtime_error("Attribute::clone - Fell off end"); } StructItem StructItem::clone() const @@ -109,16 +103,16 @@ Function Function::clone() const return rv; } -void Trait::add_type(::std::string name, MetaItems attrs, TypeRef type) { +void Trait::add_type(::std::string name, AttributeList attrs, TypeRef type) { m_items.push_back( Named<Item>(mv$(name), Item::make_Type({TypeAlias(GenericParams(), mv$(type))}), true) ); m_items.back().data.attrs = mv$(attrs); } -void Trait::add_function(::std::string name, MetaItems attrs, Function fcn) { +void Trait::add_function(::std::string name, AttributeList attrs, Function fcn) { DEBUG("trait fn " << name); m_items.push_back( Named<Item>(mv$(name), Item::make_Function({mv$(fcn)}), true) ); m_items.back().data.attrs = mv$(attrs); } -void Trait::add_static(::std::string name, MetaItems attrs, Static v) { +void Trait::add_static(::std::string name, AttributeList attrs, Static v) { m_items.push_back( Named<Item>(mv$(name), Item::make_Static({mv$(v)}), true) ); m_items.back().data.attrs = mv$(attrs); } @@ -301,18 +295,18 @@ void Module::add_item( Named<Item> named_item ) { DEBUG(m_my_path << "::" << i.name << " = " << i.data.tag_str() << ", attrs = " << i.data.attrs); } } -void Module::add_item(bool is_pub, ::std::string name, Item it, MetaItems attrs) { +void Module::add_item(bool is_pub, ::std::string name, Item it, AttributeList attrs) { it.attrs = mv$(attrs); add_item( Named<Item>( mv$(name), mv$(it), is_pub ) ); } -void Module::add_ext_crate(bool is_public, ::std::string ext_name, ::std::string imp_name, MetaItems attrs) { +void Module::add_ext_crate(bool is_public, ::std::string ext_name, ::std::string imp_name, AttributeList attrs) { this->add_item( is_public, imp_name, Item::make_Crate({mv$(ext_name)}), mv$(attrs) ); } -void Module::add_alias(bool is_public, UseStmt us, ::std::string name, MetaItems attrs) { +void Module::add_alias(bool is_public, UseStmt us, ::std::string name, AttributeList attrs) { this->add_item( is_public, mv$(name), Item(mv$(us)), mv$(attrs) ); } void Module::add_macro_invocation(MacroInvocation item) { - this->add_item( false, "", Item( mv$(item) ), ::AST::MetaItems {} ); + this->add_item( false, "", Item( mv$(item) ), ::AST::AttributeList {} ); } void Module::add_macro(bool is_exported, ::std::string name, MacroRulesPtr macro) { m_macros.push_back( Named<MacroRulesPtr>( mv$(name), mv$(macro), is_exported ) ); diff --git a/src/ast/ast.hpp b/src/ast/ast.hpp index 6b729f8c..3d7c2dfb 100644 --- a/src/ast/ast.hpp +++ b/src/ast/ast.hpp @@ -51,14 +51,14 @@ enum eItemType struct StructItem { - ::AST::MetaItems m_attrs; + ::AST::AttributeList m_attrs; bool m_is_public; ::std::string m_name; TypeRef m_type; //StructItem() {} - StructItem(::AST::MetaItems attrs, bool is_pub, ::std::string name, TypeRef ty): + StructItem(::AST::AttributeList attrs, bool is_pub, ::std::string name, TypeRef ty): m_attrs( mv$(attrs) ), m_is_public(is_pub), m_name( mv$(name) ), @@ -75,13 +75,13 @@ struct StructItem struct TupleItem { - ::AST::MetaItems m_attrs; + ::AST::AttributeList m_attrs; bool m_is_public; TypeRef m_type; //TupleItem() {} - TupleItem(::AST::MetaItems attrs, bool is_pub, TypeRef ty): + TupleItem(::AST::AttributeList attrs, bool is_pub, TypeRef ty): m_attrs( mv$(attrs) ), m_is_public(is_pub), m_type( mv$(ty) ) @@ -129,9 +129,6 @@ private: TypeRef m_type; Expr m_value; public: - //Static(): - // m_class(CONST) - //{} Static(Class s_class, TypeRef type, Expr value): m_class(s_class), m_type( move(type) ), @@ -155,13 +152,11 @@ public: private: Span m_span; - //::std::string m_lifetime; GenericParams m_params; Expr m_code; TypeRef m_rettype; Arglist m_args; - // TODO: ABI, const, and unsafe ::std::string m_abi; bool m_is_const; bool m_is_unsafe; @@ -172,7 +167,6 @@ public: Function(Function&&) = default; Function& operator=(Function&&) = default; - //Function() {} Function(Span sp, GenericParams params, ::std::string abi, bool is_unsafe, bool is_const, bool is_variadic, TypeRef ret_type, Arglist args); void set_code(Expr code) { m_code = ::std::move(code); } @@ -200,15 +194,18 @@ class Trait ::std::vector< Spanned<AST::Path> > m_supertraits; bool m_is_marker; + bool m_is_unsafe; NamedList<Item> m_items; public: Trait(): - m_is_marker(false) + m_is_marker(false), + m_is_unsafe(false) {} Trait(GenericParams params, ::std::vector< Spanned<Path> > supertraits): m_params( mv$(params) ), m_supertraits( mv$(supertraits) ), - m_is_marker(false) + m_is_marker(false), + m_is_unsafe(false) { } @@ -220,12 +217,14 @@ public: const NamedList<Item>& items() const { return m_items; } NamedList<Item>& items() { return m_items; } - void add_type(::std::string name, MetaItems attrs, TypeRef type); - void add_function(::std::string name, MetaItems attrs, Function fcn); - void add_static(::std::string name, MetaItems attrs, Static v); + void add_type(::std::string name, AttributeList attrs, TypeRef type); + void add_function(::std::string name, AttributeList attrs, Function fcn); + void add_static(::std::string name, AttributeList attrs, Static v); void set_is_marker(); bool is_marker() const; + void set_is_unsafe() { m_is_unsafe = true; } + bool is_unsafe() const { return m_is_unsafe; } bool has_named_item(const ::std::string& name, bool& out_is_fcn) const; @@ -252,7 +251,7 @@ TAGGED_UNION_EX(EnumVariantData, (), Value, struct EnumVariant { - MetaItems m_attrs; + AttributeList m_attrs; ::std::string m_name; EnumVariantData m_data; @@ -260,21 +259,21 @@ struct EnumVariant { } - EnumVariant(MetaItems attrs, ::std::string name, Expr&& value): + EnumVariant(AttributeList attrs, ::std::string name, Expr&& value): m_attrs( mv$(attrs) ), m_name( mv$(name) ), m_data( EnumVariantData::make_Value({mv$(value)}) ) { } - EnumVariant(MetaItems attrs, ::std::string name, ::std::vector<TypeRef> sub_types): + EnumVariant(AttributeList attrs, ::std::string name, ::std::vector<TypeRef> sub_types): m_attrs( mv$(attrs) ), m_name( ::std::move(name) ), m_data( EnumVariantData::make_Tuple( {mv$(sub_types)} ) ) { } - EnumVariant(MetaItems attrs, ::std::string name, ::std::vector<StructItem> fields): + EnumVariant(AttributeList attrs, ::std::string name, ::std::vector<StructItem> fields): m_attrs( mv$(attrs) ), m_name( ::std::move(name) ), m_data( EnumVariantData::make_Struct( {mv$(fields)} ) ) @@ -380,27 +379,29 @@ public: class ImplDef { - Span m_span; - MetaItems m_attrs; + AttributeList m_attrs; + bool m_is_unsafe; GenericParams m_params; Spanned<Path> m_trait; TypeRef m_type; public: - //ImplDef() {} - ImplDef(ImplDef&&) /*noexcept*/ = default; - ImplDef(Span sp, MetaItems attrs, GenericParams params, Spanned<Path> trait_type, TypeRef impl_type): - m_span( mv$(sp) ), + ImplDef(AttributeList attrs, GenericParams params, Spanned<Path> trait_type, TypeRef impl_type): m_attrs( mv$(attrs) ), + m_is_unsafe( false ), m_params( mv$(params) ), m_trait( mv$(trait_type) ), m_type( mv$(impl_type) ) {} + + ImplDef(ImplDef&&) /*noexcept*/ = default; ImplDef& operator=(ImplDef&&) = default; + void set_is_unsafe() { m_is_unsafe = true; } + bool is_unsafe() const { return m_is_unsafe; } + // Accessors - const Span& span() const { return m_span; } - const MetaItems& attrs() const { return m_attrs; } - MetaItems& attrs() { return m_attrs; } + const AttributeList& attrs() const { return m_attrs; } + AttributeList& attrs() { return m_attrs; } const GenericParams& params() const { return m_params; } GenericParams& params() { return m_params; } @@ -426,7 +427,6 @@ public: private: ImplDef m_def; - Span m_span; ::std::vector< ImplItem > m_items; //NamedList<TypeRef> m_types; @@ -434,7 +434,6 @@ private: //NamedList<Static> m_statics; public: - //Impl() {} Impl(Impl&&) /*noexcept*/ = default; Impl(ImplDef def): m_def( mv$(def) ) @@ -464,8 +463,6 @@ struct UseStmt ::AST::Path path; ::AST::PathBinding alt_binding; - UseStmt() - {} UseStmt(Span sp, Path p): sp(sp), path(p) @@ -553,9 +550,9 @@ public: ::std::shared_ptr<AST::Module> add_anon(); void add_item(Named<Item> item); - void add_item(bool is_pub, ::std::string name, Item it, MetaItems attrs); - void add_ext_crate(bool is_public, ::std::string ext_name, ::std::string imp_name, MetaItems attrs); - void add_alias(bool is_public, UseStmt path, ::std::string name, MetaItems attrs); + void add_item(bool is_pub, ::std::string name, Item it, AttributeList attrs); + void add_ext_crate(bool is_public, ::std::string ext_name, ::std::string imp_name, AttributeList attrs); + void add_alias(bool is_public, UseStmt path, ::std::string name, AttributeList attrs); void add_macro_invocation(MacroInvocation item); void add_macro(bool is_exported, ::std::string name, MacroRulesPtr macro); @@ -609,7 +606,7 @@ TAGGED_UNION_EX(Item, (), None, (, attrs(mv$(x.attrs))), (attrs = mv$(x.attrs);), ( public: - MetaItems attrs; + AttributeList attrs; Span span; Item clone() const; diff --git a/src/ast/attrs.hpp b/src/ast/attrs.hpp index 28bfec96..4afbdbc1 100644 --- a/src/ast/attrs.hpp +++ b/src/ast/attrs.hpp @@ -1,3 +1,10 @@ +/* + * MRustC - Rust Compiler + * - By John Hodge (Mutabah/thePowersGang) + * + * ast/attrs.hpp + * - AST Attributes (#[foo] and #![foo]) + */ #ifndef _AST_ATTRS_HPP_ #define _AST_ATTRS_HPP_ @@ -5,93 +12,117 @@ namespace AST { // -class MetaItem; +class Attribute; +::std::ostream& operator<<(::std::ostream& os, const Attribute& x); -class MetaItems +/// A list of attributes on an item (searchable by the attribute name) +class AttributeList { public: - Span m_span; - ::std::vector<MetaItem> m_items; - - virtual ~MetaItems(); - MetaItems() {} - MetaItems(MetaItems&&) = default; - MetaItems& operator=(MetaItems&&) = default; - MetaItems(const MetaItems&) = delete; - MetaItems(Span sp, ::std::vector<MetaItem> items): - m_span( mv$(sp) ), + ::std::vector<Attribute> m_items; + + AttributeList() {} + AttributeList(::std::vector<Attribute> items): m_items( mv$(items) ) { } - void push_back(MetaItem i); + // Move present + AttributeList(AttributeList&&) = default; + AttributeList& operator=(AttributeList&&) = default; + // No copy + AttributeList(const AttributeList&) = delete; + AttributeList& operator=(const AttributeList&) = delete; + // Explicit clone + AttributeList clone() const; - MetaItems clone() const; + void push_back(Attribute i); - MetaItem* get(const char *name) { return const_cast<MetaItem*>( const_cast<const MetaItems*>(this)->get(name)); } - const MetaItem* get(const char *name) const; + const Attribute* get(const char *name) const; + Attribute* get(const char *name) { + return const_cast<Attribute*>( const_cast<const AttributeList*>(this)->get(name)); + } bool has(const char *name) const { return get(name) != 0; } - friend ::std::ostream& operator<<(::std::ostream& os, const MetaItems& x) { - return os << "[" << x.m_items << "]"; + friend ::std::ostream& operator<<(::std::ostream& os, const AttributeList& x) { + for(const auto& i : x.m_items) { + os << "#[" << i << "]"; + } + return os; } }; -TAGGED_UNION(MetaItemData, None, +TAGGED_UNION(AttributeData, None, (None, struct {}), (String, struct { ::std::string val; }), (List, struct { - ::std::vector<MetaItem> sub_items; + ::std::vector<Attribute> sub_items; }) ); -class MetaItem +// An attribute can has a name, and optional data: +// Data can be: +// - A parenthesised token tree +// > In 1.19 this was actually just sub-attributes +// - an associated (string) literal + +class Attribute { + Span m_span; ::std::string m_name; - MetaItemData m_data; + AttributeData m_data; + mutable bool m_is_used; public: - virtual ~MetaItem(); - MetaItem() {} - MetaItem(MetaItem&& ) = default; - MetaItem& operator=(MetaItem&& ) = default; - MetaItem(::std::string name): + Attribute(Span sp, ::std::string name): + m_span(::std::move(sp)), m_name(name), - m_data( MetaItemData::make_None({}) ) + m_data( AttributeData::make_None({}) ) { } - MetaItem(::std::string name, ::std::string str_val): + Attribute(Span sp, ::std::string name, ::std::string str_val): + m_span(::std::move(sp)), m_name(name), - m_data( MetaItemData::make_String({mv$(str_val)}) ) + m_data( AttributeData::make_String({mv$(str_val)}) ) { } - MetaItem(::std::string name, ::std::vector<MetaItem> items): + Attribute(Span sp, ::std::string name, ::std::vector<Attribute> items): + m_span(::std::move(sp)), m_name(name), - m_data( MetaItemData::make_List({mv$(items)}) ) + m_data( AttributeData::make_List({mv$(items)}) ) { } - MetaItem clone() const; + Attribute(const Attribute& ) = delete; + Attribute& operator=(const Attribute&& ) = delete; + Attribute(Attribute&& ) = default; + Attribute& operator=(Attribute&& ) = default; + Attribute clone() const; + + void mark_used() const { m_is_used = true; } + bool is_used() const { return m_is_used; } - void mark_used() {} + const Span& span() const { return m_span; } const ::std::string& name() const { return m_name; } + const AttributeData& data() const { return m_data; } + // Legacy accessors/checkers bool has_noarg() const { return m_data.is_None(); } bool has_string() const { return m_data.is_String(); } const ::std::string& string() const { return m_data.as_String().val; } bool has_sub_items() const { return m_data.is_List(); } - const ::std::vector<MetaItem>& items() const { return m_data.as_List().sub_items; } - ::std::vector<MetaItem>& items() { return m_data.as_List().sub_items; } + const ::std::vector<Attribute>& items() const { return m_data.as_List().sub_items; } + ::std::vector<Attribute>& items() { return m_data.as_List().sub_items; } - friend ::std::ostream& operator<<(::std::ostream& os, const MetaItem& x) { + friend ::std::ostream& operator<<(::std::ostream& os, const Attribute& x) { os << x.m_name; - TU_MATCH(MetaItemData, (x.m_data), (e), + TU_MATCHA( (x.m_data), (e), (None, ), (String, diff --git a/src/ast/crate.cpp b/src/ast/crate.cpp index 823f7d00..9e4ed2ad 100644 --- a/src/ast/crate.cpp +++ b/src/ast/crate.cpp @@ -12,10 +12,10 @@ ::std::map<::std::string, ::std::string> AST::g_crate_overrides; namespace { - bool check_item_cfg(const ::AST::MetaItems& attrs) + bool check_item_cfg(const ::AST::AttributeList& attrs) { for(const auto& at : attrs.m_items) { - if( at.name() == "cfg" && !check_cfg(attrs.m_span, at) ) { + if( at.name() == "cfg" && !check_cfg(at.span(), at) ) { return false; } } @@ -78,7 +78,7 @@ void Crate::load_externs() if( a.name() == "no_core" ) no_core = true; if( a.name() == "cfg_attr" && a.items().size() == 2 ) { - if( check_cfg(this->m_attrs.m_span, a.items().at(0)) ) + if( check_cfg(a.span(), a.items().at(0)) ) { const auto& a2 = a.items().at(1); if( a2.name() == "no_std" ) diff --git a/src/ast/crate.hpp b/src/ast/crate.hpp index d6628901..bf1758d7 100644 --- a/src/ast/crate.hpp +++ b/src/ast/crate.hpp @@ -38,7 +38,7 @@ public: class Crate { public: - ::AST::MetaItems m_attrs; + ::AST::AttributeList m_attrs; ::std::map< ::std::string, ::AST::Path> m_lang_items; public: diff --git a/src/ast/dump.cpp b/src/ast/dump.cpp index 7026f61d..b6336a02 100644 --- a/src/ast/dump.cpp +++ b/src/ast/dump.cpp @@ -560,7 +560,7 @@ private: m_os << ")"; } - void print_attrs(const AST::MetaItems& attrs); + void print_attrs(const AST::AttributeList& attrs); void print_params(const AST::GenericParams& params); void print_bounds(const AST::GenericParams& params); void print_pattern_tuple(const AST::Pattern::TuplePat& v, bool is_refutable); @@ -579,7 +579,7 @@ void Dump_Rust(const char *filename, const AST::Crate& crate) printer.handle_module(crate.root_module()); } -void RustPrinter::print_attrs(const AST::MetaItems& attrs) +void RustPrinter::print_attrs(const AST::AttributeList& attrs) { for(const auto& a : attrs.m_items) { diff --git a/src/ast/expr.hpp b/src/ast/expr.hpp index 2c9a1c35..7572b92f 100644 --- a/src/ast/expr.hpp +++ b/src/ast/expr.hpp @@ -25,7 +25,7 @@ class NodeVisitor; class ExprNode { - MetaItems m_attrs; + AttributeList m_attrs; Span m_span; public: virtual ~ExprNode() = 0; @@ -37,10 +37,10 @@ public: void set_span(Span s) { m_span = ::std::move(s); } const Span& span() const { return m_span; } - void set_attrs(MetaItems&& mi) { + void set_attrs(AttributeList&& mi) { m_attrs = mv$(mi); } - MetaItems& attrs() { return m_attrs; } + AttributeList& attrs() { return m_attrs; } static ::std::unique_ptr<ExprNode> from_deserialiser(Deserialiser& d); }; @@ -263,7 +263,7 @@ struct ExprNode_Loop: struct ExprNode_Match_Arm { - MetaItems m_attrs; + AttributeList m_attrs; ::std::vector<Pattern> m_patterns; unique_ptr<ExprNode> m_cond; @@ -418,7 +418,7 @@ struct ExprNode_StructLiteral: public ExprNode { struct Ent { - MetaItems attrs; + AttributeList attrs; ::std::string name; unique_ptr<ExprNode> value; }; diff --git a/src/expand/cfg.cpp b/src/expand/cfg.cpp index a2fca312..773a38c4 100644 --- a/src/expand/cfg.cpp +++ b/src/expand/cfg.cpp @@ -30,7 +30,7 @@ void Cfg_SetValueCb(::std::string name, ::std::function<bool(const ::std::string g_cfg_value_fcns.insert( ::std::make_pair(mv$(name), mv$(cb)) ); } -bool check_cfg(Span sp, const ::AST::MetaItem& mi) { +bool check_cfg(const Span& sp, const ::AST::Attribute& mi) { if( mi.has_sub_items() ) { // Must be `any`/`not`/`all` @@ -117,7 +117,7 @@ class CCfgHandler: AttrStage stage() const override { return AttrStage::Pre; } - void handle(const Span& sp, const AST::MetaItem& mi, AST::Crate& crate) const override { + void handle(const Span& sp, const AST::Attribute& mi, AST::Crate& crate) const override { DEBUG("#[cfg] crate - " << mi); // Ignore, as #[cfg] on a crate is handled in expand/mod.cpp if( check_cfg(sp, mi) ) { @@ -126,7 +126,7 @@ class CCfgHandler: crate.m_root_module.items().clear(); } } - void handle(const Span& sp, const AST::MetaItem& mi, ::AST::Crate& crate, const AST::Path& path, AST::Module& mod, AST::Item&i) const override { + void handle(const Span& sp, const AST::Attribute& mi, ::AST::Crate& crate, const AST::Path& path, AST::Module& mod, AST::Item&i) const override { TRACE_FUNCTION_FR("#[cfg] item - " << mi, (i.is_None() ? "Deleted" : "")); if( check_cfg(sp, mi) ) { // Leave @@ -135,7 +135,7 @@ class CCfgHandler: i = AST::Item::make_None({}); } } - void handle(const Span& sp, const AST::MetaItem& mi, ::AST::Crate& crate, ::std::unique_ptr<AST::ExprNode>& expr) const override { + void handle(const Span& sp, const AST::Attribute& mi, ::AST::Crate& crate, ::std::unique_ptr<AST::ExprNode>& expr) const override { DEBUG("#[cfg] expr - " << mi); if( check_cfg(sp, mi) ) { // Leave @@ -144,7 +144,7 @@ class CCfgHandler: expr.reset(); } } - void handle(const Span& sp, const AST::MetaItem& mi, AST::Crate& crate, const AST::Module& mod, AST::ImplDef& impl) const override { + void handle(const Span& sp, const AST::Attribute& mi, AST::Crate& crate, const AST::Module& mod, AST::ImplDef& impl) const override { DEBUG("#[cfg] impl - " << mi); if( check_cfg(sp, mi) ) { // Leave @@ -154,32 +154,32 @@ class CCfgHandler: } } - void handle(const Span& sp, const AST::MetaItem& mi, AST::Crate& crate, ::AST::StructItem& si) const override { + void handle(const Span& sp, const AST::Attribute& mi, AST::Crate& crate, ::AST::StructItem& si) const override { DEBUG("#[cfg] struct item - " << mi); if( !check_cfg(sp, mi) ) { si.m_name = ""; } } - void handle(const Span& sp, const AST::MetaItem& mi, AST::Crate& crate, ::AST::TupleItem& i) const override { + void handle(const Span& sp, const AST::Attribute& mi, AST::Crate& crate, ::AST::TupleItem& i) const override { DEBUG("#[cfg] tuple item - " << mi); if( !check_cfg(sp, mi) ) { i.m_type = ::TypeRef(sp); } } - void handle(const Span& sp, const AST::MetaItem& mi, AST::Crate& crate, ::AST::EnumVariant& i) const override { + void handle(const Span& sp, const AST::Attribute& mi, AST::Crate& crate, ::AST::EnumVariant& i) const override { DEBUG("#[cfg] enum variant - " << mi); if( !check_cfg(sp, mi) ) { i.m_name = ""; } } - void handle(const Span& sp, const AST::MetaItem& mi, AST::Crate& crate, ::AST::ExprNode_Match_Arm& i) const override { + void handle(const Span& sp, const AST::Attribute& mi, AST::Crate& crate, ::AST::ExprNode_Match_Arm& i) const override { DEBUG("#[cfg] match arm - " << mi); if( !check_cfg(sp, mi) ) { i.m_patterns.clear(); } } - void handle(const Span& sp, const AST::MetaItem& mi, AST::Crate& crate, ::AST::ExprNode_StructLiteral::Ent& i) const override { + void handle(const Span& sp, const AST::Attribute& mi, AST::Crate& crate, ::AST::ExprNode_StructLiteral::Ent& i) const override { DEBUG("#[cfg] struct lit - " << mi); if( !check_cfg(sp, mi) ) { i.value.reset(); diff --git a/src/expand/cfg.hpp b/src/expand/cfg.hpp index edf17851..7c7785bb 100644 --- a/src/expand/cfg.hpp +++ b/src/expand/cfg.hpp @@ -6,4 +6,4 @@ extern void Cfg_SetFlag(::std::string name); extern void Cfg_SetValue(::std::string name, ::std::string val); extern void Cfg_SetValueCb(::std::string name, ::std::function<bool(const ::std::string&)> cb); -extern bool check_cfg(Span sp, const ::AST::MetaItem& mi); +extern bool check_cfg(const Span& sp, const ::AST::Attribute& mi); diff --git a/src/expand/crate_tags.cpp b/src/expand/crate_tags.cpp index e99f1aa2..0e7d8447 100644 --- a/src/expand/crate_tags.cpp +++ b/src/expand/crate_tags.cpp @@ -14,7 +14,7 @@ class Decorator_CrateType: public: AttrStage stage() const override { return AttrStage::Pre; } - void handle(const Span& sp, const AST::MetaItem& mi, AST::Crate& crate) const override { + void handle(const Span& sp, const AST::Attribute& mi, AST::Crate& crate) const override { if( crate.m_crate_type != AST::Crate::Type::Unknown ) { //ERROR(sp, E0000, "Multiple #![crate_type] attributes"); return ; @@ -41,7 +41,7 @@ class Decorator_CrateName: public: AttrStage stage() const override { return AttrStage::Pre; } - void handle(const Span& sp, const AST::MetaItem& mi, AST::Crate& crate) const override { + void handle(const Span& sp, const AST::Attribute& mi, AST::Crate& crate) const override { if( crate.m_crate_name != "" ) { ERROR(sp, E0000, "Multiple #![crate_name] attributes"); } @@ -58,7 +58,7 @@ class Decorator_Allocator: public: AttrStage stage() const override { return AttrStage::Pre; } - void handle(const Span& sp, const AST::MetaItem& mi, AST::Crate& crate) const override { + void handle(const Span& sp, const AST::Attribute& mi, AST::Crate& crate) const override { // TODO: Check for an existing allocator crate crate.m_lang_items.insert(::std::make_pair( "mrustc-allocator", AST::Path("",{}) )); } @@ -69,7 +69,7 @@ class Decorator_PanicRuntime: public: AttrStage stage() const override { return AttrStage::Pre; } - void handle(const Span& sp, const AST::MetaItem& mi, AST::Crate& crate) const override { + void handle(const Span& sp, const AST::Attribute& mi, AST::Crate& crate) const override { // TODO: Check for an existing panic_runtime crate crate.m_lang_items.insert(::std::make_pair( "mrustc-panic_runtime", AST::Path("",{}) )); } @@ -80,7 +80,7 @@ class Decorator_NeedsPanicRuntime: public: AttrStage stage() const override { return AttrStage::Pre; } - void handle(const Span& sp, const AST::MetaItem& mi, AST::Crate& crate) const override { + void handle(const Span& sp, const AST::Attribute& mi, AST::Crate& crate) const override { crate.m_lang_items.insert(::std::make_pair( "mrustc-needs_panic_runtime", AST::Path("",{}) )); } }; diff --git a/src/expand/derive.cpp b/src/expand/derive.cpp index 3b25831c..077c4b70 100644 --- a/src/expand/derive.cpp +++ b/src/expand/derive.cpp @@ -303,7 +303,7 @@ class Deriver_Debug: AST::GenericParams params = get_params_with_bounds(sp, p, debug_trait, mv$(types_to_bound)); - AST::Impl rv( AST::ImplDef( sp, AST::MetaItems(), mv$(params), make_spanned(sp, debug_trait), type.clone() ) ); + AST::Impl rv( AST::ImplDef( AST::AttributeList(), mv$(params), make_spanned(sp, debug_trait), type.clone() ) ); rv.add_function(false, false, "fmt", mv$(fcn)); return mv$(rv); } @@ -488,7 +488,7 @@ class Deriver_PartialEq: AST::GenericParams params = get_params_with_bounds(sp, p, trait_path, mv$(types_to_bound)); - AST::Impl rv( AST::ImplDef( sp, AST::MetaItems(), mv$(params), make_spanned(sp, trait_path), type.clone() ) ); + AST::Impl rv( AST::ImplDef( AST::AttributeList(), mv$(params), make_spanned(sp, trait_path), type.clone() ) ); rv.add_function(false, false, "eq", mv$(fcn)); return mv$(rv); } @@ -667,7 +667,7 @@ class Deriver_PartialOrd: AST::GenericParams params = get_params_with_bounds(sp, p, trait_path, mv$(types_to_bound)); - AST::Impl rv( AST::ImplDef( sp, AST::MetaItems(), mv$(params), make_spanned(sp, trait_path), type.clone() ) ); + AST::Impl rv( AST::ImplDef( AST::AttributeList(), mv$(params), make_spanned(sp, trait_path), type.clone() ) ); rv.add_function(false, false, "partial_cmp", mv$(fcn)); return mv$(rv); } @@ -910,7 +910,7 @@ class Deriver_Eq: AST::GenericParams params = get_params_with_bounds(sp, p, trait_path, mv$(types_to_bound)); - AST::Impl rv( AST::ImplDef( sp, AST::MetaItems(), mv$(params), make_spanned(sp, trait_path), type.clone() ) ); + AST::Impl rv( AST::ImplDef( AST::AttributeList(), mv$(params), make_spanned(sp, trait_path), type.clone() ) ); rv.add_function(false, false, "assert_receiver_is_total_eq", mv$(fcn)); return mv$(rv); } @@ -1062,7 +1062,7 @@ class Deriver_Ord: AST::GenericParams params = get_params_with_bounds(sp, p, trait_path, mv$(types_to_bound)); - AST::Impl rv( AST::ImplDef( sp, AST::MetaItems(), mv$(params), make_spanned(sp, trait_path), type.clone() ) ); + AST::Impl rv( AST::ImplDef( AST::AttributeList(), mv$(params), make_spanned(sp, trait_path), type.clone() ) ); rv.add_function(false, false, "cmp", mv$(fcn)); return mv$(rv); } @@ -1294,7 +1294,7 @@ class Deriver_Clone: AST::GenericParams params = get_params_with_bounds(sp, p, trait_path, mv$(types_to_bound)); - AST::Impl rv( AST::ImplDef( sp, AST::MetaItems(), mv$(params), make_spanned(sp, trait_path), type.clone() ) ); + AST::Impl rv( AST::ImplDef( AST::AttributeList(), mv$(params), make_spanned(sp, trait_path), type.clone() ) ); rv.add_function(false, false, "clone", mv$(fcn)); return mv$(rv); } @@ -1439,7 +1439,7 @@ class Deriver_Copy: AST::GenericParams params = get_params_with_bounds(sp, p, trait_path, mv$(types_to_bound)); - AST::Impl rv( AST::ImplDef( sp, AST::MetaItems(), mv$(params), make_spanned(sp, trait_path), type.clone() ) ); + AST::Impl rv( AST::ImplDef( AST::AttributeList(), mv$(params), make_spanned(sp, trait_path), type.clone() ) ); return mv$(rv); } @@ -1486,7 +1486,7 @@ class Deriver_Default: AST::GenericParams params = get_params_with_bounds(sp, p, trait_path, mv$(types_to_bound)); - AST::Impl rv( AST::ImplDef( sp, AST::MetaItems(), mv$(params), make_spanned(sp, trait_path), type.clone() ) ); + AST::Impl rv( AST::ImplDef( AST::AttributeList(), mv$(params), make_spanned(sp, trait_path), type.clone() ) ); rv.add_function(false, false, "default", mv$(fcn)); return mv$(rv); } @@ -1573,7 +1573,7 @@ class Deriver_Hash: AST::GenericParams params = get_params_with_bounds(sp, p, trait_path, mv$(types_to_bound)); - AST::Impl rv( AST::ImplDef( sp, AST::MetaItems(), mv$(params), make_spanned(sp, trait_path), type.clone() ) ); + AST::Impl rv( AST::ImplDef( AST::AttributeList(), mv$(params), make_spanned(sp, trait_path), type.clone() ) ); rv.add_function(false, false, "hash", mv$(fcn)); return mv$(rv); } @@ -1727,7 +1727,7 @@ class Deriver_RustcEncodable: AST::GenericParams params = get_params_with_bounds(sp, p, trait_path, mv$(types_to_bound)); - AST::Impl rv( AST::ImplDef( sp, AST::MetaItems(), mv$(params), make_spanned(sp, trait_path), type.clone() ) ); + AST::Impl rv( AST::ImplDef( AST::AttributeList(), mv$(params), make_spanned(sp, trait_path), type.clone() ) ); rv.add_function(false, false, "encode", mv$(fcn)); return mv$(rv); } @@ -1961,7 +1961,7 @@ class Deriver_RustcDecodable: AST::GenericParams params = get_params_with_bounds(sp, p, trait_path, mv$(types_to_bound)); - AST::Impl rv( AST::ImplDef( sp, AST::MetaItems(), mv$(params), make_spanned(sp, trait_path), type.clone() ) ); + AST::Impl rv( AST::ImplDef( AST::AttributeList(), mv$(params), make_spanned(sp, trait_path), type.clone() ) ); rv.add_function(false, false, "decode", mv$(fcn)); return mv$(rv); } @@ -2185,7 +2185,7 @@ static const Deriver* find_impl(const ::std::string& trait_name) } template<typename T> -static void derive_item(const Span& sp, const AST::Crate& crate, AST::Module& mod, const AST::MetaItem& attr, const AST::Path& path, const T& item) +static void derive_item(const Span& sp, const AST::Crate& crate, AST::Module& mod, const AST::Attribute& attr, const AST::Path& path, const T& item) { if( !attr.has_sub_items() ) { //ERROR(sp, E0000, "#[derive()] requires a list of known traits to derive"); @@ -2257,7 +2257,7 @@ class Decorator_Derive: { public: AttrStage stage() const override { return AttrStage::Post; } - void handle(const Span& sp, const AST::MetaItem& attr, ::AST::Crate& crate, const AST::Path& path, AST::Module& mod, AST::Item& i) const override + void handle(const Span& sp, const AST::Attribute& attr, ::AST::Crate& crate, const AST::Path& path, AST::Module& mod, AST::Item& i) const override { TU_MATCH_DEF(::AST::Item, (i), (e), ( diff --git a/src/expand/lang_item.cpp b/src/expand/lang_item.cpp index 53606bea..789ad88e 100644 --- a/src/expand/lang_item.cpp +++ b/src/expand/lang_item.cpp @@ -125,7 +125,7 @@ class Decorator_LangItem: { public: AttrStage stage() const override { return AttrStage::Post; } - void handle(const Span& sp, const AST::MetaItem& attr, AST::Crate& crate, const AST::Path& path, AST::Module& mod, AST::Item& i) const override + void handle(const Span& sp, const AST::Attribute& attr, AST::Crate& crate, const AST::Path& path, AST::Module& mod, AST::Item& i) const override { TU_MATCH_DEF(::AST::Item, (i), (e), ( @@ -154,7 +154,7 @@ public: ) } - void handle(const Span& sp, const AST::MetaItem& mi, AST::Crate& crate, const AST::Module& mod, AST::ImplDef& impl) const override { + void handle(const Span& sp, const AST::Attribute& mi, AST::Crate& crate, const AST::Module& mod, AST::ImplDef& impl) const override { const ::std::string& name = mi.string(); if( name == "i8" ) {} @@ -193,7 +193,7 @@ class Decorator_Main: { public: AttrStage stage() const override { return AttrStage::Post; } - void handle(const Span& sp, const AST::MetaItem& attr, AST::Crate& crate, const AST::Path& path, AST::Module& mod, AST::Item& i) const override + void handle(const Span& sp, const AST::Attribute& attr, AST::Crate& crate, const AST::Path& path, AST::Module& mod, AST::Item& i) const override { if( i.is_None() ) { // Ignore. @@ -217,7 +217,7 @@ class Decorator_Start: { public: AttrStage stage() const override { return AttrStage::Post; } - void handle(const Span& sp, const AST::MetaItem& attr, AST::Crate& crate, const AST::Path& path, AST::Module& mod, AST::Item& i) const override + void handle(const Span& sp, const AST::Attribute& attr, AST::Crate& crate, const AST::Path& path, AST::Module& mod, AST::Item& i) const override { TU_IFLET(::AST::Item, i, Function, e, auto rv = crate.m_lang_items.insert(::std::make_pair( ::std::string("mrustc-start"), ::AST::Path(path) )); diff --git a/src/expand/macro_rules.cpp b/src/expand/macro_rules.cpp index 5b783949..5aa15a46 100644 --- a/src/expand/macro_rules.cpp +++ b/src/expand/macro_rules.cpp @@ -41,7 +41,7 @@ class CMacroUseHandler: { AttrStage stage() const override { return AttrStage::Post; } - void handle(const Span& sp, const AST::MetaItem& mi, ::AST::Crate& crate, const AST::Path& path, AST::Module& mod, AST::Item& i) const override + void handle(const Span& sp, const AST::Attribute& mi, ::AST::Crate& crate, const AST::Path& path, AST::Module& mod, AST::Item& i) const override { TRACE_FUNCTION_F("path=" << path); @@ -120,7 +120,7 @@ class CMacroExportHandler: { AttrStage stage() const override { return AttrStage::Post; } - void handle(const Span& sp, const AST::MetaItem& mi, ::AST::Crate& crate, const AST::Path& path, AST::Module& mod, AST::Item& i) const override + void handle(const Span& sp, const AST::Attribute& mi, ::AST::Crate& crate, const AST::Path& path, AST::Module& mod, AST::Item& i) const override { if( i.is_None() ) { } @@ -147,7 +147,7 @@ class CMacroReexportHandler: public ExpandDecorator { AttrStage stage() const override { return AttrStage::Post; } - void handle(const Span& sp, const AST::MetaItem& mi, ::AST::Crate& crate, const AST::Path& path, AST::Module& mod, AST::Item& i) const override + void handle(const Span& sp, const AST::Attribute& mi, ::AST::Crate& crate, const AST::Path& path, AST::Module& mod, AST::Item& i) const override { if( !i.is_Crate() ) { ERROR(sp, E0000, "Use of #[macro_reexport] on non-crate - " << i.tag_str()); diff --git a/src/expand/mod.cpp b/src/expand/mod.cpp index 571d21e2..aa7655e3 100644 --- a/src/expand/mod.cpp +++ b/src/expand/mod.cpp @@ -21,7 +21,7 @@ MacroDef* g_macros_list = nullptr; ::std::map< ::std::string, ::std::unique_ptr<ExpandDecorator> > g_decorators; ::std::map< ::std::string, ::std::unique_ptr<ExpandProcMacro> > g_macros; -void Expand_Attrs(const ::AST::MetaItems& attrs, AttrStage stage, ::std::function<void(const ExpandDecorator& d,const ::AST::MetaItem& a)> f); +void Expand_Attrs(const ::AST::AttributeList& attrs, AttrStage stage, ::std::function<void(const ExpandDecorator& d,const ::AST::Attribute& a)> f); void Expand_Mod(::AST::Crate& crate, LList<const AST::Module*> modstack, ::AST::Path modpath, ::AST::Module& mod, unsigned int first_item = 0); void Expand_Expr(::AST::Crate& crate, LList<const AST::Module*> modstack, AST::Expr& node); void Expand_Expr(::AST::Crate& crate, LList<const AST::Module*> modstack, ::std::shared_ptr<AST::ExprNode>& node); @@ -43,12 +43,12 @@ void Register_Synext_Macro_Static(MacroDef* def) { } -void ExpandDecorator::unexpected(const Span& sp, const AST::MetaItem& mi, const char* loc_str) const +void ExpandDecorator::unexpected(const Span& sp, const AST::Attribute& mi, const char* loc_str) const { WARNING(sp, W0000, "Unexpected attribute " << mi.name() << " on " << loc_str); } -void Expand_Attr(const Span& sp, const ::AST::MetaItem& a, AttrStage stage, ::std::function<void(const Span& sp, const ExpandDecorator& d,const ::AST::MetaItem& a)> f) +void Expand_Attr(const Span& sp, const ::AST::Attribute& a, AttrStage stage, ::std::function<void(const Span& sp, const ExpandDecorator& d,const ::AST::Attribute& a)> f) { for( auto& d : g_decorators ) { if( d.first == a.name() ) { @@ -59,29 +59,30 @@ void Expand_Attr(const Span& sp, const ::AST::MetaItem& a, AttrStage stage, ::s } } } -void Expand_Attrs(/*const */::AST::MetaItems& attrs, AttrStage stage, ::std::function<void(const Span& sp, const ExpandDecorator& d,const ::AST::MetaItem& a)> f) +void Expand_Attrs(/*const */::AST::AttributeList& attrs, AttrStage stage, ::std::function<void(const Span& sp, const ExpandDecorator& d,const ::AST::Attribute& a)> f) { for( auto& a : attrs.m_items ) { if( a.name() == "cfg_attr" ) { - if( check_cfg(attrs.m_span, a.items().at(0)) ) { + if( check_cfg(a.span(), a.items().at(0)) ) { + // Wait? Why move? auto inner_attr = mv$(a.items().at(1)); - Expand_Attr(attrs.m_span, inner_attr, stage, f); + Expand_Attr(inner_attr.span(), inner_attr, stage, f); a = mv$(inner_attr); } else { } } else { - Expand_Attr(attrs.m_span, a, stage, f); + Expand_Attr(a.span(), a, stage, f); } } } -void Expand_Attrs(::AST::MetaItems& attrs, AttrStage stage, ::AST::Crate& crate, const ::AST::Path& path, ::AST::Module& mod, ::AST::Item& item) +void Expand_Attrs(::AST::AttributeList& attrs, AttrStage stage, ::AST::Crate& crate, const ::AST::Path& path, ::AST::Module& mod, ::AST::Item& item) { Expand_Attrs(attrs, stage, [&](const auto& sp, const auto& d, const auto& a){ if(!item.is_None()) d.handle(sp, a, crate, path, mod, item); }); } -void Expand_Attrs(::AST::MetaItems& attrs, AttrStage stage, ::AST::Crate& crate, ::AST::Module& mod, ::AST::ImplDef& impl) +void Expand_Attrs(::AST::AttributeList& attrs, AttrStage stage, ::AST::Crate& crate, ::AST::Module& mod, ::AST::ImplDef& impl) { Expand_Attrs(attrs, stage, [&](const auto& sp, const auto& d, const auto& a){ d.handle(sp, a, crate, mod, impl); }); } @@ -1293,7 +1294,7 @@ void Expand(::AST::Crate& crate) crate.m_extern_crates.at("std").with_all_macros([&](const auto& name, const auto& mac) { crate.m_root_module.add_macro_import( name, mac ); }); - crate.m_root_module.add_ext_crate(false, "std", "std", ::AST::MetaItems {}); + crate.m_root_module.add_ext_crate(false, "std", "std", ::AST::AttributeList {}); break; case ::AST::Crate::LOAD_CORE: if( crate.m_prelude_path == AST::Path() ) @@ -1301,7 +1302,7 @@ void Expand(::AST::Crate& crate) crate.m_extern_crates.at("core").with_all_macros([&](const auto& name, const auto& mac) { crate.m_root_module.add_macro_import( name, mac ); }); - crate.m_root_module.add_ext_crate(false, "core", "core", ::AST::MetaItems {}); + crate.m_root_module.add_ext_crate(false, "core", "core", ::AST::AttributeList {}); break; case ::AST::Crate::LOAD_NONE: break; diff --git a/src/expand/proc_macro.cpp b/src/expand/proc_macro.cpp index d34a91a5..cdd13a42 100644 --- a/src/expand/proc_macro.cpp +++ b/src/expand/proc_macro.cpp @@ -35,7 +35,7 @@ class Decorator_ProcMacroDerive: { public: AttrStage stage() const override { return AttrStage::Post; } - void handle(const Span& sp, const AST::MetaItem& attr, ::AST::Crate& crate, const AST::Path& path, AST::Module& mod, AST::Item& i) const override + void handle(const Span& sp, const AST::Attribute& attr, ::AST::Crate& crate, const AST::Path& path, AST::Module& mod, AST::Item& i) const override { if( i.is_None() ) return; @@ -609,7 +609,7 @@ namespace { TODO(sp, "ExprNode_UniOp"); } - void visit_attrs(const ::AST::MetaItems& attrs) + void visit_attrs(const ::AST::AttributeList& attrs) { for(const auto& a : attrs.m_items) { @@ -622,7 +622,7 @@ namespace { } } } - void visit_meta_item(const ::AST::MetaItem& i) + void visit_meta_item(const ::AST::Attribute& i) { m_pmi.send_ident(i.name().c_str()); if( i.has_noarg() ) { diff --git a/src/expand/std_prelude.cpp b/src/expand/std_prelude.cpp index e12a441c..6b81b71e 100644 --- a/src/expand/std_prelude.cpp +++ b/src/expand/std_prelude.cpp @@ -8,8 +8,8 @@ class Decorator_NoStd: { public: AttrStage stage() const override { return AttrStage::Pre; } - - void handle(const Span& sp, const AST::MetaItem& mi, AST::Crate& crate) const override { + + void handle(const Span& sp, const AST::Attribute& mi, AST::Crate& crate) const override { if( crate.m_load_std != AST::Crate::LOAD_STD && crate.m_load_std != AST::Crate::LOAD_CORE ) { ERROR(sp, E0000, "Invalid use of #![no_std] with itself or #![no_core]"); } @@ -22,7 +22,7 @@ class Decorator_NoCore: public: AttrStage stage() const override { return AttrStage::Pre; } - void handle(const Span& sp, const AST::MetaItem& mi, AST::Crate& crate) const override { + void handle(const Span& sp, const AST::Attribute& mi, AST::Crate& crate) const override { if( crate.m_load_std != AST::Crate::LOAD_STD && crate.m_load_std != AST::Crate::LOAD_NONE ) { ERROR(sp, E0000, "Invalid use of #![no_core] with itself or #![no_std]"); } @@ -42,7 +42,7 @@ class Decorator_NoPrelude: public: AttrStage stage() const override { return AttrStage::Pre; } - void handle(const Span& sp, const AST::MetaItem& mi, ::AST::Crate& crate, const AST::Path& path, AST::Module& mod, AST::Item&i) const override { + void handle(const Span& sp, const AST::Attribute& mi, ::AST::Crate& crate, const AST::Path& path, AST::Module& mod, AST::Item&i) const override { if( i.is_Module() ) { i.as_Module().m_insert_prelude = false; } @@ -58,7 +58,7 @@ class Decorator_PreludeImport: public: AttrStage stage() const override { return AttrStage::Post; } - void handle(const Span& sp, const AST::MetaItem& mi, ::AST::Crate& crate, const AST::Path& path, AST::Module& mod, AST::Item&i) const override { + void handle(const Span& sp, const AST::Attribute& mi, ::AST::Crate& crate, const AST::Path& path, AST::Module& mod, AST::Item&i) const override { if( i.is_Use() ) { const auto& p = i.as_Use().path; // TODO: Ensure that this statement is a glob (has a name of "") diff --git a/src/expand/test.cpp b/src/expand/test.cpp index 12bfbb7d..9497c692 100644 --- a/src/expand/test.cpp +++ b/src/expand/test.cpp @@ -14,7 +14,7 @@ class CTestHandler: { AttrStage stage() const override { return AttrStage::Post; } - void handle(const Span& sp, const AST::MetaItem& mi, ::AST::Crate& crate, const AST::Path& path, AST::Module& mod, AST::Item&i) const override { + void handle(const Span& sp, const AST::Attribute& mi, ::AST::Crate& crate, const AST::Path& path, AST::Module& mod, AST::Item&i) const override { if( ! i.is_Function() ) { ERROR(sp, E0000, "#[test] can only be put on functions - found on " << i.tag_str()); } @@ -42,7 +42,7 @@ class CTestHandler_SP: { AttrStage stage() const override { return AttrStage::Pre; } - void handle(const Span& sp, const AST::MetaItem& mi, ::AST::Crate& crate, const AST::Path& path, AST::Module& mod, AST::Item&i) const override { + void handle(const Span& sp, const AST::Attribute& mi, ::AST::Crate& crate, const AST::Path& path, AST::Module& mod, AST::Item&i) const override { if( ! i.is_Function() ) { ERROR(sp, E0000, "#[should_panic] can only be put on functions - found on " << i.tag_str()); } @@ -75,7 +75,7 @@ class CTestHandler_Ignore: { AttrStage stage() const override { return AttrStage::Pre; } - void handle(const Span& sp, const AST::MetaItem& mi, ::AST::Crate& crate, const AST::Path& path, AST::Module& mod, AST::Item&i) const override { + void handle(const Span& sp, const AST::Attribute& mi, ::AST::Crate& crate, const AST::Path& path, AST::Module& mod, AST::Item&i) const override { if( ! i.is_Function() ) { ERROR(sp, E0000, "#[should_panic] can only be put on functions - found on " << i.tag_str()); } diff --git a/src/hir/from_ast.cpp b/src/hir/from_ast.cpp index 062b4ff8..1dbfdad2 100644 --- a/src/hir/from_ast.cpp +++ b/src/hir/from_ast.cpp @@ -18,7 +18,7 @@ #include <limits.h> ::HIR::Module LowerHIR_Module(const ::AST::Module& module, ::HIR::ItemPath path, ::std::vector< ::HIR::SimplePath> traits = {}); -::HIR::Function LowerHIR_Function(::HIR::ItemPath path, const ::AST::MetaItems& attrs, const ::AST::Function& f, const ::HIR::TypeRef& self_type); +::HIR::Function LowerHIR_Function(::HIR::ItemPath path, const ::AST::AttributeList& attrs, const ::AST::Function& f, const ::HIR::TypeRef& self_type); ::HIR::PathParams LowerHIR_PathParams(const Span& sp, const ::AST::PathParams& src_params, bool allow_assoc); ::HIR::TraitPath LowerHIR_TraitPath(const Span& sp, const ::AST::Path& path); @@ -836,7 +836,7 @@ namespace { } } -::HIR::Struct LowerHIR_Struct(::HIR::ItemPath path, const ::AST::Struct& ent, const ::AST::MetaItems& attrs) +::HIR::Struct LowerHIR_Struct(::HIR::ItemPath path, const ::AST::Struct& ent, const ::AST::AttributeList& attrs) { TRACE_FUNCTION_F(path); ::HIR::Struct::Data data; @@ -879,7 +879,7 @@ namespace { is_packed = true; } else { - TODO(attrs.m_span, "Handle struct repr '" << repr_str << "'"); + TODO(a.span(), "Handle struct repr '" << repr_str << "'"); } } @@ -900,7 +900,7 @@ namespace { }; } -::HIR::Enum LowerHIR_Enum(::HIR::ItemPath path, const ::AST::Enum& ent, const ::AST::MetaItems& attrs, ::std::function<void(::std::string, ::HIR::Struct)> push_struct) +::HIR::Enum LowerHIR_Enum(::HIR::ItemPath path, const ::AST::Enum& ent, const ::AST::AttributeList& attrs, ::std::function<void(::std::string, ::HIR::Struct)> push_struct) { // 1. Figure out what sort of enum this is (value or data) @@ -1050,7 +1050,7 @@ namespace { mv$(data) }; } -::HIR::Union LowerHIR_Union(::HIR::ItemPath path, const ::AST::Union& f, const ::AST::MetaItems& attrs) +::HIR::Union LowerHIR_Union(::HIR::ItemPath path, const ::AST::Union& f, const ::AST::AttributeList& attrs) { auto repr = ::HIR::Union::Repr::Rust; @@ -1064,7 +1064,7 @@ namespace { repr = ::HIR::Union::Repr::C; } else { - ERROR(attrs.m_span, E0000, "Unknown union repr '" << repr_str << "'"); + ERROR(attr_repr->span(), E0000, "Unknown union repr '" << repr_str << "'"); } } @@ -1186,7 +1186,7 @@ namespace { return rv; } -::HIR::Function LowerHIR_Function(::HIR::ItemPath p, const ::AST::MetaItems& attrs, const ::AST::Function& f, const ::HIR::TypeRef& self_type) +::HIR::Function LowerHIR_Function(::HIR::ItemPath p, const ::AST::AttributeList& attrs, const ::AST::Function& f, const ::HIR::TypeRef& self_type) { static Span sp; diff --git a/src/include/synext_decorator.hpp b/src/include/synext_decorator.hpp index af19491d..049a28b0 100644 --- a/src/include/synext_decorator.hpp +++ b/src/include/synext_decorator.hpp @@ -13,7 +13,7 @@ class TypeRef; namespace AST { class Crate; - class MetaItem; + class Attribute; class Path; struct StructItem; @@ -38,26 +38,26 @@ enum class AttrStage class ExpandDecorator { - void unexpected(const Span& sp, const AST::MetaItem& mi, const char* loc_str) const; + void unexpected(const Span& sp, const AST::Attribute& 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, const AST::Path& path, AST::Module& mod, AST::Item&i) const { unexpected(sp, mi, "item"); } + virtual void handle(const Span& sp, const AST::Attribute& mi, AST::Crate& crate) const { unexpected(sp, mi, "crate"); } + virtual void handle(const Span& sp, const AST::Attribute& 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"); } + virtual void handle(const Span& sp, const AST::Attribute& 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"); } + virtual void handle(const Span& sp, const AST::Attribute& 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"); } + virtual void handle(const Span& sp, const AST::Attribute& 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::Attribute& 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"); } + virtual void handle(const Span& sp, const AST::Attribute& 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"); } + virtual void handle(const Span& sp, const AST::Attribute& mi, AST::Crate& crate, ::AST::ExprNode_Match_Arm& expr) const { unexpected(sp, mi, "match arm"); } // NOTE: To delete, clear the value - virtual void handle(const Span& sp, const AST::MetaItem& mi, AST::Crate& crate, ::AST::ExprNode_StructLiteral::Ent& expr) const { unexpected(sp, mi, "struct literal ent"); } + virtual void handle(const Span& sp, const AST::Attribute& mi, AST::Crate& crate, ::AST::ExprNode_StructLiteral::Ent& expr) const { unexpected(sp, mi, "struct literal ent"); } }; struct DecoratorDef; diff --git a/src/macro_rules/eval.cpp b/src/macro_rules/eval.cpp index 9372fa6e..b2f5e409 100644 --- a/src/macro_rules/eval.cpp +++ b/src/macro_rules/eval.cpp @@ -712,7 +712,7 @@ InterpolatedFragment Macro_HandlePatternCap(TokenStream& lex, MacroPatEnt::Type case MacroPatEnt::PAT_ITEM: { assert( lex.parse_state().module ); const auto& cur_mod = *lex.parse_state().module; - return InterpolatedFragment( Parse_Mod_Item_S(lex, cur_mod.m_file_info, cur_mod.path(), AST::MetaItems{}) ); + return InterpolatedFragment( Parse_Mod_Item_S(lex, cur_mod.m_file_info, cur_mod.path(), AST::AttributeList{}) ); } break; case MacroPatEnt::PAT_IDENT: // TODO: Any reserved word is also valid as an ident diff --git a/src/parse/common.hpp b/src/parse/common.hpp index ede08984..1ca86128 100644 --- a/src/parse/common.hpp +++ b/src/parse/common.hpp @@ -41,16 +41,16 @@ extern AST::PathParams Parse_Path_GenericList(TokenStream& lex); extern ::std::vector< ::std::string> Parse_HRB(TokenStream& lex); -extern AST::MetaItems Parse_ItemAttrs(TokenStream& lex); -extern void Parse_ParentAttrs(TokenStream& lex, AST::MetaItems& out); -extern AST::MetaItem Parse_MetaItem(TokenStream& lex); +extern AST::AttributeList Parse_ItemAttrs(TokenStream& lex); +extern void Parse_ParentAttrs(TokenStream& lex, AST::AttributeList& out); +extern AST::Attribute Parse_MetaItem(TokenStream& lex); extern ::AST::MacroInvocation Parse_MacroInvocation(ProtoSpan ps, ::std::string name, TokenStream& lex); extern TypeRef Parse_Type(TokenStream& lex, bool allow_trait_list = true); extern AST::Pattern Parse_Pattern(TokenStream& lex, bool is_refutable); extern void Parse_Impl_Item(TokenStream& lex, AST::Impl& impl); -extern void Parse_Mod_Item(TokenStream& lex, AST::Module& mod, AST::MetaItems meta_items); -extern ::AST::Named<::AST::Item> Parse_Mod_Item_S(TokenStream& lex, const AST::Module::FileInfo& mod_fileinfo, const ::AST::Path& mod_path, AST::MetaItems meta_items); +extern void Parse_Mod_Item(TokenStream& lex, AST::Module& mod, AST::AttributeList meta_items); +extern ::AST::Named<::AST::Item> Parse_Mod_Item_S(TokenStream& lex, const AST::Module::FileInfo& mod_fileinfo, const ::AST::Path& mod_path, AST::AttributeList meta_items); extern void Parse_ModRoot_Items(TokenStream& lex, AST::Module& mod); diff --git a/src/parse/expr.cpp b/src/parse/expr.cpp index 2ac13728..22bf9afc 100644 --- a/src/parse/expr.cpp +++ b/src/parse/expr.cpp @@ -66,7 +66,7 @@ ExprNodeP Parse_ExprBlockNode(TokenStream& lex, bool is_unsafe/*=false*/) DEBUG("tok = " << tok); // NOTE: Doc comments can appear within a function and apply to the function - ::AST::MetaItems node_attrs; + ::AST::AttributeList node_attrs; Parse_ParentAttrs(lex, node_attrs); (void)node_attrs; // TODO: Use these attributes if( LOOK_AHEAD(lex) == TOK_BRACE_CLOSE ) @@ -98,7 +98,7 @@ ExprNodeP Parse_ExprBlockLine_WithItems(TokenStream& lex, ::std::shared_ptr<AST: { Token tok; - AST::MetaItems item_attrs = Parse_ItemAttrs(lex); + auto item_attrs = Parse_ItemAttrs(lex); GET_TOK(tok, lex); // `union Ident` - contextual keyword @@ -584,7 +584,7 @@ ExprNodeP Parse_Expr0(TokenStream& lex) //TRACE_FUNCTION; Token tok; - ::AST::MetaItems expr_attrs = Parse_ItemAttrs(lex); + auto expr_attrs = Parse_ItemAttrs(lex); ExprNodeP rv = Parse_Expr1(lex); auto op = AST::ExprNode_Assign::NONE; @@ -996,7 +996,7 @@ ExprNodeP Parse_ExprVal_StructLiteral(TokenStream& lex, AST::Path path) ::AST::ExprNode_StructLiteral::t_values items; while( GET_TOK(tok, lex) == TOK_IDENT || tok.type() == TOK_HASH ) { - ::AST::MetaItems attrs; + ::AST::AttributeList attrs; // Note: Parse_ItemAttrs uses lookahead, so can't use it here. if( tok.type() == TOK_HASH ) { PUTBACK(tok, lex); diff --git a/src/parse/interpolated_fragment.cpp b/src/parse/interpolated_fragment.cpp index 29a7ab5a..9b7979f3 100644 --- a/src/parse/interpolated_fragment.cpp +++ b/src/parse/interpolated_fragment.cpp @@ -21,7 +21,7 @@ InterpolatedFragment::~InterpolatedFragment() delete reinterpret_cast<AST::ExprNode*>(m_ptr); break; case InterpolatedFragment::META: - delete reinterpret_cast<AST::MetaItem*>(m_ptr); + delete reinterpret_cast<AST::Attribute*>(m_ptr); break; case InterpolatedFragment::ITEM: delete reinterpret_cast<AST::Named<AST::Item>*>(m_ptr); @@ -47,9 +47,9 @@ InterpolatedFragment::InterpolatedFragment(InterpolatedFragment::Type type, AST: m_ptr( ptr ) { } -InterpolatedFragment::InterpolatedFragment(AST::MetaItem v): +InterpolatedFragment::InterpolatedFragment(AST::Attribute v): m_type( InterpolatedFragment::META ), - m_ptr( new AST::MetaItem(mv$(v)) ) + m_ptr( new AST::Attribute(mv$(v)) ) { } InterpolatedFragment::InterpolatedFragment(::AST::Named<::AST::Item> v): @@ -106,7 +106,7 @@ InterpolatedFragment::InterpolatedFragment(TypeRef v): break; case InterpolatedFragment::META: - os << "meta[" << *reinterpret_cast<const AST::MetaItem*>(x.m_ptr) << "]"; + os << "meta[" << *reinterpret_cast<const AST::Attribute*>(x.m_ptr) << "]"; break; case InterpolatedFragment::ITEM: { const auto& named_item = *reinterpret_cast<const AST::Named<AST::Item>*>(x.m_ptr); diff --git a/src/parse/interpolated_fragment.hpp b/src/parse/interpolated_fragment.hpp index 1b18845a..857e77aa 100644 --- a/src/parse/interpolated_fragment.hpp +++ b/src/parse/interpolated_fragment.hpp @@ -10,7 +10,7 @@ namespace AST { class Pattern; class Path; class ExprNode; - class MetaItem; + class Attribute; template<typename T> struct Named; class Item; }; @@ -44,7 +44,7 @@ public: InterpolatedFragment(::AST::Pattern); InterpolatedFragment(::AST::Path); InterpolatedFragment(::TypeRef); - InterpolatedFragment(::AST::MetaItem ); + InterpolatedFragment(::AST::Attribute ); InterpolatedFragment(::AST::Named<AST::Item> ); ~InterpolatedFragment(); InterpolatedFragment(Type , ::AST::ExprNode*); diff --git a/src/parse/root.cpp b/src/parse/root.cpp index 8fa72fb3..a57d6844 100644 --- a/src/parse/root.cpp +++ b/src/parse/root.cpp @@ -41,10 +41,10 @@ Spanned<T> get_spanned(TokenStream& lex, ::std::function<T()> f) { return input; } -AST::MetaItems Parse_ItemAttrs(TokenStream& lex); -void Parse_ParentAttrs(TokenStream& lex, AST::MetaItems& out); -AST::MetaItem Parse_MetaItem(TokenStream& lex); -void Parse_ModRoot(TokenStream& lex, AST::Module& mod, AST::MetaItems& mod_attrs); +AST::AttributeList Parse_ItemAttrs(TokenStream& lex); +void Parse_ParentAttrs(TokenStream& lex, AST::AttributeList& out); +AST::Attribute Parse_MetaItem(TokenStream& lex); +void Parse_ModRoot(TokenStream& lex, AST::Module& mod, AST::AttributeList& mod_attrs); bool Parse_MacroInvocation_Opt(TokenStream& lex, AST::MacroInvocation& out_inv); //::AST::Path Parse_Publicity(TokenStream& lex) @@ -127,7 +127,7 @@ bool Parse_Publicity(TokenStream& lex, bool allow_restricted=true) ::std::vector< ::std::string> lifetimes; GET_CHECK_TOK(tok, lex, TOK_LT); do { - ::AST::MetaItems attrs = Parse_ItemAttrs(lex); + auto attrs = Parse_ItemAttrs(lex); (void)attrs; // TODO: Attributes on generic params switch(GET_TOK(tok, lex)) @@ -198,7 +198,7 @@ AST::GenericParams Parse_GenericParams(TokenStream& lex) } PUTBACK(tok, lex); - ::AST::MetaItems attrs = Parse_ItemAttrs(lex); + auto attrs = Parse_ItemAttrs(lex); (void)attrs; // TODO: Attributes on generic params GET_TOK(tok, lex); @@ -523,7 +523,7 @@ AST::TypeAlias Parse_TypeAlias(TokenStream& lex) return AST::TypeAlias( ::std::move(params), ::std::move(type) ); } -AST::Struct Parse_Struct(TokenStream& lex, const AST::MetaItems& meta_items) +AST::Struct Parse_Struct(TokenStream& lex, const AST::AttributeList& meta_items) { TRACE_FUNCTION; @@ -547,7 +547,7 @@ AST::Struct Parse_Struct(TokenStream& lex, const AST::MetaItems& meta_items) ::std::vector<AST::TupleItem> refs; while(lex.lookahead(0) != TOK_PAREN_CLOSE) { - AST::MetaItems item_attrs = Parse_ItemAttrs(lex); + auto item_attrs = Parse_ItemAttrs(lex); SET_ATTRS(lex, item_attrs); bool is_pub = Parse_Publicity(lex, /*allow_restricted=*/false); // HACK: Disable `pub(restricted)` syntax in tuple structs, due to ambiguity @@ -582,7 +582,7 @@ AST::Struct Parse_Struct(TokenStream& lex, const AST::MetaItems& meta_items) { PUTBACK(tok, lex); - AST::MetaItems item_attrs = Parse_ItemAttrs(lex); + auto item_attrs = Parse_ItemAttrs(lex); SET_ATTRS(lex, item_attrs); bool is_pub = Parse_Publicity(lex); @@ -607,7 +607,7 @@ AST::Struct Parse_Struct(TokenStream& lex, const AST::MetaItems& meta_items) } } -AST::Trait Parse_TraitDef(TokenStream& lex, const AST::MetaItems& meta_items) +AST::Trait Parse_TraitDef(TokenStream& lex, const AST::AttributeList& meta_items) { TRACE_FUNCTION; @@ -662,7 +662,7 @@ AST::Trait Parse_TraitDef(TokenStream& lex, const AST::MetaItems& meta_items) { PUTBACK(tok, lex); - AST::MetaItems item_attrs = Parse_ItemAttrs(lex); + auto item_attrs = Parse_ItemAttrs(lex); SET_ATTRS(lex, item_attrs); auto ps = lex.start_span(); @@ -795,7 +795,7 @@ AST::Trait Parse_TraitDef(TokenStream& lex, const AST::MetaItems& meta_items) return trait; } -AST::Enum Parse_EnumDef(TokenStream& lex, const AST::MetaItems& meta_items) +AST::Enum Parse_EnumDef(TokenStream& lex, const AST::AttributeList& meta_items) { TRACE_FUNCTION; @@ -823,7 +823,7 @@ AST::Enum Parse_EnumDef(TokenStream& lex, const AST::MetaItems& meta_items) auto sp = lex.start_span(); PUTBACK(tok, lex); - AST::MetaItems item_attrs = Parse_ItemAttrs(lex); + auto item_attrs = Parse_ItemAttrs(lex); SET_ATTRS(lex, item_attrs); GET_CHECK_TOK(tok, lex, TOK_IDENT); @@ -841,7 +841,7 @@ AST::Enum Parse_EnumDef(TokenStream& lex, const AST::MetaItems& meta_items) break; } - AST::MetaItems field_attrs = Parse_ItemAttrs(lex); + auto field_attrs = Parse_ItemAttrs(lex); (void)field_attrs; // TODO^ types.push_back( Parse_Type(lex) ); @@ -862,7 +862,7 @@ AST::Enum Parse_EnumDef(TokenStream& lex, const AST::MetaItems& meta_items) break; } - AST::MetaItems field_attrs = Parse_ItemAttrs(lex); + auto field_attrs = Parse_ItemAttrs(lex); GET_CHECK_TOK(tok, lex, TOK_IDENT); auto name = mv$(tok.str()); @@ -897,7 +897,7 @@ AST::Enum Parse_EnumDef(TokenStream& lex, const AST::MetaItems& meta_items) return AST::Enum( mv$(params), mv$(variants) ); } -::AST::Union Parse_Union(TokenStream& lex, AST::MetaItems& meta_items) +::AST::Union Parse_Union(TokenStream& lex, AST::AttributeList& meta_items) { Token tok; @@ -924,7 +924,7 @@ AST::Enum Parse_EnumDef(TokenStream& lex, const AST::MetaItems& meta_items) break ; } - AST::MetaItems item_attrs = Parse_ItemAttrs(lex); + auto item_attrs = Parse_ItemAttrs(lex); SET_ATTRS(lex, item_attrs); bool is_pub = Parse_Publicity(lex); @@ -943,9 +943,9 @@ AST::Enum Parse_EnumDef(TokenStream& lex, const AST::MetaItems& meta_items) return ::AST::Union( mv$(params), mv$(variants) ); } -AST::MetaItems Parse_ItemAttrs(TokenStream& lex) +AST::AttributeList Parse_ItemAttrs(TokenStream& lex) { - AST::MetaItems rv; + AST::AttributeList rv; Token tok; while( lex.lookahead(0) == TOK_HASH ) { @@ -956,7 +956,7 @@ AST::MetaItems Parse_ItemAttrs(TokenStream& lex) } return rv; } -void Parse_ParentAttrs(TokenStream& lex, AST::MetaItems& out) +void Parse_ParentAttrs(TokenStream& lex, AST::AttributeList& out) { Token tok; while( lex.lookahead(0) == TOK_HASH && lex.lookahead(1) == TOK_EXCLAM ) @@ -969,7 +969,7 @@ void Parse_ParentAttrs(TokenStream& lex, AST::MetaItems& out) } } /// Parse a meta-item declaration (either #![ or #[) -AST::MetaItem Parse_MetaItem(TokenStream& lex) +AST::Attribute Parse_MetaItem(TokenStream& lex) { TRACE_FUNCTION; Token tok; @@ -979,6 +979,7 @@ AST::MetaItem Parse_MetaItem(TokenStream& lex) return mv$(tok.frag_meta()); } + auto ps = lex.start_span(); CHECK_TOK(tok, TOK_IDENT); ::std::string name = mv$(tok.str()); switch(GET_TOK(tok, lex)) @@ -987,24 +988,26 @@ AST::MetaItem Parse_MetaItem(TokenStream& lex) switch(GET_TOK(tok, lex)) { case TOK_STRING: - return AST::MetaItem(name, tok.str()); + return AST::Attribute(lex.end_span(ps), name, tok.str()); case TOK_INTERPOLATED_EXPR: { auto n = tok.take_frag_node(); if( auto* v = dynamic_cast<::AST::ExprNode_String*>(&*n) ) { - return AST::MetaItem(name, mv$(v->m_value)); + return AST::Attribute(lex.end_span(ps), name, mv$(v->m_value)); } else { + // - Force an error. CHECK_TOK(tok, TOK_STRING); } break; } default: + // - Force an error. CHECK_TOK(tok, TOK_STRING); } throw ""; case TOK_PAREN_OPEN: { - ::std::vector<AST::MetaItem> items; + ::std::vector<AST::Attribute> items; do { if(LOOK_AHEAD(lex) == TOK_PAREN_CLOSE) { GET_TOK(tok, lex); @@ -1013,14 +1016,14 @@ AST::MetaItem Parse_MetaItem(TokenStream& lex) items.push_back(Parse_MetaItem(lex)); } while(GET_TOK(tok, lex) == TOK_COMMA); CHECK_TOK(tok, TOK_PAREN_CLOSE); - return AST::MetaItem(name, mv$(items)); } + return AST::Attribute(lex.end_span(ps), name, mv$(items)); } default: PUTBACK(tok, lex); - return AST::MetaItem(name); + return AST::Attribute(lex.end_span(ps), name); } } -::AST::Item Parse_Impl(TokenStream& lex, AST::MetaItems attrs, bool is_unsafe=false) +::AST::Item Parse_Impl(TokenStream& lex, AST::AttributeList attrs, bool is_unsafe=false) { TRACE_FUNCTION; Token tok; @@ -1057,7 +1060,7 @@ AST::MetaItem Parse_MetaItem(TokenStream& lex) // negative impls can't have any content GET_CHECK_TOK(tok, lex, TOK_BRACE_CLOSE); - return ::AST::Item::make_NegImpl( AST::ImplDef(lex.end_span(ps), mv$(attrs), mv$(params), mv$(trait_path), mv$(impl_type) ) ); + return ::AST::Item::make_NegImpl(AST::ImplDef( mv$(attrs), mv$(params), mv$(trait_path), mv$(impl_type) )); } // - Don't care which at this stage @@ -1102,7 +1105,7 @@ AST::MetaItem Parse_MetaItem(TokenStream& lex) Parse_ParentAttrs(lex, attrs); - AST::Impl impl( AST::ImplDef( lex.end_span(ps), mv$(attrs), mv$(params), mv$(trait_path), mv$(impl_type) ) ); + auto impl = AST::Impl(AST::ImplDef( mv$(attrs), mv$(params), mv$(trait_path), mv$(impl_type) )); // A sequence of method implementations while( lex.lookahead(0) != TOK_BRACE_CLOSE ) @@ -1119,7 +1122,7 @@ void Parse_Impl_Item(TokenStream& lex, AST::Impl& impl) TRACE_FUNCTION; Token tok; - AST::MetaItems item_attrs = Parse_ItemAttrs(lex); + auto item_attrs = Parse_ItemAttrs(lex); SET_ATTRS(lex, item_attrs); { @@ -1216,7 +1219,7 @@ void Parse_Impl_Item(TokenStream& lex, AST::Impl& impl) impl.items().back().data->attrs = mv$(item_attrs); // Empty for functions } -AST::ExternBlock Parse_ExternBlock(TokenStream& lex, ::std::string abi, ::AST::MetaItems& block_attrs) +AST::ExternBlock Parse_ExternBlock(TokenStream& lex, ::std::string abi, ::AST::AttributeList& block_attrs) { TRACE_FUNCTION; Token tok; @@ -1228,7 +1231,7 @@ AST::ExternBlock Parse_ExternBlock(TokenStream& lex, ::std::string abi, ::AST::M while( GET_TOK(tok, lex) != TOK_BRACE_CLOSE ) { PUTBACK(tok, lex); - AST::MetaItems meta_items = Parse_ItemAttrs(lex); + auto meta_items = Parse_ItemAttrs(lex); SET_ATTRS(lex, meta_items); auto ps = lex.start_span(); @@ -1452,7 +1455,7 @@ bool Parse_MacroInvocation_Opt(TokenStream& lex, AST::MacroInvocation& out_inv) return true; } -::AST::Named<::AST::Item> Parse_Mod_Item_S(TokenStream& lex, const AST::Module::FileInfo& mod_fileinfo, const ::AST::Path& mod_path, AST::MetaItems meta_items) +::AST::Named<::AST::Item> Parse_Mod_Item_S(TokenStream& lex, const AST::Module::FileInfo& mod_fileinfo, const ::AST::Path& mod_path, AST::AttributeList meta_items) { TRACE_FUNCTION_F("mod_path="<<mod_path<<", meta_items="<<meta_items); Token tok; @@ -1644,7 +1647,6 @@ bool Parse_MacroInvocation_Opt(TokenStream& lex, AST::MacroInvocation& out_inv) // `unsafe trait` // `unsafe impl` case TOK_RWORD_UNSAFE: - meta_items.push_back( AST::MetaItem("#UNSAFE") ); switch(GET_TOK(tok, lex)) { // `unsafe extern fn` @@ -1669,16 +1671,27 @@ bool Parse_MacroInvocation_Opt(TokenStream& lex, AST::MacroInvocation& out_inv) item_data = ::AST::Item( Parse_FunctionDefWithCode(lex, ABI_RUST, false, true,false/*unsafe,const*/) ); break; // `unsafe trait` - case TOK_RWORD_TRAIT: + case TOK_RWORD_TRAIT: { GET_CHECK_TOK(tok, lex, TOK_IDENT); item_name = mv$(tok.str()); - // TODO: Mark as unsafe - meta_items.push_back( AST::MetaItem("#UNSAFE") ); - item_data = ::AST::Item( Parse_TraitDef(lex, meta_items) ); - break; + auto tr = Parse_TraitDef(lex, meta_items); + tr.set_is_unsafe(); + item_data = ::AST::Item( ::std::move(tr) ); + break; } // `unsafe impl` - case TOK_RWORD_IMPL: - return ::AST::Named< ::AST::Item> { "", Parse_Impl(lex, mv$(meta_items), true), false }; + case TOK_RWORD_IMPL: { + auto impl = Parse_Impl(lex, mv$(meta_items), true); + if( impl.is_Impl() ) { + impl.as_Impl().def().set_is_unsafe(); + } + else if( impl.is_NegImpl() ) { + impl.as_NegImpl().set_is_unsafe(); + } + else { + BUG(lex.point_span(), "Parse_Impl returned a variant other than Impl or NegImpl"); + } + return ::AST::Named< ::AST::Item> { "", mv$(impl), false }; + } default: throw ParseError::Unexpected(lex, tok, {TOK_RWORD_FN, TOK_RWORD_TRAIT, TOK_RWORD_IMPL}); } @@ -1772,10 +1785,10 @@ bool Parse_MacroInvocation_Opt(TokenStream& lex, AST::MacroInvocation& out_inv) // Check #[cfg] and don't load if it fails struct H { - static bool check_item_cfg(const ::AST::MetaItems& attrs) + static bool check_item_cfg(const ::AST::AttributeList& attrs) { for(const auto& at : attrs.m_items) { - if( at.name() == "cfg" && !check_cfg(attrs.m_span, at) ) { + if( at.name() == "cfg" && !check_cfg(at.span(), at) ) { return false; } } @@ -1853,7 +1866,7 @@ bool Parse_MacroInvocation_Opt(TokenStream& lex, AST::MacroInvocation& out_inv) return ::AST::Named< ::AST::Item> { mv$(item_name), mv$(item_data), is_public }; } -void Parse_Mod_Item(TokenStream& lex, AST::Module& mod, AST::MetaItems meta_items) +void Parse_Mod_Item(TokenStream& lex, AST::Module& mod, AST::AttributeList meta_items) { SET_MODULE(lex, mod); lex.parse_state().parent_attrs = &meta_items; @@ -1899,14 +1912,14 @@ void Parse_ModRoot_Items(TokenStream& lex, AST::Module& mod) } // Attributes on the following item - AST::MetaItems meta_items = Parse_ItemAttrs(lex); + auto meta_items = Parse_ItemAttrs(lex); DEBUG("meta_items = " << meta_items); Parse_Mod_Item(lex, mod, mv$(meta_items)); } } -void Parse_ModRoot(TokenStream& lex, AST::Module& mod, AST::MetaItems& mod_attrs) +void Parse_ModRoot(TokenStream& lex, AST::Module& mod, AST::AttributeList& mod_attrs) { TRACE_FUNCTION; diff --git a/src/parse/token.cpp b/src/parse/token.cpp index 768a96bc..6f3bafd9 100644 --- a/src/parse/token.cpp +++ b/src/parse/token.cpp @@ -33,7 +33,7 @@ Token::~Token() delete reinterpret_cast<AST::ExprNode*>(m_data.as_Fragment()); break; case TOK_INTERPOLATED_META: - delete reinterpret_cast<AST::MetaItem*>(m_data.as_Fragment()); + delete reinterpret_cast<AST::Attribute*>(m_data.as_Fragment()); break; default: break; @@ -92,7 +92,7 @@ Token::Token(const InterpolatedFragment& frag) break; case InterpolatedFragment::META: m_type = TOK_INTERPOLATED_META; - m_data = new AST::MetaItem( reinterpret_cast<const AST::MetaItem*>(frag.m_ptr)->clone() ); + m_data = new AST::Attribute( reinterpret_cast<const AST::Attribute*>(frag.m_ptr)->clone() ); break; case InterpolatedFragment::ITEM: { m_type = TOK_INTERPOLATED_ITEM; @@ -197,11 +197,11 @@ Token Token::clone() const rv.m_data = reinterpret_cast<AST::ExprNode*>(e)->clone().release(); break; case TOK_INTERPOLATED_META: - rv.m_data = new AST::MetaItem( reinterpret_cast<AST::MetaItem*>(e)->clone() ); + rv.m_data = new AST::Attribute( reinterpret_cast<AST::Attribute*>(e)->clone() ); break; case TOK_INTERPOLATED_ITEM: TODO(m_pos, "clone interpolated item"); - //rv.m_data = new AST::Named( AST::Item( reinterpret_cast<AST::MetaItem*>(e)->clone() ) ); + //rv.m_data = new AST::Named( AST::Item( reinterpret_cast<AST::Attribute*>(e)->clone() ) ); break; default: BUG(m_pos, "Fragment with invalid token type (" << *this << ")"); @@ -553,7 +553,7 @@ SERIALISE_TYPE(Token::, "Token", { os << ":" << *reinterpret_cast<AST::ExprNode*>(tok.m_data.as_Fragment()); break; case TOK_INTERPOLATED_META: - os << ":" << *reinterpret_cast<AST::MetaItem*>(tok.m_data.as_Fragment()); + os << ":" << *reinterpret_cast<AST::Attribute*>(tok.m_data.as_Fragment()); break; case TOK_INTERPOLATED_ITEM: { const auto& named_item = *reinterpret_cast<const AST::Named<AST::Item>*>(tok.m_data.as_Fragment()); diff --git a/src/parse/token.hpp b/src/parse/token.hpp index 0ef8f009..71b543fc 100644 --- a/src/parse/token.hpp +++ b/src/parse/token.hpp @@ -47,7 +47,7 @@ namespace AST { class Pattern; class Path; class ExprNode; - class MetaItem; + class Attribute; class Item; template<typename T> @@ -115,7 +115,7 @@ public: TypeRef& frag_type() { assert(m_type == TOK_INTERPOLATED_TYPE); return *reinterpret_cast<TypeRef*>( m_data.as_Fragment() ); } AST::Path& frag_path() { assert(m_type == TOK_INTERPOLATED_PATH); return *reinterpret_cast<AST::Path*>( m_data.as_Fragment() ); } AST::Pattern& frag_pattern() { assert(m_type == TOK_INTERPOLATED_PATTERN); return *reinterpret_cast<AST::Pattern*>( m_data.as_Fragment() ); } - AST::MetaItem& frag_meta() { assert(m_type == TOK_INTERPOLATED_META); return *reinterpret_cast<AST::MetaItem*>( m_data.as_Fragment() ); } + AST::Attribute& frag_meta() { assert(m_type == TOK_INTERPOLATED_META); return *reinterpret_cast<AST::Attribute*>( m_data.as_Fragment() ); } ::std::unique_ptr<AST::ExprNode> take_frag_node(); ::AST::Named<AST::Item> take_frag_item(); diff --git a/src/parse/tokenstream.hpp b/src/parse/tokenstream.hpp index 766e52bc..a9d325c2 100644 --- a/src/parse/tokenstream.hpp +++ b/src/parse/tokenstream.hpp @@ -16,7 +16,7 @@ namespace AST { class Module; - class MetaItems; + class AttributeList; } /// State the parser needs to pass down via a second channel. @@ -28,7 +28,7 @@ struct ParseState bool no_expand_macros = false; ::AST::Module* module = nullptr; - ::AST::MetaItems* parent_attrs = nullptr; + ::AST::AttributeList* parent_attrs = nullptr; ::AST::Module& get_current_mod() { assert(this->module); diff --git a/src/resolve/absolute.cpp b/src/resolve/absolute.cpp index 5e9cb51c..2c17592c 100644 --- a/src/resolve/absolute.cpp +++ b/src/resolve/absolute.cpp @@ -2069,7 +2069,7 @@ void Resolve_Absolute_Mod( Context item_context, ::AST::Module& mod ) Resolve_Absolute_Path(item_context, def.trait().sp, Context::LookupMode::Type, def.trait().ent); if( e.items().size() != 0 ) { - ERROR(def.span(), E0000, "impl Trait for .. with methods"); + ERROR(i.data.span, E0000, "impl Trait for .. with methods"); } item_context.pop(def.params()); @@ -2102,7 +2102,7 @@ void Resolve_Absolute_Mod( Context item_context, ::AST::Module& mod ) Resolve_Absolute_Type(item_context, impl_def.type()); if( !impl_def.trait().ent.is_valid() ) - BUG(impl_def.span(), "Encountered negative impl with no trait"); + BUG(i.data.span, "Encountered negative impl with no trait"); Resolve_Absolute_Path(item_context, impl_def.trait().sp, Context::LookupMode::Type, impl_def.trait().ent); // No items |