diff options
-rw-r--r-- | src/parse/common.hpp | 2 | ||||
-rw-r--r-- | src/parse/expr.cpp | 2 | ||||
-rw-r--r-- | src/parse/root.cpp | 17 |
3 files changed, 14 insertions, 7 deletions
diff --git a/src/parse/common.hpp b/src/parse/common.hpp index def771e2..0d8ae278 100644 --- a/src/parse/common.hpp +++ b/src/parse/common.hpp @@ -47,7 +47,7 @@ extern void Parse_Use(TokenStream& lex, ::std::function<void(AST::Path, ::std::s extern AST::Struct Parse_Struct(TokenStream& lex, const AST::MetaItems meta_items);
extern AST::Enum Parse_EnumDef(TokenStream& lex, const AST::MetaItems meta_items);
extern AST::Trait Parse_TraitDef(TokenStream& lex, const AST::MetaItems& meta_items);
-extern void Parse_Impl(TokenStream& lex, AST::Module& mod, bool is_unsafe=false);
+extern void Parse_Impl(TokenStream& lex, AST::Module& mod, AST::MetaItems attrs, bool is_unsafe=false);
extern void Parse_MacroRules(TokenStream& lex, AST::Module& mod, AST::MetaItems meta_items);
extern void Parse_ExternCrate(TokenStream& lex, AST::Module& mod, AST::MetaItems meta_items);
diff --git a/src/parse/expr.cpp b/src/parse/expr.cpp index 1026b5f5..50aaefad 100644 --- a/src/parse/expr.cpp +++ b/src/parse/expr.cpp @@ -166,7 +166,7 @@ ExprNodeP Parse_ExprBlockNode(TokenStream& lex) // - 'impl'
case TOK_RWORD_IMPL:
keep_mod = true;
- Parse_Impl(lex, *local_mod, false);
+ Parse_Impl(lex, *local_mod, mv$(item_attrs), false);
break;
// - 'fn'
case TOK_RWORD_FN:
diff --git a/src/parse/root.cpp b/src/parse/root.cpp index aa3b78d7..2ed19aee 100644 --- a/src/parse/root.cpp +++ b/src/parse/root.cpp @@ -776,10 +776,10 @@ AST::MetaItem Parse_MetaItem(TokenStream& lex) }
}
-void Parse_Impl(TokenStream& lex, AST::Module& mod, bool is_unsafe/*=false*/);
+void Parse_Impl(TokenStream& lex, AST::Module& mod, AST::MetaItems attrs, bool is_unsafe/*=false*/);
void Parse_Impl_Item(TokenStream& lex, AST::Impl& impl);
-void Parse_Impl(TokenStream& lex, AST::Module& mod, bool is_unsafe/*=false*/)
+void Parse_Impl(TokenStream& lex, AST::Module& mod, AST::MetaItems attrs, bool is_unsafe/*=false*/)
{
TRACE_FUNCTION;
Token tok;
@@ -858,8 +858,15 @@ void Parse_Impl(TokenStream& lex, AST::Module& mod, bool is_unsafe/*=false*/) }
GET_CHECK_TOK(tok, lex, TOK_BRACE_OPEN);
+ while( LOOK_AHEAD(lex) == TOK_CATTR_OPEN )
+ {
+ GET_TOK(tok, lex);
+ attrs.push_back( Parse_MetaItem(lex) );
+ GET_CHECK_TOK(tok, lex, TOK_SQUARE_CLOSE);
+ }
+
// TODO: Pass #[] attrs to impl blocks
- AST::Impl impl( AST::MetaItems(), ::std::move(params), ::std::move(impl_type), ::std::move(trait_path) );
+ AST::Impl impl( mv$(attrs), ::std::move(params), ::std::move(impl_type), ::std::move(trait_path) );
// A sequence of method implementations
while( GET_TOK(tok, lex) != TOK_BRACE_CLOSE )
@@ -1665,7 +1672,7 @@ void Parse_ModRoot_Items(TokenStream& lex, AST::Crate& crate, AST::Module& mod, break; }
// `unsafe impl`
case TOK_RWORD_IMPL:
- Parse_Impl(lex, mod, true);
+ Parse_Impl(lex, mod, mv$(meta_items), true);
break;
default:
throw ParseError::Unexpected(lex, tok, {TOK_RWORD_FN, TOK_RWORD_TRAIT, TOK_RWORD_IMPL});
@@ -1698,7 +1705,7 @@ void Parse_ModRoot_Items(TokenStream& lex, AST::Crate& crate, AST::Module& mod, break; }
// `impl`
case TOK_RWORD_IMPL:
- Parse_Impl(lex, mod);
+ Parse_Impl(lex, mod, mv$(meta_items));
break;
// `trait`
case TOK_RWORD_TRAIT: {
|