forked from OSchip/llvm-project
AST import for forward declarations of Objective-C protocols
llvm-svn: 96555
This commit is contained in:
parent
06537af873
commit
8661a72b48
|
@ -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());
|
||||
|
|
|
@ -73,3 +73,9 @@
|
|||
@class I10, I11;
|
||||
@interface I12
|
||||
@end
|
||||
|
||||
// Forward-declared protocols
|
||||
@protocol P3, P5;
|
||||
@protocol P4
|
||||
- (double)honk:(int)a;
|
||||
@end
|
||||
|
|
|
@ -72,3 +72,9 @@
|
|||
@class I12, I10;
|
||||
@interface I11
|
||||
@end
|
||||
|
||||
// Forward-declared protocols
|
||||
@protocol P3, P4;
|
||||
@protocol P5
|
||||
- (double)honk:(int)a;
|
||||
@end
|
||||
|
|
Loading…
Reference in New Issue