зеркало из https://github.com/microsoft/clang.git
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:
Родитель
f3f8d2a52e
Коммит
a2bc15b746
|
@ -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
|
||||
|
|
Загрузка…
Ссылка в новой задаче