summaryrefslogtreecommitdiff
path: root/src/parse/expr.cpp
diff options
context:
space:
mode:
authorJohn Hodge (sonata) <tpg@mutabah.net>2015-01-05 14:01:17 +0800
committerJohn Hodge (sonata) <tpg@mutabah.net>2015-01-05 14:01:17 +0800
commit9cabbe613eb4cff9101d1b8a5757038f59570e97 (patch)
tree8b752490eda24cd77743d8a54198fdb1298f31f0 /src/parse/expr.cpp
parenteac8e3d68b9ca67f97c1f9aedef01e8e93cde323 (diff)
downloadmrust-9cabbe613eb4cff9101d1b8a5757038f59570e97.tar.gz
Parser - Handle methods correctly
Diffstat (limited to 'src/parse/expr.cpp')
-rw-r--r--src/parse/expr.cpp27
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;