]> granicus.if.org Git - clang/commitdiff
ObjectiveC migrator: User of hexadecimal enumerator
authorFariborz Jahanian <fjahanian@apple.com>
Fri, 30 Aug 2013 00:10:37 +0000 (00:10 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Fri, 30 Aug 2013 00:10:37 +0000 (00:10 +0000)
should infer migration to NS_OPTIONS.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@189628 91177308-0d34-0410-b5e6-96231b3b80d8

lib/ARCMigrate/ObjCMT.cpp
test/ARCMT/objcmt-ns-macros.m
test/ARCMT/objcmt-ns-macros.m.result

index b21c75b7fe9e0da0218128ad55eb6006b62207f7..0aca657ffdb7728591da626cea4ab85614738b10 100644 (file)
@@ -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;
index 55bb67d3d5a632e894165b80dc725b27dd361232..1ee675cd746a17b7b14a4906d6d6a76065c2be70 100644 (file)
@@ -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;
index 245659d08b6c7682b41a54d65574d0394c0bfa2c..cd0fc8789dad740472c7e70dcc5b307261c24449 100644 (file)
@@ -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
+};
+