r192645 - ObjectiveC migrator: Support for more possibility of

Fariborz Jahanian fjahanian at apple.com
Mon Oct 14 17:00:28 PDT 2013


Author: fjahanian
Date: Mon Oct 14 19:00:28 2013
New Revision: 192645

URL: http://llvm.org/viewvc/llvm-project?rev=192645&view=rev
Log:
ObjectiveC migrator: Support for more possibility of
migration to NS_ENUM/NS_OPTIONS macros; when
typedef'ed to NSInteger/NSUInteger preceeds well
before of the enum declaration. // rdar://15201056

Modified:
    cfe/trunk/lib/ARCMigrate/ObjCMT.cpp
    cfe/trunk/test/ARCMT/objcmt-ns-macros.m
    cfe/trunk/test/ARCMT/objcmt-ns-macros.m.result

Modified: cfe/trunk/lib/ARCMigrate/ObjCMT.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/ARCMigrate/ObjCMT.cpp?rev=192645&r1=192644&r2=192645&view=diff
==============================================================================
--- cfe/trunk/lib/ARCMigrate/ObjCMT.cpp (original)
+++ cfe/trunk/lib/ARCMigrate/ObjCMT.cpp Mon Oct 14 19:00:28 2013
@@ -46,6 +46,7 @@ class ObjCMigrateASTConsumer : public AS
   void migrateObjCInterfaceDecl(ASTContext &Ctx, ObjCContainerDecl *D);
   void migrateProtocolConformance(ASTContext &Ctx,
                                   const ObjCImplementationDecl *ImpDecl);
+  void CacheObjCNSIntegerTypedefed(const TypedefDecl *TypedefDcl);
   bool migrateNSEnumDecl(ASTContext &Ctx, const EnumDecl *EnumDcl,
                      const TypedefDecl *TypedefDcl);
   void migrateAllMethodInstaceType(ASTContext &Ctx, ObjCContainerDecl *CDecl);
@@ -77,6 +78,8 @@ public:
   std::string MigrateDir;
   unsigned ASTMigrateActions;
   unsigned  FileId;
+  const TypedefDecl *NSIntegerTypedefed;
+  const TypedefDecl *NSUIntegerTypedefed;
   OwningPtr<NSAPI> NSAPIObj;
   OwningPtr<edit::EditedSource> Editor;
   FileRemapper &Remapper;
@@ -96,7 +99,8 @@ public:
                          bool isOutputFile = false)
   : MigrateDir(migrateDir),
     ASTMigrateActions(astMigrateActions),
-    FileId(0), Remapper(remapper), FileMgr(fileMgr), PPRec(PPRec), PP(PP),
+    FileId(0), NSIntegerTypedefed(0), NSUIntegerTypedefed(0),
+    Remapper(remapper), FileMgr(fileMgr), PPRec(PPRec), PP(PP),
     IsOutputFile(isOutputFile) { }
 
 protected:
