From: Fariborz Jahanian Date: Wed, 14 Nov 2007 01:37:46 +0000 (+0000) Subject: Rewrite @optional/@required directives used inside protocol definitions. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=b82b3ea8a12e4bc5960f59c1c2b9f483af5471e8;p=clang Rewrite @optional/@required directives used inside protocol definitions. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@44096 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/Driver/RewriteTest.cpp b/Driver/RewriteTest.cpp index cd1e994bbf..5538a900b1 100644 --- a/Driver/RewriteTest.cpp +++ b/Driver/RewriteTest.cpp @@ -371,6 +371,9 @@ void RewriteTest::RewriteCategoryDecl(ObjcCategoryDecl *CatDecl) { } void RewriteTest::RewriteProtocolDecl(ObjcProtocolDecl *PDecl) { + std::pair MainBuf = SM->getBufferData(MainFileID); + const char *MainBufStart = MainBuf.first; + SourceLocation LocStart = PDecl->getLocStart(); // FIXME: handle protocol headers that are declared across multiple lines. @@ -381,7 +384,31 @@ void RewriteTest::RewriteProtocolDecl(ObjcProtocolDecl *PDecl) { RewriteMethodDeclarations(PDecl->getNumClassMethods(), PDecl->getClassMethods()); // Lastly, comment out the @end. - Rewrite.ReplaceText(PDecl->getAtEndLoc(), 0, "// ", 3); + SourceLocation LocEnd = PDecl->getAtEndLoc(); + Rewrite.ReplaceText(LocEnd, 0, "// ", 3); + + // Must comment out @optional/@required + const char *startBuf = SM->getCharacterData(LocStart); + const char *endBuf = SM->getCharacterData(LocEnd); + for (const char *p = startBuf; p < endBuf; p++) { + if (*p == '@' && !strncmp(p+1, "optional", strlen("optional"))) { + std::string CommentedOptional = "/* @optional */"; + SourceLocation OptionalLoc = SourceLocation::getFileLoc(MainFileID, + p-MainBufStart); + Rewrite.ReplaceText(OptionalLoc, strlen("@optional"), + CommentedOptional.c_str(), CommentedOptional.size()); + + } + else if (*p == '@' && !strncmp(p+1, "required", strlen("required"))) { + std::string CommentedRequired = "/* @required */"; + SourceLocation OptionalLoc = SourceLocation::getFileLoc(MainFileID, + p-MainBufStart); + Rewrite.ReplaceText(OptionalLoc, strlen("@required"), + CommentedRequired.c_str(), CommentedRequired.size()); + + } + } + } void RewriteTest::RewriteForwardProtocolDecl(ObjcForwardProtocolDecl *PDecl) {