AST import for forward declarations of Objective-C protocols

llvm-svn: 96555
This commit is contained in:
Douglas Gregor 2010-02-18 02:12:22 +00:00
parent 06537af873
commit 8661a72b48
3 changed files with 57 additions and 0 deletions

View File

@ -99,6 +99,7 @@ namespace {
Decl *VisitObjCProtocolDecl(ObjCProtocolDecl *D);
Decl *VisitObjCInterfaceDecl(ObjCInterfaceDecl *D);
Decl *VisitObjCPropertyDecl(ObjCPropertyDecl *D);
Decl *VisitObjCForwardProtocolDecl(ObjCForwardProtocolDecl *D);
Decl *VisitObjCClassDecl(ObjCClassDecl *D);
// Importing statements
@ -2485,6 +2486,50 @@ Decl *ASTNodeImporter::VisitObjCPropertyDecl(ObjCPropertyDecl *D) {
return ToProperty;
}
Decl *
ASTNodeImporter::VisitObjCForwardProtocolDecl(ObjCForwardProtocolDecl *D) {
// Import the context of this declaration.
DeclContext *DC = Importer.ImportContext(D->getDeclContext());
if (!DC)
return 0;
DeclContext *LexicalDC = DC;
if (D->getDeclContext() != D->getLexicalDeclContext()) {
LexicalDC = Importer.ImportContext(D->getLexicalDeclContext());
if (!LexicalDC)
return 0;
}
// Import the location of this declaration.
SourceLocation Loc = Importer.Import(D->getLocation());
llvm::SmallVector<ObjCProtocolDecl *, 4> Protocols;
llvm::SmallVector<SourceLocation, 4> Locations;
ObjCForwardProtocolDecl::protocol_loc_iterator FromProtoLoc
= D->protocol_loc_begin();
for (ObjCForwardProtocolDecl::protocol_iterator FromProto
= D->protocol_begin(), FromProtoEnd = D->protocol_end();
FromProto != FromProtoEnd;
++FromProto, ++FromProtoLoc) {
ObjCProtocolDecl *ToProto
= cast_or_null<ObjCProtocolDecl>(Importer.Import(*FromProto));
if (!ToProto)
continue;
Protocols.push_back(ToProto);
Locations.push_back(Importer.Import(*FromProtoLoc));
}
ObjCForwardProtocolDecl *ToForward
= ObjCForwardProtocolDecl::Create(Importer.getToContext(), DC, Loc,
Protocols.data(), Protocols.size(),
Locations.data());
ToForward->setLexicalDeclContext(LexicalDC);
LexicalDC->addDecl(ToForward);
Importer.Imported(D, ToForward);
return ToForward;
}
Decl *ASTNodeImporter::VisitObjCClassDecl(ObjCClassDecl *D) {
// Import the context of this declaration.
DeclContext *DC = Importer.ImportContext(D->getDeclContext());

View File

@ -73,3 +73,9 @@
@class I10, I11;
@interface I12
@end
// Forward-declared protocols
@protocol P3, P5;
@protocol P4
- (double)honk:(int)a;
@end

View File

@ -72,3 +72,9 @@
@class I12, I10;
@interface I11
@end
// Forward-declared protocols
@protocol P3, P4;
@protocol P5
- (double)honk:(int)a;
@end