]> granicus.if.org Git - clang/commitdiff
Rewrite @optional/@required directives used inside protocol definitions.
authorFariborz Jahanian <fjahanian@apple.com>
Wed, 14 Nov 2007 01:37:46 +0000 (01:37 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Wed, 14 Nov 2007 01:37:46 +0000 (01:37 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@44096 91177308-0d34-0410-b5e6-96231b3b80d8

Driver/RewriteTest.cpp

index cd1e994bbfe8b04b3207ae270c8ed1c31d95dce0..5538a900b1bdc86a4db34ae525afb40fe9e2579b 100644 (file)
@@ -371,6 +371,9 @@ void RewriteTest::RewriteCategoryDecl(ObjcCategoryDecl *CatDecl) {
 }
 
 void RewriteTest::RewriteProtocolDecl(ObjcProtocolDecl *PDecl) {
+  std::pair<const char*, const char*> 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) {