From b0057bb4fc331c32e75a441ca4586111992916ed Mon Sep 17 00:00:00 2001 From: Fariborz Jahanian Date: Fri, 19 Jul 2013 01:05:49 +0000 Subject: [PATCH] ObjectiveC migrator: add support to migrate to NS_OPTIONS. llvm-svn: 186641 --- clang/lib/ARCMigrate/ObjCMT.cpp | 17 ++++++++++++----- clang/test/ARCMT/objcmt-ns-macros.m | 16 ++++++++++++++++ clang/test/ARCMT/objcmt-ns-macros.m.result | 16 ++++++++++++++++ 3 files changed, 44 insertions(+), 5 deletions(-) diff --git a/clang/lib/ARCMigrate/ObjCMT.cpp b/clang/lib/ARCMigrate/ObjCMT.cpp index 7542a697b5b2..2f4a3e7401cf 100644 --- a/clang/lib/ARCMigrate/ObjCMT.cpp +++ b/clang/lib/ARCMigrate/ObjCMT.cpp @@ -382,8 +382,10 @@ static bool rewriteToObjCInterfaceDecl(const ObjCInterfaceDecl *IDecl, static bool rewriteToNSEnumDecl(const EnumDecl *EnumDcl, const TypedefDecl *TypedefDcl, - const NSAPI &NS, edit::Commit &commit) { - std::string ClassString = "typedef NS_ENUM(NSInteger, "; + const NSAPI &NS, edit::Commit &commit, + bool IsNSIntegerType) { + std::string ClassString = + IsNSIntegerType ? "typedef NS_ENUM(NSInteger, " : "typedef NS_OPTIONS(NSUInteger, "; ClassString += TypedefDcl->getIdentifier()->getName(); ClassString += ')'; SourceRange R(EnumDcl->getLocStart(), EnumDcl->getLocStart()); @@ -462,14 +464,19 @@ void ObjCMigrateASTConsumer::migrateNSEnumDecl(ASTContext &Ctx, return; QualType qt = TypedefDcl->getTypeSourceInfo()->getType(); - if (!NSAPIObj->isObjCNSIntegerType(qt)) + bool IsNSIntegerType = NSAPIObj->isObjCNSIntegerType(qt); + bool IsNSUIntegerType = !IsNSIntegerType && NSAPIObj->isObjCNSUIntegerType(qt); + if (!IsNSIntegerType && !IsNSUIntegerType) return; // NS_ENUM must be available. - if (!Ctx.Idents.get("NS_ENUM").hasMacroDefinition()) + if (IsNSIntegerType && !Ctx.Idents.get("NS_ENUM").hasMacroDefinition()) + return; + // NS_OPTIONS must be available. + if (IsNSUIntegerType && !Ctx.Idents.get("NS_OPTIONS").hasMacroDefinition()) return; edit::Commit commit(*Editor); - rewriteToNSEnumDecl(EnumDcl, TypedefDcl, *NSAPIObj, commit); + rewriteToNSEnumDecl(EnumDcl, TypedefDcl, *NSAPIObj, commit, IsNSIntegerType); Editor->commit(commit); } diff --git a/clang/test/ARCMT/objcmt-ns-macros.m b/clang/test/ARCMT/objcmt-ns-macros.m index e6b608a4ac39..e56c4cf2dd02 100644 --- a/clang/test/ARCMT/objcmt-ns-macros.m +++ b/clang/test/ARCMT/objcmt-ns-macros.m @@ -4,10 +4,26 @@ // 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; +typedef unsigned long NSUInteger; + #define NS_ENUM(_type, _name) enum _name : _type _name; enum _name : _type +#define NS_OPTIONS(_type, _name) enum _name : _type _name; enum _name : _type enum { blah, blarg }; typedef NSInteger wibble; + +enum { + UIViewAutoresizingNone = 0, + UIViewAutoresizingFlexibleLeftMargin = 1 << 0, + UIViewAutoresizingFlexibleWidth = 1 << 1, + UIViewAutoresizingFlexibleRightMargin = 1 << 2, + UIViewAutoresizingFlexibleTopMargin = 1 << 3, + UIViewAutoresizingFlexibleHeight = 1 << 4, + UIViewAutoresizingFlexibleBottomMargin = 1 << 5 +}; + +typedef NSUInteger UITableViewCellStyle; + diff --git a/clang/test/ARCMT/objcmt-ns-macros.m.result b/clang/test/ARCMT/objcmt-ns-macros.m.result index c8c6686a7e4d..8a09bff3b892 100644 --- a/clang/test/ARCMT/objcmt-ns-macros.m.result +++ b/clang/test/ARCMT/objcmt-ns-macros.m.result @@ -4,10 +4,26 @@ // 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; +typedef unsigned long NSUInteger; + #define NS_ENUM(_type, _name) enum _name : _type _name; enum _name : _type +#define NS_OPTIONS(_type, _name) enum _name : _type _name; enum _name : _type typedef NS_ENUM(NSInteger, wibble) { blah, blarg }; + +typedef NS_OPTIONS(NSUInteger, UITableViewCellStyle) { + UIViewAutoresizingNone = 0, + UIViewAutoresizingFlexibleLeftMargin = 1 << 0, + UIViewAutoresizingFlexibleWidth = 1 << 1, + UIViewAutoresizingFlexibleRightMargin = 1 << 2, + UIViewAutoresizingFlexibleTopMargin = 1 << 3, + UIViewAutoresizingFlexibleHeight = 1 << 4, + UIViewAutoresizingFlexibleBottomMargin = 1 << 5 +}; + + +