diff options
author | Chris Lattner <sabre@nondot.org> | 2008-07-21 22:17:28 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2008-07-21 22:17:28 +0000 |
commit | 7caeabd868d46cf4e68478c6e9136dae4e735d21 (patch) | |
tree | 9988137f38a9fd308fc641b15f8cd91f79cffd2e /lib/Parse/ParseObjc.cpp | |
parent | 465172f304248a9aab6f2c398a836ce4e25efbbf (diff) |
minor cleanup to the actions interface to pass around SmallVectorImpl instead
of a specific smallvector size.
Fix protocol lists to pass down proper location info, so we get diagnostics
like this:
t.m:3:35: error: cannot find protocol definition for 'NSCopying', referenced by 'NSWhatever'
@interface NSWhatever : NSObject <NSCopying>
^
instead of this:
t.m:3:44: error: cannot find protocol definition for 'NSCopying', referenced by 'NSWhatever'
@interface NSWhatever : NSObject <NSCopying>
^
Add a new IdentifierLocPair typedef which is just a pair<IdentifierInfo*, SourceLocation>
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@53883 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Parse/ParseObjc.cpp')
-rw-r--r-- | lib/Parse/ParseObjc.cpp | 41 |
1 files changed, 24 insertions, 17 deletions
diff --git a/lib/Parse/ParseObjc.cpp b/lib/Parse/ParseObjc.cpp index baf2667a54..7d7ba10a38 100644 --- a/lib/Parse/ParseObjc.cpp +++ b/lib/Parse/ParseObjc.cpp @@ -131,7 +131,7 @@ Parser::DeclTy *Parser::ParseObjCAtInterfaceDeclaration( SourceLocation lparenLoc = ConsumeParen(); SourceLocation categoryLoc, rparenLoc; IdentifierInfo *categoryId = 0; - llvm::SmallVector<IdentifierInfo *, 8> ProtocolRefs; + llvm::SmallVector<IdentifierLocPair, 8> ProtocolRefs; // For ObjC2, the category name is optional (not an error). if (Tok.is(tok::identifier)) { @@ -185,7 +185,7 @@ Parser::DeclTy *Parser::ParseObjCAtInterfaceDeclaration( superClassLoc = ConsumeToken(); } // Next, we need to check for any protocol references. - llvm::SmallVector<IdentifierInfo *, 8> ProtocolRefs; + llvm::SmallVector<IdentifierLocPair, 8> ProtocolRefs; SourceLocation endProtoLoc; if (Tok.is(tok::less)) { if (ParseObjCProtocolReferences(ProtocolRefs, endProtoLoc)) @@ -337,7 +337,7 @@ void Parser::ParseObjCInterfaceDeclList(DeclTy *interfaceDecl, /// copy /// nonatomic /// -void Parser::ParseObjCPropertyAttribute (ObjCDeclSpec &DS) { +void Parser::ParseObjCPropertyAttribute(ObjCDeclSpec &DS) { SourceLocation loc = ConsumeParen(); // consume '(' while (isObjCPropertyAttribute()) { const IdentifierInfo *II = Tok.getIdentifierInfo(); @@ -715,8 +715,9 @@ Parser::DeclTy *Parser::ParseObjCMethodDecl(SourceLocation mLoc, /// objc-protocol-refs: /// '<' identifier-list '>' /// -bool Parser::ParseObjCProtocolReferences( - llvm::SmallVectorImpl<IdentifierInfo*> &ProtocolRefs, SourceLocation &endLoc){ +bool Parser:: +ParseObjCProtocolReferences(llvm::SmallVectorImpl<IdentifierLocPair> &Protocols, + SourceLocation &endLoc) { assert(Tok.is(tok::less) && "expected <"); ConsumeToken(); // the "<" @@ -727,7 +728,8 @@ bool Parser::ParseObjCProtocolReferences( SkipUntil(tok::greater); return true; } - ProtocolRefs.push_back(Tok.getIdentifierInfo()); + Protocols.push_back(std::make_pair(Tok.getIdentifierInfo(), + Tok.getLocation())); ConsumeToken(); if (Tok.isNot(tok::comma)) @@ -865,15 +867,17 @@ Parser::DeclTy *Parser::ParseObjCAtProtocolDeclaration(SourceLocation AtLoc) { IdentifierInfo *protocolName = Tok.getIdentifierInfo(); SourceLocation nameLoc = ConsumeToken(); - llvm::SmallVector<IdentifierInfo *, 8> ProtocolRefs; if (Tok.is(tok::semi)) { // forward declaration of one protocol. + IdentifierLocPair ProtoInfo(protocolName, nameLoc); ConsumeToken(); - ProtocolRefs.push_back(protocolName); + return Actions.ActOnForwardProtocolDeclaration(AtLoc, &ProtoInfo, 1); } + if (Tok.is(tok::comma)) { // list of forward declarations. + llvm::SmallVector<IdentifierLocPair, 8> ProtocolRefs; + ProtocolRefs.push_back(std::make_pair(protocolName, nameLoc)); + // Parse the list of forward declarations. - ProtocolRefs.push_back(protocolName); - while (1) { ConsumeToken(); // the ',' if (Tok.isNot(tok::identifier)) { @@ -881,7 +885,8 @@ Parser::DeclTy *Parser::ParseObjCAtProtocolDeclaration(SourceLocation AtLoc) { SkipUntil(tok::semi); return 0; } - ProtocolRefs.push_back(Tok.getIdentifierInfo()); + ProtocolRefs.push_back(IdentifierLocPair(Tok.getIdentifierInfo(), + Tok.getLocation())); ConsumeToken(); // the identifier if (Tok.isNot(tok::comma)) @@ -890,17 +895,19 @@ Parser::DeclTy *Parser::ParseObjCAtProtocolDeclaration(SourceLocation AtLoc) { // Consume the ';'. if (ExpectAndConsume(tok::semi, diag::err_expected_semi_after, "@protocol")) return 0; - } - if (!ProtocolRefs.empty()) + return Actions.ActOnForwardProtocolDeclaration(AtLoc, &ProtocolRefs[0], ProtocolRefs.size()); + } + // Last, and definitely not least, parse a protocol declaration. SourceLocation endProtoLoc; - if (Tok.is(tok::less)) { - if (ParseObjCProtocolReferences(ProtocolRefs, endProtoLoc)) - return 0; - } + llvm::SmallVector<IdentifierLocPair, 8> ProtocolRefs; + + if (Tok.is(tok::less) && + ParseObjCProtocolReferences(ProtocolRefs, endProtoLoc)) + return 0; DeclTy *ProtoType = Actions.ActOnStartProtocolInterface(AtLoc, protocolName, nameLoc, |