diff options
author | Steve Naroff <snaroff@apple.com> | 2007-10-23 20:20:08 +0000 |
---|---|---|
committer | Steve Naroff <snaroff@apple.com> | 2007-10-23 20:20:08 +0000 |
commit | e670dbb9e6bb2c15d0fa6bbde1f641a3f2c2440f (patch) | |
tree | fa2f2efe049188b52e972c775f06f4581f28ee43 /clang/Driver/RewriteTest.cpp | |
parent | 5d7032bb08f8501647991e66f1e19425bf931ca9 (diff) | |
download | bcm5719-llvm-e670dbb9e6bb2c15d0fa6bbde1f641a3f2c2440f.tar.gz bcm5719-llvm-e670dbb9e6bb2c15d0fa6bbde1f641a3f2c2440f.zip |
- Add rewrite rule for @class.
- Add setter/getter to ObjcClassDecl.
- Predefined key runtime functions.
llvm-svn: 43257
Diffstat (limited to 'clang/Driver/RewriteTest.cpp')
-rw-r--r-- | clang/Driver/RewriteTest.cpp | 36 |
1 files changed, 35 insertions, 1 deletions
diff --git a/clang/Driver/RewriteTest.cpp b/clang/Driver/RewriteTest.cpp index cf812a284f8..7cf1342591a 100644 --- a/clang/Driver/RewriteTest.cpp +++ b/clang/Driver/RewriteTest.cpp @@ -44,7 +44,8 @@ namespace { void RewriteFunctionBody(Stmt *S); void RewriteAtEncode(ObjCEncodeExpr *Exp); - + void RewriteForwardClassDecl(ObjcClassDecl *Dcl); + void WriteObjcClassMetaData(ObjcImplementationDecl *IDecl); void WriteObjcMetaData(); @@ -105,6 +106,8 @@ void RewriteTest::HandleDeclInMainFile(Decl *D) { ClassImplementation.push_back(CI); else if (ObjcCategoryImplDecl *CI = dyn_cast<ObjcCategoryImplDecl>(D)) CategoryImplementation.push_back(CI); + else if (ObjcClassDecl *CD = dyn_cast<ObjcClassDecl>(D)) + RewriteForwardClassDecl(CD); // Nothing yet. } @@ -130,6 +133,37 @@ void RewriteTest::RewriteAtEncode(ObjCEncodeExpr *Exp) { delete Replacement; } +void RewriteTest::RewriteForwardClassDecl(ObjcClassDecl *ClassDecl) { + int numDecls = ClassDecl->getNumForwardDecls(); + ObjcInterfaceDecl **ForwardDecls = ClassDecl->getForwardDecls(); + + // Get the start location and compute the semi location. + SourceLocation startLoc = ClassDecl->getLocation(); + const char *startBuf = SM->getCharacterData(startLoc); + const char *semiPtr = startBuf; + while (semiPtr && (*semiPtr != ';')) semiPtr++; + + // Translate to typedef's that forward reference structs with the same name + // as the class. As a convenience, we include the original declaration + // as a comment. + std::string typedefString; + typedefString += "// "; + typedefString.append(startBuf, semiPtr-startBuf+1); + typedefString += "\n"; + for (int i = 0; i < numDecls; i++) { + ObjcInterfaceDecl *ForwardDecl = ForwardDecls[i]; + typedefString += "typedef struct "; + typedefString += ForwardDecl->getName(); + typedefString += " "; + typedefString += ForwardDecl->getName(); + typedefString += ";\n"; + } + + // Replace the @class with typedefs corresponding to the classes. + Rewrite.ReplaceText(startLoc, semiPtr-startBuf+1, + typedefString.c_str(), typedefString.size()); +} + void RewriteTest::WriteObjcClassMetaData(ObjcImplementationDecl *IDecl) { ObjcInterfaceDecl *CDecl = IDecl->getClassInterface(); |