diff options
author | Douglas Gregor <dgregor@apple.com> | 2010-02-18 02:04:09 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2010-02-18 02:04:09 +0000 |
commit | a2bc15b7463a9f85a5bff1531d833c278426a733 (patch) | |
tree | a132c0e4cacde8f01e409123b56c73bea596d508 | |
parent | f3f8d2a52ebc0acbe6269a0302f90c21668e2404 (diff) |
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
-rw-r--r-- | lib/AST/ASTImporter.cpp | 43 | ||||
-rw-r--r-- | test/ASTMerge/Inputs/interface1.m | 5 | ||||
-rw-r--r-- | test/ASTMerge/Inputs/interface2.m | 5 |
3 files changed, 52 insertions, 1 deletions
diff --git a/lib/AST/ASTImporter.cpp b/lib/AST/ASTImporter.cpp index cde3402f7a..b0d463bec7 100644 --- a/lib/AST/ASTImporter.cpp +++ b/lib/AST/ASTImporter.cpp @@ -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 //---------------------------------------------------------------------------- diff --git a/test/ASTMerge/Inputs/interface1.m b/test/ASTMerge/Inputs/interface1.m index a508bc159b..029dad329b 100644 --- a/test/ASTMerge/Inputs/interface1.m +++ b/test/ASTMerge/Inputs/interface1.m @@ -68,3 +68,8 @@ @protocol P2 <P0> - (float)wibble:(int)a1 second:(int)a2; @end + +// Forward-declared interfaces +@class I10, I11; +@interface I12 +@end diff --git a/test/ASTMerge/Inputs/interface2.m b/test/ASTMerge/Inputs/interface2.m index d79f77d92a..30de98160c 100644 --- a/test/ASTMerge/Inputs/interface2.m +++ b/test/ASTMerge/Inputs/interface2.m @@ -67,3 +67,8 @@ @protocol P2 <P0> - (float)wibble:(int)a1 second:(int)a2; @end + +// Forward-declared interface +@class I12, I10; +@interface I11 +@end |