summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFariborz Jahanian <fjahanian@apple.com>2013-08-30 00:10:37 +0000
committerFariborz Jahanian <fjahanian@apple.com>2013-08-30 00:10:37 +0000
commita23f4fb5c90624ce66e276512ca4577a72a9527f (patch)
tree82cebac68489fcee753e4d86abefa94f11f73d92
parent676c404dec0c28651b1c568496f8fc1ed7231fa0 (diff)
downloadbcm5719-llvm-a23f4fb5c90624ce66e276512ca4577a72a9527f.tar.gz
bcm5719-llvm-a23f4fb5c90624ce66e276512ca4577a72a9527f.zip
ObjectiveC migrator: User of hexadecimal enumerator
should infer migration to NS_OPTIONS. llvm-svn: 189628
-rw-r--r--clang/lib/ARCMigrate/ObjCMT.cpp19
-rw-r--r--clang/test/ARCMT/objcmt-ns-macros.m19
-rw-r--r--clang/test/ARCMT/objcmt-ns-macros.m.result19
3 files changed, 49 insertions, 8 deletions
diff --git a/clang/lib/ARCMigrate/ObjCMT.cpp b/clang/lib/ARCMigrate/ObjCMT.cpp
index b21c75b7fe9..0aca657ffdb 100644
--- a/clang/lib/ARCMigrate/ObjCMT.cpp
+++ b/clang/lib/ARCMigrate/ObjCMT.cpp
@@ -528,9 +528,10 @@ static bool rewriteToNSMacroDecl(const EnumDecl *EnumDcl,
return true;
}
-static bool UseNSOptionsMacro(ASTContext &Ctx,
+static bool UseNSOptionsMacro(Preprocessor &PP, ASTContext &Ctx,
const EnumDecl *EnumDcl) {
bool PowerOfTwo = true;
+ bool FoundHexdecimalEnumerator = false;
uint64_t MaxPowerOfTwoVal = 0;
for (EnumDecl::enumerator_iterator EI = EnumDcl->enumerator_begin(),
EE = EnumDcl->enumerator_end(); EI != EE; ++EI) {
@@ -552,8 +553,18 @@ static bool UseNSOptionsMacro(ASTContext &Ctx,
else if (EnumVal > MaxPowerOfTwoVal)
MaxPowerOfTwoVal = EnumVal;
}
+ if (!FoundHexdecimalEnumerator) {
+ SourceLocation EndLoc = Enumerator->getLocEnd();
+ Token Tok;
+ if (!PP.getRawToken(EndLoc, Tok, /*IgnoreWhiteSpace=*/true))
+ if (Tok.isLiteral() && Tok.getLength() > 2) {
+ if (const char *StringLit = Tok.getLiteralData())
+ FoundHexdecimalEnumerator =
+ (StringLit[0] == '0' && (toLowercase(StringLit[1]) == 'x'));
+ }
+ }
}
- return PowerOfTwo && (MaxPowerOfTwoVal > 2);
+ return FoundHexdecimalEnumerator || (PowerOfTwo && (MaxPowerOfTwoVal > 2));
}
void ObjCMigrateASTConsumer::migrateProtocolConformance(ASTContext &Ctx,
@@ -628,7 +639,7 @@ void ObjCMigrateASTConsumer::migrateNSEnumDecl(ASTContext &Ctx,
// Also check for typedef enum {...} TD;
if (const EnumType *EnumTy = qt->getAs<EnumType>()) {
if (EnumTy->getDecl() == EnumDcl) {
- bool NSOptions = UseNSOptionsMacro(Ctx, EnumDcl);
+ bool NSOptions = UseNSOptionsMacro(PP, Ctx, EnumDcl);
if (NSOptions) {
if (!Ctx.Idents.get("NS_OPTIONS").hasMacroDefinition())
return;
@@ -642,7 +653,7 @@ void ObjCMigrateASTConsumer::migrateNSEnumDecl(ASTContext &Ctx,
}
return;
}
- if (IsNSIntegerType && UseNSOptionsMacro(Ctx, EnumDcl)) {
+ if (IsNSIntegerType && UseNSOptionsMacro(PP, Ctx, EnumDcl)) {
// We may still use NS_OPTIONS based on what we find in the enumertor list.
IsNSIntegerType = false;
IsNSUIntegerType = true;
diff --git a/clang/test/ARCMT/objcmt-ns-macros.m b/clang/test/ARCMT/objcmt-ns-macros.m
index 55bb67d3d5a..1ee675cd746 100644
--- a/clang/test/ARCMT/objcmt-ns-macros.m
+++ b/clang/test/ARCMT/objcmt-ns-macros.m
@@ -66,8 +66,8 @@ enum {
// Should use NS_ENUM even though it is all power of 2.
enum {
- UIKOne = 0x1,
- UIKTwo = 0x2,
+ UIKOne = 1,
+ UIKTwo = 2,
};
typedef NSInteger UIK;
@@ -77,3 +77,18 @@ typedef enum {
NSTickMarkLeft = NSTickMarkAbove,
NSTickMarkRight = NSTickMarkBelow
} NSTickMarkPosition;
+
+enum {
+ UIViewNone = 0x0,
+ UIViewMargin = 0x1,
+ UIViewWidth = 0x2,
+ UIViewRightMargin = 0x3,
+ UIViewBottomMargin = 0xbadbeef
+};
+typedef NSInteger UITableStyle;
+
+enum {
+ UIView0 = 0,
+ UIView1 = 0XBADBEEF
+};
+typedef NSInteger UIStyle;
diff --git a/clang/test/ARCMT/objcmt-ns-macros.m.result b/clang/test/ARCMT/objcmt-ns-macros.m.result
index 245659d08b6..cd0fc8789da 100644
--- a/clang/test/ARCMT/objcmt-ns-macros.m.result
+++ b/clang/test/ARCMT/objcmt-ns-macros.m.result
@@ -66,8 +66,8 @@ enum {
// Should use NS_ENUM even though it is all power of 2.
typedef NS_ENUM(NSInteger, UIK) {
- UIKOne = 0x1,
- UIKTwo = 0x2,
+ UIKOne = 1,
+ UIKTwo = 2,
};
@@ -77,3 +77,18 @@ typedef NS_ENUM(NSInteger, NSTickMarkPosition) {
NSTickMarkLeft = NSTickMarkAbove,
NSTickMarkRight = NSTickMarkBelow
} ;
+
+typedef NS_OPTIONS(NSUInteger, UITableStyle) {
+ UIViewNone = 0x0,
+ UIViewMargin = 0x1,
+ UIViewWidth = 0x2,
+ UIViewRightMargin = 0x3,
+ UIViewBottomMargin = 0xbadbeef
+};
+
+
+typedef NS_OPTIONS(NSUInteger, UIStyle) {
+ UIView0 = 0,
+ UIView1 = 0XBADBEEF
+};
+
OpenPOWER on IntegriCloud