@@ -509,15 +513,34 @@ static bool rewriteToNSEnumDecl(const En
   ClassString += ')';
   SourceRange R(EnumDcl->getLocStart(), EnumDcl->getLocStart());
   commit.replace(R, ClassString);
-  SourceLocation EndOfTypedefLoc = TypedefDcl->getLocEnd();
-  EndOfTypedefLoc = trans::findLocationAfterSemi(EndOfTypedefLoc, NS.getASTContext(),
+  SourceLocation EndOfEnumDclLoc = EnumDcl->getLocEnd();
+  EndOfEnumDclLoc = trans::findSemiAfterLocation(EndOfEnumDclLoc,
+                                                 NS.getASTContext(), /*IsDecl*/true);
+  if (!EndOfEnumDclLoc.isInvalid()) {
+    SourceRange EnumDclRange(EnumDcl->getLocStart(), EndOfEnumDclLoc);
+    commit.insertFromRange(TypedefDcl->getLocStart(), EnumDclRange);
+  }
+  else
+    return false;
+  
+  SourceLocation EndTypedefDclLoc = TypedefDcl->getLocEnd();
+  EndTypedefDclLoc = trans::findSemiAfterLocation(EndTypedefDclLoc,
+                                                 NS.getASTContext(), /*IsDecl*/true);
+  if (!EndTypedefDclLoc.isInvalid()) {
+    SourceRange TDRange(TypedefDcl->getLocStart(), EndTypedefDclLoc);
+    commit.remove(TDRange);
+  }
+  else
+    return false;
+
+  EndOfEnumDclLoc = trans::findLocationAfterSemi(EnumDcl->getLocEnd(), NS.getASTContext(),
                                                  /*IsDecl*/true);
-  SourceLocation BeginOfTypedefLoc = TypedefDcl->getLocStart();
-  if (!EndOfTypedefLoc.isInvalid()) {
-    // FIXME. This assumes that typedef decl; is immediately preceeded by eoln.
-    // It is trying to remove the typedef decl. line entirely.
-    BeginOfTypedefLoc = BeginOfTypedefLoc.getLocWithOffset(-1);
-    commit.remove(SourceRange(BeginOfTypedefLoc, EndOfTypedefLoc));
+  if (!EndOfEnumDclLoc.isInvalid()) {
+    SourceLocation BeginOfEnumDclLoc = EnumDcl->getLocStart();
+    // FIXME. This assumes that enum decl; is immediately preceeded by eoln.
+    // It is trying to remove the enum decl. lines entirely.
+    BeginOfEnumDclLoc = BeginOfEnumDclLoc.getLocWithOffset(-1);
+    commit.remove(SourceRange(BeginOfEnumDclLoc, EndOfEnumDclLoc));
     return true;
   }
   return false;
@@ -638,12 +661,41 @@ void ObjCMigrateASTConsumer::migrateProt
   Editor->commit(commit);
 }
 
+void ObjCMigrateASTConsumer::CacheObjCNSIntegerTypedefed(
+                                          const TypedefDecl *TypedefDcl) {
+  
+  QualType qt = TypedefDcl->getTypeSourceInfo()->getType();
+  if (NSAPIObj->isObjCNSIntegerType(qt))
+    NSIntegerTypedefed = TypedefDcl;
+  else if (NSAPIObj->isObjCNSUIntegerType(qt))
+    NSUIntegerTypedefed = TypedefDcl;
+}
+
 bool ObjCMigrateASTConsumer::migrateNSEnumDecl(ASTContext &Ctx,
                                            const EnumDecl *EnumDcl,
                                            const TypedefDecl *TypedefDcl) {
   if (!EnumDcl->isCompleteDefinition() || EnumDcl->getIdentifier() ||
-      !TypedefDcl->getIdentifier() ||
-      EnumDcl->isDeprecated() || TypedefDcl->isDeprecated())
+      EnumDcl->isDeprecated())
+    return false;
+  if (!TypedefDcl) {
+    if (NSIntegerTypedefed) {
+      TypedefDcl = NSIntegerTypedefed;
+      NSIntegerTypedefed = 0;
+    }
+    else if (NSUIntegerTypedefed) {
+      TypedefDcl = NSUIntegerTypedefed;
+      NSUIntegerTypedefed = 0;
+    }
+    else
+      return false;
+    unsigned FileIdOfTypedefDcl =
+      PP.getSourceManager().getFileID(TypedefDcl->getLocation()).getHashValue();
+    unsigned FileIdOfEnumDcl =
+      PP.getSourceManager().getFileID(EnumDcl->getLocation()).getHashValue();
+    if (FileIdOfTypedefDcl != FileIdOfEnumDcl)
+      return false;
+  }
+  if (TypedefDcl->isDeprecated())
     return false;
   
   QualType qt = TypedefDcl->getTypeSourceInfo()->getType();
@@ -678,9 +730,10 @@ bool ObjCMigrateASTConsumer::migrateNSEn
   if (IsNSUIntegerType && !Ctx.Idents.get("NS_OPTIONS").hasMacroDefinition())
     return false;
   edit::Commit commit(*Editor);
-  rewriteToNSEnumDecl(EnumDcl, TypedefDcl, *NSAPIObj, commit, IsNSIntegerType, NSOptions);
+  bool Res = rewriteToNSEnumDecl(EnumDcl, TypedefDcl, *NSAPIObj,
+                                 commit, IsNSIntegerType, NSOptions);
   Editor->commit(commit);
-  return true;
+  return Res;
 }
 
 static void ReplaceWithInstancetype(const ObjCMigrateASTConsumer &ASTC,
@@ -1432,26 +1485,29 @@ void ObjCMigrateASTConsumer::HandleTrans
           migrateProtocolConformance(Ctx, ImpDecl);
       }
       else if (const EnumDecl *ED = dyn_cast<EnumDecl>(*D)) {
+        if (!(ASTMigrateActions & FrontendOptions::ObjCMT_NsMacros))
+          continue;
         DeclContext::decl_iterator N = D;
-        ++N;
-        if (N != DEnd)
-          if (const TypedefDecl *TD = dyn_cast<TypedefDecl>(*N)) {
-            if (ASTMigrateActions & FrontendOptions::ObjCMT_NsMacros) {
-              if (migrateNSEnumDecl(Ctx, ED, TD))
-                D++;
-            }
-          }
+        if (++N != DEnd) {
+          const TypedefDecl *TD = dyn_cast<TypedefDecl>(*N);
+          if (migrateNSEnumDecl(Ctx, ED, TD) && TD)
+            D++;
+        }
+        else
+          migrateNSEnumDecl(Ctx, ED, /*TypedefDecl */0);
       }
       else if (const TypedefDecl *TD = dyn_cast<TypedefDecl>(*D)) {
-        DeclContext::decl_iterator N = D;
-        ++N;
-        if (N != DEnd)
-          if (const EnumDecl *ED = dyn_cast<EnumDecl>(*N)) {
-            if (ASTMigrateActions & FrontendOptions::ObjCMT_NsMacros) {
-              if (migrateNSEnumDecl(Ctx, ED, TD))
+        if (ASTMigrateActions & FrontendOptions::ObjCMT_NsMacros) {
+          DeclContext::decl_iterator N = D;
+          if (++N != DEnd)
+            if (const EnumDecl *ED = dyn_cast<EnumDecl>(*N)) {
+              if (migrateNSEnumDecl(Ctx, ED, TD)) {
                 ++D;
+                continue;
+              }
             }
-          }
+          CacheObjCNSIntegerTypedefed(TD);
+        }
       }
       else if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(*D)) {
         if (ASTMigrateActions & FrontendOptions::ObjCMT_Annotation)

Modified: cfe/trunk/test/ARCMT/objcmt-ns-macros.m
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/ARCMT/objcmt-ns-macros.m?rev=192645&r1=192644&r2=192645&view=diff
==============================================================================
--- cfe/trunk/test/ARCMT/objcmt-ns-macros.m (original)
+++ cfe/trunk/test/ARCMT/objcmt-ns-macros.m Mon Oct 14 19:00:28 2013
@@ -216,6 +216,9 @@ enum {
 } NS_ENUM_AVAILABLE_MAC(10.9);
 typedef NSInteger NSModalResponse NS_AVAILABLE_MAC(10.9);
 
+// rdar://15201056
+typedef NSUInteger FarAwayNSUInteger;
+
 // rdar://15200915
 typedef NSUInteger NSWorkspaceLaunchOptions;
 enum {
@@ -247,7 +250,25 @@ enum {
 };
 
 enum {
+  FarAway1    = 1 << 1,
+  FarAway2    = 1 << 2
+};
+
+enum {
     NSExcludeQuickDrawElementsIconOption    = 1 << 1,
     NSExclude10_4ElementsIconOption         = 1 << 2
 };
 typedef NSUInteger NSWorkspaceIconOptions;
+
+typedef NSInteger NSCollectionViewDropOperation;
+
+ at interface INTF {
+  NSCollectionViewDropOperation I1;
+  NSCollectionViewDropOperation I2;
+}
+ at end
+
+enum {
+  NotFarAway1    = 1 << 1,
+  NotFarAway2    = 1 << 2
+};

Modified: cfe/trunk/test/ARCMT/objcmt-ns-macros.m.result
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/ARCMT/objcmt-ns-macros.m.result?rev=192645&r1=192644&r2=192645&view=diff
==============================================================================
--- cfe/trunk/test/ARCMT/objcmt-ns-macros.m.result (original)
+++ cfe/trunk/test/ARCMT/objcmt-ns-macros.m.result Mon Oct 14 19:00:28 2013
@@ -121,6 +121,7 @@ typedef enum  {
 
 #define NS_ENUM_AVAILABLE(X,Y)
 
+
 typedef NS_OPTIONS(NSUInteger, NSFOptions) {
     NSFStrongMemory NS_ENUM_AVAILABLE(10_5, 6_0) = (0UL << 0),       
     NSFOpaqueMemory NS_ENUM_AVAILABLE(10_5, 6_0) = (2UL << 0),
@@ -137,7 +138,6 @@ typedef NS_OPTIONS(NSUInteger, NSFOption
     NSFCopyIn NS_ENUM_AVAILABLE(10_5, 6_0) = (1UL << 16),      
 };
 
-
 typedef NS_ENUM(NSInteger, UIP) {
   UIP0One = 0,
   UIP0Two = 1,
@@ -206,6 +206,12 @@ typedef NS_ENUM(NSInteger, NSModalRespon
     NSModalResponseContinue             = (-1002), 
 } NS_ENUM_AVAILABLE_MAC(10.9);
 
+// rdar://15201056
+typedef NS_OPTIONS(NSUInteger, FarAwayNSUInteger) {
+  FarAway1    = 1 << 1,
+  FarAway2    = 1 << 2
+};
+
 // rdar://15200915
 typedef NS_OPTIONS(NSUInteger, NSWorkspaceLaunchOptions) {
      NSWorkspaceLaunchAndPrint =                 0x00000002,
@@ -233,7 +239,20 @@ typedef NS_OPTIONS(NSUInteger, NSWorkspa
     NSExclude10_4ElementsCreationOption         = 1 << 2
 };
 
+
 typedef NS_OPTIONS(NSUInteger, NSWorkspaceIconOptions) {
     NSExcludeQuickDrawElementsIconOption    = 1 << 1,
     NSExclude10_4ElementsIconOption         = 1 << 2
 };
+
+typedef NS_OPTIONS(NSUInteger, NSCollectionViewDropOperation) {
+  NotFarAway1    = 1 << 1,
+  NotFarAway2    = 1 << 2
+};
+
+ at interface INTF {
+  NSCollectionViewDropOperation I1;
+  NSCollectionViewDropOperation I2;
+}
+ at end
+





More information about the cfe-commits mailing list