From: Fariborz Jahanian Date: Thu, 18 Jul 2013 20:11:45 +0000 (+0000) Subject: ObjectiveC migration. migration to NS_ENUM/SN_OPTION X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=bbbb0fe4f466d3163fcbf0a64ebf0f5868833efb;p=clang ObjectiveC migration. migration to NS_ENUM/SN_OPTION - wip. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@186604 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Edit/Rewriters.h b/include/clang/Edit/Rewriters.h index d7718c540b..ad7494f8f5 100644 --- a/include/clang/Edit/Rewriters.h +++ b/include/clang/Edit/Rewriters.h @@ -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 ObjCInterfaceDecl *IDecl, bool rewriteToObjCSubscriptSyntax(const ObjCMessageExpr *Msg, const NSAPI &NS, Commit &commit); + +bool rewriteToNSEnumDecl(const EnumDecl *EnumDcl, + const TypedefDecl *TypedefDcl, + const NSAPI &NS, Commit &commit); } diff --git a/lib/ARCMigrate/ObjCMT.cpp b/lib/ARCMigrate/ObjCMT.cpp index 46ee88e704..732e46ad5a 100644 --- a/lib/ARCMigrate/ObjCMT.cpp +++ b/lib/ARCMigrate/ObjCMT.cpp @@ -35,6 +35,8 @@ class ObjCMigrateASTConsumer : public ASTConsumer { 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::migrateProtocolConformance(ASTContext &Ctx, 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::HandleTranslationUnit(ASTContext &Ctx) { else if (const ObjCImplementationDecl *ImpDecl = dyn_cast(*D)) migrateProtocolConformance(Ctx, ImpDecl); + else if (const EnumDecl *ED = dyn_cast(*D)) { + DeclContext::decl_iterator N = D; + ++N; + if (const TypedefDecl *TD = dyn_cast(*N)) + migrateNSEnumDecl(Ctx, ED, TD); + } } Rewriter rewriter(Ctx.getSourceManager(), Ctx.getLangOpts()); diff --git a/lib/Edit/RewriteObjCFoundationAPI.cpp b/lib/Edit/RewriteObjCFoundationAPI.cpp index 30a9f522b2..68dcd6b7c6 100644 --- a/lib/Edit/RewriteObjCFoundationAPI.cpp +++ b/lib/Edit/RewriteObjCFoundationAPI.cpp @@ -434,6 +434,19 @@ bool edit::rewriteToObjCInterfaceDecl(const ObjCInterfaceDecl *IDecl, 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. diff --git a/test/ARCMT/objcmt-ns-macros.m b/test/ARCMT/objcmt-ns-macros.m new file mode 100644 index 0000000000..e6b608a4ac --- /dev/null +++ b/test/ARCMT/objcmt-ns-macros.m @@ -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; diff --git a/test/ARCMT/objcmt-ns-macros.m.result b/test/ARCMT/objcmt-ns-macros.m.result new file mode 100644 index 0000000000..ab8e8d2003 --- /dev/null +++ b/test/ARCMT/objcmt-ns-macros.m.result @@ -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 +}; +;