summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/ast/ast.cpp44
-rw-r--r--src/ast/ast.hpp69
-rw-r--r--src/ast/attrs.hpp107
-rw-r--r--src/ast/crate.cpp6
-rw-r--r--src/ast/crate.hpp2
-rw-r--r--src/ast/dump.cpp4
-rw-r--r--src/ast/expr.hpp10
-rw-r--r--src/expand/cfg.cpp20
-rw-r--r--src/expand/cfg.hpp2
-rw-r--r--src/expand/crate_tags.cpp10
-rw-r--r--src/expand/derive.cpp26
-rw-r--r--src/expand/lang_item.cpp8
-rw-r--r--src/expand/macro_rules.cpp6
-rw-r--r--src/expand/mod.cpp23
-rw-r--r--src/expand/proc_macro.cpp6
-rw-r--r--src/expand/std_prelude.cpp10
-rw-r--r--src/expand/test.cpp6
-rw-r--r--src/hir/from_ast.cpp14
-rw-r--r--src/include/synext_decorator.hpp22
-rw-r--r--src/macro_rules/eval.cpp2
-rw-r--r--src/parse/common.hpp10
-rw-r--r--src/parse/expr.cpp8
-rw-r--r--src/parse/interpolated_fragment.cpp8
-rw-r--r--src/parse/interpolated_fragment.hpp4
-rw-r--r--src/parse/root.cpp105
-rw-r--r--src/parse/token.cpp10
-rw-r--r--src/parse/token.hpp4
-rw-r--r--src/parse/tokenstream.hpp4
-rw-r--r--src/resolve/absolute.cpp4
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