r186604 - ObjectiveC migration. migration to NS_ENUM/SN_OPTION

Fariborz Jahanian fjahanian at apple.com
Thu Jul 18 13:11:46 PDT 2013


Author: fjahanian
Date: Thu Jul 18 15:11:45 2013
New Revision: 186604

URL: http://llvm.org/viewvc/llvm-project?rev=186604&view=rev
Log:
ObjectiveC migration. migration to NS_ENUM/SN_OPTION
- wip.

Added:
    cfe/trunk/test/ARCMT/objcmt-ns-macros.m
    cfe/trunk/test/ARCMT/objcmt-ns-macros.m.result
Modified:
    cfe/trunk/include/clang/Edit/Rewriters.h
    cfe/trunk/lib/ARCMigrate/ObjCMT.cpp
    cfe/trunk/lib/Edit/RewriteObjCFoundationAPI.cpp

Modified: cfe/trunk/include/clang/Edit/Rewriters.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Edit/Rewriters.h?rev=186604&r1=186603&r2=186604&view=diff
==============================================================================
--- cfe/trunk/include/clang/Edit/Rewriters.h (original)
+++ cfe/trunk/include/clang/Edit/Rewriters.h Thu Jul 18 15:11:45 2013
@@ -17,6 +17,8 @@ namespace clang {
   class ObjCInterfaceDecl;
   class ObjCProtocolDecl;
   class NSAPI;
+  class EnumDecl;
+  class TypedefDecl;
   class ParentMap;
 
 namespace edit {
@@ -38,6 +40,10 @@ bool rewriteToObjCInterfaceDecl(const Ob
 
 bool rewriteToObjCSubscriptSyntax(const ObjCMessageExpr *Msg,
                                   const NSAPI &NS, Commit &commit);
+  
+bool rewriteToNSEnumDecl(const EnumDecl *EnumDcl,
+                         const TypedefDecl *TypedefDcl,
+                         const NSAPI &NS, Commit &commit);
 
 }
 

Modified: cfe/trunk/lib/ARCMigrate/ObjCMT.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/ARCMigrate/ObjCMT.cpp?rev=186604&r1=186603&r2=186604&view=diff
==============================================================================
--- cfe/trunk/lib/ARCMigrate/ObjCMT.cpp (original)
+++ cfe/trunk/lib/ARCMigrate/ObjCMT.cpp Thu Jul 18 15:11:45 2013
@@ -35,6 +35,8 @@ class ObjCMigrateASTConsumer : public AS
   void migrateObjCInterfaceDecl(ASTContext &Ctx, ObjCInterfaceDecl *D);
   void migrateProtocolConformance(ASTContext &Ctx,
                                   const ObjCImplementationDecl *ImpDecl);
+  void migrateNSEnumDecl(ASTContext &Ctx, const EnumDecl *EnumDcl,
+                     const TypedefDecl *TypedefDcl);
 
 public:
   std::string MigrateDir;
@@ -355,6 +357,25 @@ void ObjCMigrateASTConsumer::migrateProt
   Editor->commit(commit);
 }
 
+void ObjCMigrateASTConsumer::migrateNSEnumDecl(ASTContext &Ctx,
+                                           const EnumDecl *EnumDcl,
+                                           const TypedefDecl *TypedefDcl) {
+  if (!EnumDcl->isCompleteDefinition() || EnumDcl->getIdentifier() ||
+      !TypedefDcl->getIdentifier())
+    return;
+  
+  QualType qt = TypedefDcl->getTypeSourceInfo()->getType();
+  if (!NSAPIObj->isObjCNSIntegerType(qt))
+    return;
+  
+  // NS_ENUM must be available.
+  if (!Ctx.Idents.get("NS_ENUM").hasMacroDefinition())
+    return;
+  edit::Commit commit(*Editor);
+  edit::rewriteToNSEnumDecl(EnumDcl, TypedefDcl, *NSAPIObj, commit);
+  Editor->commit(commit);
+}
+
 namespace {
 
 class RewritesReceiver : public edit::EditsReceiver {
@@ -386,6 +407,12 @@ void ObjCMigrateASTConsumer::HandleTrans
       else if (const ObjCImplementationDecl *ImpDecl =
                dyn_cast<ObjCImplementationDecl>(*D))
         migrateProtocolConformance(Ctx, ImpDecl);
+      else if (const EnumDecl *ED = dyn_cast<EnumDecl>(*D)) {
+        DeclContext::decl_iterator N = D;
+        ++N;
+        if (const TypedefDecl *TD = dyn_cast<TypedefDecl>(*N))
+          migrateNSEnumDecl(Ctx, ED, TD);
+      }
     }
   
   Rewriter rewriter(Ctx.getSourceManager(), Ctx.getLangOpts());

Modified: cfe/trunk/lib/Edit/RewriteObjCFoundationAPI.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Edit/RewriteObjCFoundationAPI.cpp?rev=186604&r1=186603&r2=186604&view=diff
==============================================================================
--- cfe/trunk/lib/Edit/RewriteObjCFoundationAPI.cpp (original)
+++ cfe/trunk/lib/Edit/RewriteObjCFoundationAPI.cpp Thu Jul 18 15:11:45 2013
@@ -434,6 +434,19 @@ bool edit::rewriteToObjCInterfaceDecl(co
   return true;
 }
 
+bool edit::rewriteToNSEnumDecl(const EnumDecl *EnumDcl,
+                               const TypedefDecl *TypedefDcl,
+                               const NSAPI &NS, Commit &commit) {
+  std::string ClassString = "typedef NS_ENUM(NSInteger, ";
+  ClassString += TypedefDcl->getIdentifier()->getName();
+  ClassString += ')';
+  SourceRange R(EnumDcl->getLocStart(), EnumDcl->getLocStart());
+  commit.replace(R, ClassString);
+  commit.remove(SourceRange(TypedefDcl->getLocStart(), TypedefDcl->getLocEnd()));
+  return true;
+  
+}
+
 /// \brief Returns true if the immediate message arguments of \c Msg should not
 /// be rewritten because it will interfere with the rewrite of the parent
 /// message expression. e.g.

Added: cfe/trunk/test/ARCMT/objcmt-ns-macros.m
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/ARCMT/objcmt-ns-macros.m?rev=186604&view=auto
==============================================================================
--- cfe/trunk/test/ARCMT/objcmt-ns-macros.m (added)
+++ cfe/trunk/test/ARCMT/objcmt-ns-macros.m Thu Jul 18 15:11:45 2013
@@ -0,0 +1,13 @@
+// RUN: rm -rf %t
+// RUN: %clang_cc1 -objcmt-migrate-property -mt-migrate-directory %t %s -x objective-c -fobjc-runtime-has-weak -fobjc-arc -fobjc-default-synthesize-properties -triple x86_64-apple-darwin11
+// RUN: c-arcmt-test -mt-migrate-directory %t | arcmt-test -verify-transformed-files %s.result
+// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -fsyntax-only -x objective-c -fobjc-runtime-has-weak -fobjc-arc -fobjc-default-synthesize-properties %s.result
+
+typedef long NSInteger;
+#define NS_ENUM(_type, _name) enum _name : _type _name; enum _name : _type
+
+enum {
+  blah,
+  blarg
+};
+typedef NSInteger wibble;

Added: 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=186604&view=auto
==============================================================================
--- cfe/trunk/test/ARCMT/objcmt-ns-macros.m.result (added)
+++ cfe/trunk/test/ARCMT/objcmt-ns-macros.m.result Thu Jul 18 15:11:45 2013
@@ -0,0 +1,13 @@
+// RUN: rm -rf %t
+// RUN: %clang_cc1 -objcmt-migrate-property -mt-migrate-directory %t %s -x objective-c -fobjc-runtime-has-weak -fobjc-arc -fobjc-default-synthesize-properties -triple x86_64-apple-darwin11
+// RUN: c-arcmt-test -mt-migrate-directory %t | arcmt-test -verify-transformed-files %s.result
+// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -fsyntax-only -x objective-c -fobjc-runtime-has-weak -fobjc-arc -fobjc-default-synthesize-properties %s.result
+
+typedef long NSInteger;
+#define NS_ENUM(_type, _name) enum _name : _type _name; enum _name : _type
+
+typedef NS_ENUM(NSInteger, wibble) {
+  blah,
+  blarg
+};
+;





More information about the cfe-commits mailing list