summaryrefslogtreecommitdiff
path: root/src/parse
diff options
context:
space:
mode:
Diffstat (limited to 'src/parse')
-rw-r--r--src/parse/common.hpp2
-rw-r--r--src/parse/expr.cpp2
-rw-r--r--src/parse/root.cpp17
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: {