diff options
| author | Fariborz Jahanian <fjahanian@apple.com> | 2013-08-30 00:10:37 +0000 |
|---|---|---|
| committer | Fariborz Jahanian <fjahanian@apple.com> | 2013-08-30 00:10:37 +0000 |
| commit | a23f4fb5c90624ce66e276512ca4577a72a9527f (patch) | |
| tree | 82cebac68489fcee753e4d86abefa94f11f73d92 | |
| parent | 676c404dec0c28651b1c568496f8fc1ed7231fa0 (diff) | |
| download | bcm5719-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.cpp | 19 | ||||
| -rw-r--r-- | clang/test/ARCMT/objcmt-ns-macros.m | 19 | ||||
| -rw-r--r-- | clang/test/ARCMT/objcmt-ns-macros.m.result | 19 |
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 +}; + |

