r192645 - ObjectiveC migrator: Support for more possibility of
Fariborz Jahanian
fjahanian at apple.com
Mon Oct 14 17:00:28 PDT 2013
Author: fjahanian
Date: Mon Oct 14 19:00:28 2013
New Revision: 192645
URL: http://llvm.org/viewvc/llvm-project?rev=192645&view=rev
Log:
ObjectiveC migrator: Support for more possibility of
migration to NS_ENUM/NS_OPTIONS macros; when
typedef'ed to NSInteger/NSUInteger preceeds well
before of the enum declaration. // rdar://15201056
Modified:
cfe/trunk/lib/ARCMigrate/ObjCMT.cpp
cfe/trunk/test/ARCMT/objcmt-ns-macros.m
cfe/trunk/test/ARCMT/objcmt-ns-macros.m.result
Modified: cfe/trunk/lib/ARCMigrate/ObjCMT.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/ARCMigrate/ObjCMT.cpp?rev=192645&r1=192644&r2=192645&view=diff
==============================================================================
--- cfe/trunk/lib/ARCMigrate/ObjCMT.cpp (original)
+++ cfe/trunk/lib/ARCMigrate/ObjCMT.cpp Mon Oct 14 19:00:28 2013
@@ -46,6 +46,7 @@ class ObjCMigrateASTConsumer : public AS
void migrateObjCInterfaceDecl(ASTContext &Ctx, ObjCContainerDecl *D);
void migrateProtocolConformance(ASTContext &Ctx,
const ObjCImplementationDecl *ImpDecl);
+ void CacheObjCNSIntegerTypedefed(const TypedefDecl *TypedefDcl);
bool migrateNSEnumDecl(ASTContext &Ctx, const EnumDecl *EnumDcl,
const TypedefDecl *TypedefDcl);
void migrateAllMethodInstaceType(ASTContext &Ctx, ObjCContainerDecl *CDecl);
@@ -77,6 +78,8 @@ public:
std::string MigrateDir;
unsigned ASTMigrateActions;
unsigned FileId;
+ const TypedefDecl *NSIntegerTypedefed;
+ const TypedefDecl *NSUIntegerTypedefed;
OwningPtr<NSAPI> NSAPIObj;
OwningPtr<edit::EditedSource> Editor;
FileRemapper &Remapper;
@@ -96,7 +99,8 @@ public:
bool isOutputFile = false)
: MigrateDir(migrateDir),
ASTMigrateActions(astMigrateActions),
- FileId(0), Remapper(remapper), FileMgr(fileMgr), PPRec(PPRec), PP(PP),
+ FileId(0), NSIntegerTypedefed(0), NSUIntegerTypedefed(0),
+ Remapper(remapper), FileMgr(fileMgr), PPRec(PPRec), PP(PP),
IsOutputFile(isOutputFile) { }
protected:
@@ -509,15 +513,34 @@ static bool rewriteToNSEnumDecl(const En
ClassString += ')';
SourceRange R(EnumDcl->getLocStart(), EnumDcl->getLocStart());
commit.replace(R, ClassString);
- SourceLocation EndOfTypedefLoc = TypedefDcl->getLocEnd();
- EndOfTypedefLoc = trans::findLocationAfterSemi(EndOfTypedefLoc, NS.getASTContext(),
+ SourceLocation EndOfEnumDclLoc = EnumDcl->getLocEnd();
+ EndOfEnumDclLoc = trans::findSemiAfterLocation(EndOfEnumDclLoc,
+ NS.getASTContext(), /*IsDecl*/true);
+ if (!EndOfEnumDclLoc.isInvalid()) {
+ SourceRange EnumDclRange(EnumDcl->getLocStart(), EndOfEnumDclLoc);
+ commit.insertFromRange(TypedefDcl->getLocStart(), EnumDclRange);
+ }
+ else
+ return false;
+
+ SourceLocation EndTypedefDclLoc = TypedefDcl->getLocEnd();
+ EndTypedefDclLoc = trans::findSemiAfterLocation(EndTypedefDclLoc,
+ NS.getASTContext(), /*IsDecl*/true);
+ if (!EndTypedefDclLoc.isInvalid()) {
+ SourceRange TDRange(TypedefDcl->getLocStart(), EndTypedefDclLoc);
+ commit.remove(TDRange);
+ }
+ else
+ return false;
+
+ EndOfEnumDclLoc = trans::findLocationAfterSemi(EnumDcl->getLocEnd(), NS.getASTContext(),
/*IsDecl*/true);
- SourceLocation BeginOfTypedefLoc = TypedefDcl->getLocStart();
- if (!EndOfTypedefLoc.isInvalid()) {
- // FIXME. This assumes that typedef decl; is immediately preceeded by eoln.
- // It is trying to remove the typedef decl. line entirely.
- BeginOfTypedefLoc = BeginOfTypedefLoc.getLocWithOffset(-1);
- commit.remove(SourceRange(BeginOfTypedefLoc, EndOfTypedefLoc));
+ if (!EndOfEnumDclLoc.isInvalid()) {
+ SourceLocation BeginOfEnumDclLoc = EnumDcl->getLocStart();
+ // FIXME. This assumes that enum decl; is immediately preceeded by eoln.
+ // It is trying to remove the enum decl. lines entirely.
+ BeginOfEnumDclLoc = BeginOfEnumDclLoc.getLocWithOffset(-1);
+ commit.remove(SourceRange(BeginOfEnumDclLoc, EndOfEnumDclLoc));
return true;
}
return false;
@@ -638,12 +661,41 @@ void ObjCMigrateASTConsumer::migrateProt
Editor->commit(commit);
}
+void ObjCMigrateASTConsumer::CacheObjCNSIntegerTypedefed(
+ const TypedefDecl *TypedefDcl) {
+
+ QualType qt = TypedefDcl->getTypeSourceInfo()->getType();
+ if (NSAPIObj->isObjCNSIntegerType(qt))
+ NSIntegerTypedefed = TypedefDcl;
+ else if (NSAPIObj->isObjCNSUIntegerType(qt))
+ NSUIntegerTypedefed = TypedefDcl;
+}
+
bool ObjCMigrateASTConsumer::migrateNSEnumDecl(ASTContext &Ctx,
const EnumDecl *EnumDcl,
const TypedefDecl *TypedefDcl) {
if (!EnumDcl->isCompleteDefinition() || EnumDcl->getIdentifier() ||
- !TypedefDcl->getIdentifier() ||
- EnumDcl->isDeprecated() || TypedefDcl->isDeprecated())
+ EnumDcl->isDeprecated())
+ return false;
+ if (!TypedefDcl) {
+ if (NSIntegerTypedefed) {
+ TypedefDcl = NSIntegerTypedefed;
+ NSIntegerTypedefed = 0;
+ }
+ else if (NSUIntegerTypedefed) {
+ TypedefDcl = NSUIntegerTypedefed;
+ NSUIntegerTypedefed = 0;
+ }
+ else
+ return false;
+ unsigned FileIdOfTypedefDcl =
+ PP.getSourceManager().getFileID(TypedefDcl->getLocation()).getHashValue();
+ unsigned FileIdOfEnumDcl =
+ PP.getSourceManager().getFileID(EnumDcl->getLocation()).getHashValue();
+ if (FileIdOfTypedefDcl != FileIdOfEnumDcl)
+ return false;
+ }
+ if (TypedefDcl->isDeprecated())
return false;
QualType qt = TypedefDcl->getTypeSourceInfo()->getType();
@@ -678,9 +730,10 @@ bool ObjCMigrateASTConsumer::migrateNSEn
if (IsNSUIntegerType && !Ctx.Idents.get("NS_OPTIONS").hasMacroDefinition())
return false;
edit::Commit commit(*Editor);
- rewriteToNSEnumDecl(EnumDcl, TypedefDcl, *NSAPIObj, commit, IsNSIntegerType, NSOptions);
+ bool Res = rewriteToNSEnumDecl(EnumDcl, TypedefDcl, *NSAPIObj,
+ commit, IsNSIntegerType, NSOptions);
Editor->commit(commit);
- return true;
+ return Res;
}
static void ReplaceWithInstancetype(const ObjCMigrateASTConsumer &ASTC,
@@ -1432,26 +1485,29 @@ void ObjCMigrateASTConsumer::HandleTrans
migrateProtocolConformance(Ctx, ImpDecl);
}
else if (const EnumDecl *ED = dyn_cast<EnumDecl>(*D)) {
+ if (!(ASTMigrateActions & FrontendOptions::ObjCMT_NsMacros))
+ continue;
DeclContext::decl_iterator N = D;
- ++N;
- if (N != DEnd)
- if (const TypedefDecl *TD = dyn_cast<TypedefDecl>(*N)) {
- if (ASTMigrateActions & FrontendOptions::ObjCMT_NsMacros) {
- if (migrateNSEnumDecl(Ctx, ED, TD))
- D++;
- }
- }
+ if (++N != DEnd) {
+ const TypedefDecl *TD = dyn_cast<TypedefDecl>(*N);
+ if (migrateNSEnumDecl(Ctx, ED, TD) && TD)
+ D++;
+ }
+ else
+ migrateNSEnumDecl(Ctx, ED, /*TypedefDecl */0);
}
else if (const TypedefDecl *TD = dyn_cast<TypedefDecl>(*D)) {
- DeclContext::decl_iterator N = D;
- ++N;
- if (N != DEnd)
- if (const EnumDecl *ED = dyn_cast<EnumDecl>(*N)) {
- if (ASTMigrateActions & FrontendOptions::ObjCMT_NsMacros) {
- if (migrateNSEnumDecl(Ctx, ED, TD))
+ if (ASTMigrateActions & FrontendOptions::ObjCMT_NsMacros) {
+ DeclContext::decl_iterator N = D;
+ if (++N != DEnd)
+ if (const EnumDecl *ED = dyn_cast<EnumDecl>(*N)) {
+ if (migrateNSEnumDecl(Ctx, ED, TD)) {
++D;
+ continue;
+ }
}
- }
+ CacheObjCNSIntegerTypedefed(TD);
+ }
}
else if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(*D)) {
if (ASTMigrateActions & FrontendOptions::ObjCMT_Annotation)
Modified: cfe/trunk/test/ARCMT/objcmt-ns-macros.m
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/ARCMT/objcmt-ns-macros.m?rev=192645&r1=192644&r2=192645&view=diff
==============================================================================
--- cfe/trunk/test/ARCMT/objcmt-ns-macros.m (original)
+++ cfe/trunk/test/ARCMT/objcmt-ns-macros.m Mon Oct 14 19:00:28 2013
@@ -216,6 +216,9 @@ enum {
} NS_ENUM_AVAILABLE_MAC(10.9);
typedef NSInteger NSModalResponse NS_AVAILABLE_MAC(10.9);
+// rdar://15201056
+typedef NSUInteger FarAwayNSUInteger;
+
// rdar://15200915
typedef NSUInteger NSWorkspaceLaunchOptions;
enum {
@@ -247,7 +250,25 @@ enum {
};
enum {
+ FarAway1 = 1 << 1,
+ FarAway2 = 1 << 2
+};
+
+enum {
NSExcludeQuickDrawElementsIconOption = 1 << 1,
NSExclude10_4ElementsIconOption = 1 << 2
};
typedef NSUInteger NSWorkspaceIconOptions;
+
+typedef NSInteger NSCollectionViewDropOperation;
+
+ at interface INTF {
+ NSCollectionViewDropOperation I1;
+ NSCollectionViewDropOperation I2;
+}
+ at end
+
+enum {
+ NotFarAway1 = 1 << 1,
+ NotFarAway2 = 1 << 2
+};
Modified: cfe/trunk/test/ARCMT/objcmt-ns-macros.m.result
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/ARCMT/objcmt-ns-macros.m.result?rev=192645&r1=192644&r2=192645&view=diff
==============================================================================
--- cfe/trunk/test/ARCMT/objcmt-ns-macros.m.result (original)
+++ cfe/trunk/test/ARCMT/objcmt-ns-macros.m.result Mon Oct 14 19:00:28 2013
@@ -121,6 +121,7 @@ typedef enum {
#define NS_ENUM_AVAILABLE(X,Y)
+
typedef NS_OPTIONS(NSUInteger, NSFOptions) {
NSFStrongMemory NS_ENUM_AVAILABLE(10_5, 6_0) = (0UL << 0),
NSFOpaqueMemory NS_ENUM_AVAILABLE(10_5, 6_0) = (2UL << 0),
@@ -137,7 +138,6 @@ typedef NS_OPTIONS(NSUInteger, NSFOption
NSFCopyIn NS_ENUM_AVAILABLE(10_5, 6_0) = (1UL << 16),
};
-
typedef NS_ENUM(NSInteger, UIP) {
UIP0One = 0,
UIP0Two = 1,
@@ -206,6 +206,12 @@ typedef NS_ENUM(NSInteger, NSModalRespon
NSModalResponseContinue = (-1002),
} NS_ENUM_AVAILABLE_MAC(10.9);
+// rdar://15201056
+typedef NS_OPTIONS(NSUInteger, FarAwayNSUInteger) {
+ FarAway1 = 1 << 1,
+ FarAway2 = 1 << 2
+};
+
// rdar://15200915
typedef NS_OPTIONS(NSUInteger, NSWorkspaceLaunchOptions) {
NSWorkspaceLaunchAndPrint = 0x00000002,
@@ -233,7 +239,20 @@ typedef NS_OPTIONS(NSUInteger, NSWorkspa
NSExclude10_4ElementsCreationOption = 1 << 2
};
+
typedef NS_OPTIONS(NSUInteger, NSWorkspaceIconOptions) {
NSExcludeQuickDrawElementsIconOption = 1 << 1,
NSExclude10_4ElementsIconOption = 1 << 2
};
+
+typedef NS_OPTIONS(NSUInteger, NSCollectionViewDropOperation) {
+ NotFarAway1 = 1 << 1,
+ NotFarAway2 = 1 << 2
+};
+
+ at interface INTF {
+ NSCollectionViewDropOperation I1;
+ NSCollectionViewDropOperation I2;
+}
+ at end
+
More information about the cfe-commits
mailing list