diff options
Diffstat (limited to 'src/parse/types.cpp')
-rw-r--r-- | src/parse/types.cpp | 37 |
1 files changed, 28 insertions, 9 deletions
diff --git a/src/parse/types.cpp b/src/parse/types.cpp index 2070a0d2..95076e29 100644 --- a/src/parse/types.cpp +++ b/src/parse/types.cpp @@ -35,7 +35,7 @@ static const struct { // === PROTOTYPES === TypeRef Parse_Type(TokenStream& lex); -TypeRef Parse_Type_Fn(TokenStream& lex, ::std::string abi); +TypeRef Parse_Type_Fn(TokenStream& lex); // === CODE === TypeRef Parse_Type(TokenStream& lex) @@ -52,16 +52,18 @@ TypeRef Parse_Type(TokenStream& lex) // '_' = Wildcard (type inferrence variable) case TOK_UNDERSCORE: return TypeRef(); + // 'unsafe' - An unsafe function type + case TOK_RWORD_UNSAFE: + lex.putback(tok); + return Parse_Type_Fn(lex); // 'extern' - A function type with an ABI - case TOK_RWORD_EXTERN: { - GET_CHECK_TOK(tok, lex, TOK_STRING); - ::std::string abi = tok.str(); - GET_CHECK_TOK(tok, lex, TOK_RWORD_FN); - return Parse_Type_Fn(lex, abi); - } + case TOK_RWORD_EXTERN: + lex.putback(tok); + return Parse_Type_Fn(lex); // 'fn' - Rust function case TOK_RWORD_FN: - return Parse_Type_Fn(lex, ""); + lex.putback(tok); + return Parse_Type_Fn(lex); // '<' - An associated type cast case TOK_LT: lex.putback(tok); @@ -222,11 +224,28 @@ TypeRef Parse_Type(TokenStream& lex) throw ParseError::BugCheck("Reached end of Parse_Type"); } -TypeRef Parse_Type_Fn(TokenStream& lex, ::std::string abi) +TypeRef Parse_Type_Fn(TokenStream& lex) { TRACE_FUNCTION; Token tok; + ::std::string abi = ""; + + GET_TOK(tok, lex); + + if( tok.type() == TOK_RWORD_UNSAFE ) + { + // TODO: Unsafe functions in types + GET_TOK(tok, lex); + } + if( tok.type() == TOK_RWORD_EXTERN ) + { + GET_CHECK_TOK(tok, lex, TOK_STRING); + abi = tok.str(); + GET_TOK(tok, lex); + } + CHECK_TOK(tok, TOK_RWORD_FN); + ::std::vector<TypeRef> args; GET_CHECK_TOK(tok, lex, TOK_PAREN_OPEN); while( LOOK_AHEAD(lex) != TOK_PAREN_CLOSE ) |