ObjectiveC migrator: Infer NS_OPTIONS when if there is at

least one hex enumerator, all others are also
hex enumerator (0 enumerator is excepted). 
// rdar://15044304

llvm-svn: 191222
This commit is contained in:
Fariborz Jahanian 2013-09-23 20:27:06 +00:00
parent 724d75b2c8
commit 02bdb16524
3 changed files with 123 additions and 3 deletions

View File

@ -498,7 +498,7 @@ static bool rewriteToNSMacroDecl(const EnumDecl *EnumDcl,
static bool UseNSOptionsMacro(Preprocessor &PP, ASTContext &Ctx,
const EnumDecl *EnumDcl) {
bool PowerOfTwo = true;
bool FoundHexdecimalEnumerator = false;
bool AllHexdecimalEnumerator = true;
uint64_t MaxPowerOfTwoVal = 0;
for (EnumDecl::enumerator_iterator EI = EnumDcl->enumerator_begin(),
EE = EnumDcl->enumerator_end(); EI != EE; ++EI) {
@ -506,6 +506,7 @@ static bool UseNSOptionsMacro(Preprocessor &PP, ASTContext &Ctx,
const Expr *InitExpr = Enumerator->getInitExpr();
if (!InitExpr) {
PowerOfTwo = false;
AllHexdecimalEnumerator = false;
continue;
}
InitExpr = InitExpr->IgnoreParenCasts();
@ -520,7 +521,8 @@ static bool UseNSOptionsMacro(Preprocessor &PP, ASTContext &Ctx,
else if (EnumVal > MaxPowerOfTwoVal)
MaxPowerOfTwoVal = EnumVal;
}
if (!FoundHexdecimalEnumerator) {
if (AllHexdecimalEnumerator && EnumVal) {
bool FoundHexdecimalEnumerator = false;
SourceLocation EndLoc = Enumerator->getLocEnd();
Token Tok;
if (!PP.getRawToken(EndLoc, Tok, /*IgnoreWhiteSpace=*/true))
@ -529,9 +531,11 @@ static bool UseNSOptionsMacro(Preprocessor &PP, ASTContext &Ctx,
FoundHexdecimalEnumerator =
(StringLit[0] == '0' && (toLowercase(StringLit[1]) == 'x'));
}
if (!FoundHexdecimalEnumerator)
AllHexdecimalEnumerator = false;
}
}
return FoundHexdecimalEnumerator || (PowerOfTwo && (MaxPowerOfTwoVal > 2));
return AllHexdecimalEnumerator || (PowerOfTwo && (MaxPowerOfTwoVal > 2));
}
void ObjCMigrateASTConsumer::migrateProtocolConformance(ASTContext &Ctx,

View File

@ -146,3 +146,61 @@ enum {
};
typedef NSUInteger NSFOptions;
typedef enum {
UIP0One = 0,
UIP0Two = 1,
UIP0Three = 2,
UIP0Four = 10,
UIP0Last = 0x100
} UIP;
typedef enum {
UIPZero = 0x0,
UIPOne = 0x1,
UIPTwo = 0x2,
UIP10 = 0x10,
UIPHundred = 0x100
} UIP_3;
typedef enum {
UIP4Zero = 0x0,
UIP4One = 0x1,
UIP4Two = 0x2,
UIP410 = 0x10,
UIP4Hundred = 100
} UIP4_3;
typedef enum {
UIP5Zero = 0x0,
UIP5Two = 0x2,
UIP510 = 0x3,
UIP5Hundred = 0x4
} UIP5_3;
typedef enum {
UIP6Zero = 0x0,
UIP6One = 0x1,
UIP6Two = 0x2,
UIP610 = 10,
UIP6Hundred = 0x100
} UIP6_3;
typedef enum {
UIP7Zero = 0x0,
UIP7One = 1,
UIP7Two = 0x2,
UIP710 = 10,
UIP7Hundred = 100
} UIP7_3;
typedef enum {
Random = 0,
Random1 = 2,
Random2 = 4,
Random3 = 0x12345,
Random4 = 0x3444444,
Random5 = 0xbadbeef,
Random6
} UIP8_3;

View File

@ -146,3 +146,61 @@ typedef NS_OPTIONS(NSUInteger, NSFOptions) {
};
typedef NS_ENUM(NSInteger, UIP) {
UIP0One = 0,
UIP0Two = 1,
UIP0Three = 2,
UIP0Four = 10,
UIP0Last = 0x100
} ;
typedef NS_OPTIONS(NSUInteger, UIP_3) {
UIPZero = 0x0,
UIPOne = 0x1,
UIPTwo = 0x2,
UIP10 = 0x10,
UIPHundred = 0x100
} ;
typedef NS_ENUM(NSInteger, UIP4_3) {
UIP4Zero = 0x0,
UIP4One = 0x1,
UIP4Two = 0x2,
UIP410 = 0x10,
UIP4Hundred = 100
} ;
typedef NS_OPTIONS(NSUInteger, UIP5_3) {
UIP5Zero = 0x0,
UIP5Two = 0x2,
UIP510 = 0x3,
UIP5Hundred = 0x4
} ;
typedef NS_ENUM(NSInteger, UIP6_3) {
UIP6Zero = 0x0,
UIP6One = 0x1,
UIP6Two = 0x2,
UIP610 = 10,
UIP6Hundred = 0x100
} ;
typedef NS_ENUM(NSInteger, UIP7_3) {
UIP7Zero = 0x0,
UIP7One = 1,
UIP7Two = 0x2,
UIP710 = 10,
UIP7Hundred = 100
} ;
typedef NS_ENUM(NSInteger, UIP8_3) {
Random = 0,
Random1 = 2,
Random2 = 4,
Random3 = 0x12345,
Random4 = 0x3444444,
Random5 = 0xbadbeef,
Random6
} ;