diff options
author | John Hodge (sonata) <tpg@mutabah.net> | 2015-01-05 14:01:17 +0800 |
---|---|---|
committer | John Hodge (sonata) <tpg@mutabah.net> | 2015-01-05 14:01:17 +0800 |
commit | 9cabbe613eb4cff9101d1b8a5757038f59570e97 (patch) | |
tree | 8b752490eda24cd77743d8a54198fdb1298f31f0 /src/parse/expr.cpp | |
parent | eac8e3d68b9ca67f97c1f9aedef01e8e93cde323 (diff) | |
download | mrust-9cabbe613eb4cff9101d1b8a5757038f59570e97.tar.gz |
Parser - Handle methods correctly
Diffstat (limited to 'src/parse/expr.cpp')
-rw-r--r-- | src/parse/expr.cpp | 27 |
1 files changed, 17 insertions, 10 deletions
diff --git a/src/parse/expr.cpp b/src/parse/expr.cpp index 478673e3..fa9d43e9 100644 --- a/src/parse/expr.cpp +++ b/src/parse/expr.cpp @@ -406,18 +406,25 @@ ExprNodeP Parse_ExprFC(TokenStream& lex) lex.putback(tok);
val = NEWNODE( AST::ExprNode_CallObject, ::std::move(val), Parse_ParenList(lex) );
break;
- case TOK_DOT:
- // Field access
+ case TOK_DOT: {
+ // Field access / method call
// TODO: What about tuple indexing?
GET_CHECK_TOK(tok, lex, TOK_IDENT);
- val = NEWNODE( AST::ExprNode_Field, ::std::move(val), ::std::string(tok.str()) );
- //if( GET_TOK(tok, lex) == TOK_PAREN_OPEN || tok.type() == TOK_DOUBLE_COLON ) {
- // throw ParseError::Todo("method calls");
- //}
- //else {
- // lex.putback(tok);
- //}
- break;
+ ::std::string name = tok.str();
+ switch( GET_TOK(tok, lex) )
+ {
+ case TOK_PAREN_OPEN:
+ lex.putback(tok);
+ val = NEWNODE( AST::ExprNode_CallMethod, ::std::move(val), AST::PathNode(name, {}), Parse_ParenList(lex) );
+ break;
+ case TOK_DOUBLE_COLON:
+ throw ParseError::Todo("method calls - generic");
+ default:
+ val = NEWNODE( AST::ExprNode_Field, ::std::move(val), ::std::string(name) );
+ lex.putback(tok);
+ break;
+ }
+ break; }
default:
lex.putback(tok);
return val;
|