diff options
author | Anders Carlsson <andersca@mac.com> | 2007-08-23 15:25:28 +0000 |
---|---|---|
committer | Anders Carlsson <andersca@mac.com> | 2007-08-23 15:25:28 +0000 |
commit | 29b2cb1ff1a3dd78edd38e2f43ee7041d3e4ec3c (patch) | |
tree | 3d8b048309a4f68b05be5cf50fcbe21713c892bf /Parse/ParseObjc.cpp | |
parent | f334850cd2fc2d4ac9b585f80d97b4f0097a0348 (diff) |
Parse ObjC @protocol expressions.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@41320 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'Parse/ParseObjc.cpp')
-rw-r--r-- | Parse/ParseObjc.cpp | 41 |
1 files changed, 40 insertions, 1 deletions
diff --git a/Parse/ParseObjc.cpp b/Parse/ParseObjc.cpp index 4f4bdfe012..b1c5366197 100644 --- a/Parse/ParseObjc.cpp +++ b/Parse/ParseObjc.cpp @@ -634,9 +634,15 @@ Parser::ExprResult Parser::ParseObjCExpression() { case tok::string_literal: // primary-expression: string-literal case tok::wide_string_literal: return ParseObjCStringLiteral(); + default: + break; + } + + switch (Tok.getIdentifierInfo()->getObjCKeywordID()) { case tok::objc_encode: return ParseObjCEncodeExpression(); - break; + case tok::objc_protocol: + return ParseObjCProtocolExpression(); default: Diag(AtLoc, diag::err_unexpected_at); SkipUntil(tok::semi); @@ -679,3 +685,36 @@ Parser::ExprResult Parser::ParseObjCEncodeExpression() { return Actions.ParseObjCEncodeExpression(EncLoc, LParenLoc, Ty, ConsumeParen()); } + +/// objc-protocol-expression +/// @protocol ( protocol-name ) + +Parser::ExprResult Parser::ParseObjCProtocolExpression() +{ + SourceLocation ProtoLoc = ConsumeToken(); + + if (Tok.getKind() != tok::l_paren) { + Diag(Tok, diag::err_expected_lparen_after, "@protocol"); + return true; + } + + SourceLocation LParenLoc = ConsumeParen(); + + if (Tok.getKind() != tok::identifier) { + Diag(Tok, diag::err_expected_ident); + return true; + } + + // FIXME: Do something with the protocol name + ConsumeToken(); + + if (Tok.getKind() != tok::r_paren) { + Diag(Tok, diag::err_expected_rparen); + return true; + } + + ConsumeParen(); + + // FIXME + return 0; +} |