diff options
author | John Hodge <tpg@mutabah.net> | 2016-10-23 20:55:57 +0800 |
---|---|---|
committer | John Hodge <tpg@mutabah.net> | 2016-10-23 20:55:57 +0800 |
commit | ab5e023d02ac46505c8c7fc733a195d07429860e (patch) | |
tree | ce6605116d87ab4714e62605b58d81ec077a9683 /src | |
parent | ea3c657845313a274f99cc568ff4e3310e248e15 (diff) | |
download | mrust-ab5e023d02ac46505c8c7fc733a195d07429860e.tar.gz |
Parse - `impl Trait`
Diffstat (limited to 'src')
-rw-r--r-- | src/parse/types.cpp | 25 |
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) })); +} |