ObjectiveC migrator: add support to migrate to
NS_OPTIONS.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@186641 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/ARCMigrate/ObjCMT.cpp b/lib/ARCMigrate/ObjCMT.cpp
index 7542a69..2f4a3e7 100644
--- a/lib/ARCMigrate/ObjCMT.cpp
+++ b/lib/ARCMigrate/ObjCMT.cpp
@@ -382,8 +382,10 @@
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 @@
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/test/ARCMT/objcmt-ns-macros.m b/test/ARCMT/objcmt-ns-macros.m
index e6b608a..e56c4cf 100644
--- a/test/ARCMT/objcmt-ns-macros.m
+++ b/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/test/ARCMT/objcmt-ns-macros.m.result b/test/ARCMT/objcmt-ns-macros.m.result
index c8c6686..8a09bff 100644
--- a/test/ARCMT/objcmt-ns-macros.m.result
+++ b/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
+};
+
+
+