Implement import of forward declarations of Objective-C classes

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@96554 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Douglas Gregor 2010-02-18 02:04:09 +00:00
Родитель f3f8d2a52e
Коммит a2bc15b746
3 изменённых файлов: 52 добавлений и 1 удалений

Просмотреть файл

@ -99,7 +99,8 @@ namespace {
Decl *VisitObjCProtocolDecl(ObjCProtocolDecl *D);
Decl *VisitObjCInterfaceDecl(ObjCInterfaceDecl *D);
Decl *VisitObjCPropertyDecl(ObjCPropertyDecl *D);
Decl *VisitObjCClassDecl(ObjCClassDecl *D);
// Importing statements
Stmt *VisitStmt(Stmt *S);
@ -2484,6 +2485,46 @@ Decl *ASTNodeImporter::VisitObjCPropertyDecl(ObjCPropertyDecl *D) {
return ToProperty;
}
Decl *ASTNodeImporter::VisitObjCClassDecl(ObjCClassDecl *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<ObjCInterfaceDecl *, 4> Interfaces;
llvm::SmallVector<SourceLocation, 4> Locations;
for (ObjCClassDecl::iterator From = D->begin(), FromEnd = D->end();
From != FromEnd; ++From) {
ObjCInterfaceDecl *ToIface
= cast_or_null<ObjCInterfaceDecl>(Importer.Import(From->getInterface()));
if (!ToIface)
continue;
Interfaces.push_back(ToIface);
Locations.push_back(Importer.Import(From->getLocation()));
}
ObjCClassDecl *ToClass = ObjCClassDecl::Create(Importer.getToContext(), DC,
Loc,
Interfaces.data(),
Locations.data(),
Interfaces.size());
ToClass->setLexicalDeclContext(LexicalDC);
LexicalDC->addDecl(ToClass);
Importer.Imported(D, ToClass);
return ToClass;
}
//----------------------------------------------------------------------------
// Import Statements
//----------------------------------------------------------------------------

Просмотреть файл

@ -68,3 +68,8 @@
@protocol P2 <P0>
- (float)wibble:(int)a1 second:(int)a2;
@end
// Forward-declared interfaces
@class I10, I11;
@interface I12
@end

Просмотреть файл

@ -67,3 +67,8 @@
@protocol P2 <P0>
- (float)wibble:(int)a1 second:(int)a2;
@end
// Forward-declared interface
@class I12, I10;
@interface I11
@end