ObjectiveC migrator: Another use case of enum

declaration which can be migrated to NS_ENUM.

llvm-svn: 186716
This commit is contained in:
Fariborz Jahanian 2013-07-19 20:18:36 +00:00
parent b837248ad4
commit c1c44f62bc
3 changed files with 48 additions and 3 deletions

View File

@ -384,7 +384,7 @@ static bool rewriteToNSEnumDecl(const EnumDecl *EnumDcl,
const TypedefDecl *TypedefDcl,
const NSAPI &NS, edit::Commit &commit,
bool IsNSIntegerType) {
std::string ClassString =
std::string ClassString =
IsNSIntegerType ? "typedef NS_ENUM(NSInteger, " : "typedef NS_OPTIONS(NSUInteger, ";
ClassString += TypedefDcl->getIdentifier()->getName();
ClassString += ')';
@ -399,6 +399,19 @@ static bool rewriteToNSEnumDecl(const EnumDecl *EnumDcl,
return false;
}
static bool rewriteToNSEnumDecl(const EnumDecl *EnumDcl,
const TypedefDecl *TypedefDcl,
const NSAPI &NS, edit::Commit &commit) {
std::string ClassString = "NS_ENUM(NSInteger, ";
ClassString += TypedefDcl->getIdentifier()->getName();
ClassString += ')';
SourceRange R(EnumDcl->getLocStart(), EnumDcl->getLocStart());
commit.replace(R, ClassString);
SourceLocation TypedefLoc = TypedefDcl->getLocEnd();
commit.remove(SourceRange(TypedefLoc, TypedefLoc));
return true;
}
void ObjCMigrateASTConsumer::migrateProtocolConformance(ASTContext &Ctx,
const ObjCImplementationDecl *ImpDecl) {
const ObjCInterfaceDecl *IDecl = ImpDecl->getClassInterface();
@ -466,8 +479,24 @@ void ObjCMigrateASTConsumer::migrateNSEnumDecl(ASTContext &Ctx,
QualType qt = TypedefDcl->getTypeSourceInfo()->getType();
bool IsNSIntegerType = NSAPIObj->isObjCNSIntegerType(qt);
bool IsNSUIntegerType = !IsNSIntegerType && NSAPIObj->isObjCNSUIntegerType(qt);
if (!IsNSIntegerType && !IsNSUIntegerType)
return;
if (!IsNSIntegerType && !IsNSUIntegerType) {
// Also check for typedef enum {...} TD;
if (const EnumType *EnumTy = qt->getAs<EnumType>()) {
if (EnumTy->getDecl() == EnumDcl) {
// NS_ENUM must be available.
if (!Ctx.Idents.get("NS_ENUM").hasMacroDefinition())
return;
edit::Commit commit(*Editor);
rewriteToNSEnumDecl(EnumDcl, TypedefDcl, *NSAPIObj, commit);
Editor->commit(commit);
return;
}
else
return;
}
else
return;
}
// NS_ENUM must be available.
if (IsNSIntegerType && !Ctx.Idents.get("NS_ENUM").hasMacroDefinition())

View File

@ -27,6 +27,14 @@ enum {
typedef NSUInteger UITableViewCellStyle;
typedef enum {
UIViewAnimationTransitionNone,
UIViewAnimationTransitionFlipFromLeft,
UIViewAnimationTransitionFlipFromRight,
UIViewAnimationTransitionCurlUp,
UIViewAnimationTransitionCurlDown,
} UIViewAnimationTransition;
enum {
UNOne,
UNTwo

View File

@ -27,6 +27,14 @@ typedef NS_OPTIONS(NSUInteger, UITableViewCellStyle) {
typedef NS_ENUM(NSInteger, UIViewAnimationTransition) {
UIViewAnimationTransitionNone,
UIViewAnimationTransitionFlipFromLeft,
UIViewAnimationTransitionFlipFromRight,
UIViewAnimationTransitionCurlUp,
UIViewAnimationTransitionCurlDown,
} ;
enum {
UNOne,
UNTwo