summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJohn Hodge <tpg@mutabah.net>2016-10-23 20:55:57 +0800
committerJohn Hodge <tpg@mutabah.net>2016-10-23 20:55:57 +0800
commitab5e023d02ac46505c8c7fc733a195d07429860e (patch)
treece6605116d87ab4714e62605b58d81ec077a9683 /src
parentea3c657845313a274f99cc568ff4e3310e248e15 (diff)
downloadmrust-ab5e023d02ac46505c8c7fc733a195d07429860e.tar.gz
Parse - `impl Trait`
Diffstat (limited to 'src')
-rw-r--r--src/parse/types.cpp25
1 files changed, 25 insertions, 0 deletions
diff --git a/src/parse/types.cpp b/src/parse/types.cpp
index 4f17dec1..0f20c8fa 100644
--- a/src/parse/types.cpp
+++ b/src/parse/types.cpp
@@ -15,6 +15,7 @@
TypeRef Parse_Type_Int(TokenStream& lex, bool allow_trait_list);
TypeRef Parse_Type_Fn(TokenStream& lex, ::std::vector<::std::string> hrls = {});
TypeRef Parse_Type_Path(TokenStream& lex, ::std::vector<::std::string> hrls, bool allow_trait_list);
+TypeRef Parse_Type_ErasedType(TokenStream& lex, bool allow_trait_list);
// === CODE ===
TypeRef Parse_Type(TokenStream& lex, bool allow_trait_list)
@@ -54,6 +55,9 @@ TypeRef Parse_Type_Int(TokenStream& lex, bool allow_trait_list)
PUTBACK(tok, lex);
return Parse_Type_Fn(lex);
+ case TOK_RWORD_IMPL:
+ return Parse_Type_ErasedType(lex, allow_trait_list);
+
// '<' - An associated type cast
case TOK_LT:
case TOK_DOUBLE_LT: {
@@ -293,4 +297,25 @@ TypeRef Parse_Type_Path(TokenStream& lex, ::std::vector<::std::string> hrls, boo
}
}
}
+TypeRef Parse_Type_ErasedType(TokenStream& lex, bool allow_trait_list)
+{
+ Token tok;
+
+ auto ps = lex.start_span();
+ ::std::vector<AST::Path> traits;
+ ::std::vector< ::std::string> lifetimes;
+ do {
+ if( LOOK_AHEAD(lex) == TOK_LIFETIME ) {
+ GET_TOK(tok, lex);
+ lifetimes.push_back( tok.str() );
+ }
+ else
+ traits.push_back( Parse_Path(lex, PATH_GENERIC_TYPE) );
+ } while( GET_TOK(tok, lex) == TOK_PLUS );
+ PUTBACK(tok, lex);
+
+ if( lifetimes.size() )
+ DEBUG("TODO: Lifetime bounds on erased types");
+ return TypeRef(lex.end_span(ps), TypeData::make_TraitObject({ {}, mv$(traits) }));
+}