summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--clang/include/clang/Edit/Rewriters.h6
-rw-r--r--clang/lib/ARCMigrate/ObjCMT.cpp27
-rw-r--r--clang/lib/Edit/RewriteObjCFoundationAPI.cpp13
-rw-r--r--clang/test/ARCMT/objcmt-ns-macros.m13
-rw-r--r--clang/test/ARCMT/objcmt-ns-macros.m.result13
5 files changed, 72 insertions, 0 deletions
diff --git a/clang/include/clang/Edit/Rewriters.h b/clang/include/clang/Edit/Rewriters.h
index d7718c540b4..ad7494f8f51 100644
--- a/clang/include/clang/Edit/Rewriters.h
+++ b/clang/include/clang/Edit/Rewriters.h
@@ -17,6 +17,8 @@ namespace clang {
class ObjCInterfaceDecl;
class ObjCProtocolDecl;
class NSAPI;
+ class EnumDecl;
+ class TypedefDecl;
class ParentMap;
namespace edit {
@@ -38,6 +40,10 @@ bool rewriteToObjCInterfaceDecl(const ObjCInterfaceDecl *IDecl,
bool rewriteToObjCSubscriptSyntax(const ObjCMessageExpr *Msg,
const NSAPI &NS, Commit &commit);
+
+bool rewriteToNSEnumDecl(const EnumDecl *EnumDcl,
+ const TypedefDecl *TypedefDcl,
+ const NSAPI &NS, Commit &commit);
}
diff --git a/clang/lib/ARCMigrate/ObjCMT.cpp b/clang/lib/ARCMigrate/ObjCMT.cpp
index 46ee88e7049..732e46ad5af 100644
--- a/clang/lib/ARCMigrate/ObjCMT.cpp
+++ b/clang/lib/ARCMigrate/ObjCMT.cpp
@@ -35,6 +35,8 @@ class ObjCMigrateASTConsumer : public ASTConsumer {
void migrateObjCInterfaceDecl(ASTContext &Ctx, ObjCInterfaceDecl *D);
void migrateProtocolConformance(ASTContext &Ctx,
const ObjCImplementationDecl *ImpDecl);
+ void migrateNSEnumDecl(ASTContext &Ctx, const EnumDecl *EnumDcl,
+ const TypedefDecl *TypedefDcl);
public:
std::string MigrateDir;
@@ -355,6 +357,25 @@ void ObjCMigrateASTConsumer::migrateProtocolConformance(ASTContext &Ctx,
Editor->commit(commit);
}
+void ObjCMigrateASTConsumer::migrateNSEnumDecl(ASTContext &Ctx,
+ const EnumDecl *EnumDcl,
+ const TypedefDecl *TypedefDcl) {
+ if (!EnumDcl->isCompleteDefinition() || EnumDcl->getIdentifier() ||
+ !TypedefDcl->getIdentifier())
+ return;
+
+ QualType qt = TypedefDcl->getTypeSourceInfo()->getType();
+ if (!NSAPIObj->isObjCNSIntegerType(qt))
+ return;
+
+ // NS_ENUM must be available.
+ if (!Ctx.Idents.get("NS_ENUM").hasMacroDefinition())
+ return;
+ edit::Commit commit(*Editor);
+ edit::rewriteToNSEnumDecl(EnumDcl, TypedefDcl, *NSAPIObj, commit);
+ Editor->commit(commit);
+}
+
namespace {
class RewritesReceiver : public edit::EditsReceiver {
@@ -386,6 +407,12 @@ void ObjCMigrateASTConsumer::HandleTranslationUnit(ASTContext &Ctx) {
else if (const ObjCImplementationDecl *ImpDecl =
dyn_cast<ObjCImplementationDecl>(*D))
migrateProtocolConformance(Ctx, ImpDecl);
+ else if (const EnumDecl *ED = dyn_cast<EnumDecl>(*D)) {
+ DeclContext::decl_iterator N = D;
+ ++N;
+ if (const TypedefDecl *TD = dyn_cast<TypedefDecl>(*N))
+ migrateNSEnumDecl(Ctx, ED, TD);
+ }
}
Rewriter rewriter(Ctx.getSourceManager(), Ctx.getLangOpts());
diff --git a/clang/lib/Edit/RewriteObjCFoundationAPI.cpp b/clang/lib/Edit/RewriteObjCFoundationAPI.cpp
index 30a9f522b2f..68dcd6b7c60 100644
--- a/clang/lib/Edit/RewriteObjCFoundationAPI.cpp
+++ b/clang/lib/Edit/RewriteObjCFoundationAPI.cpp
@@ -434,6 +434,19 @@ bool edit::rewriteToObjCInterfaceDecl(const ObjCInterfaceDecl *IDecl,
return true;
}
+bool edit::rewriteToNSEnumDecl(const EnumDecl *EnumDcl,
+ const TypedefDecl *TypedefDcl,
+ const NSAPI &NS, Commit &commit) {
+ std::string ClassString = "typedef NS_ENUM(NSInteger, ";
+ ClassString += TypedefDcl->getIdentifier()->getName();
+ ClassString += ')';
+ SourceRange R(EnumDcl->getLocStart(), EnumDcl->getLocStart());
+ commit.replace(R, ClassString);
+ commit.remove(SourceRange(TypedefDcl->getLocStart(), TypedefDcl->getLocEnd()));
+ return true;
+
+}
+
/// \brief Returns true if the immediate message arguments of \c Msg should not
/// be rewritten because it will interfere with the rewrite of the parent
/// message expression. e.g.
diff --git a/clang/test/ARCMT/objcmt-ns-macros.m b/clang/test/ARCMT/objcmt-ns-macros.m
new file mode 100644
index 00000000000..e6b608a4ac3
--- /dev/null
+++ b/clang/test/ARCMT/objcmt-ns-macros.m
@@ -0,0 +1,13 @@
+// RUN: rm -rf %t
+// RUN: %clang_cc1 -objcmt-migrate-property -mt-migrate-directory %t %s -x objective-c -fobjc-runtime-has-weak -fobjc-arc -fobjc-default-synthesize-properties -triple x86_64-apple-darwin11
+// RUN: c-arcmt-test -mt-migrate-directory %t | arcmt-test -verify-transformed-files %s.result
+// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -fsyntax-only -x objective-c -fobjc-runtime-has-weak -fobjc-arc -fobjc-default-synthesize-properties %s.result
+
+typedef long NSInteger;
+#define NS_ENUM(_type, _name) enum _name : _type _name; enum _name : _type
+
+enum {
+ blah,
+ blarg
+};
+typedef NSInteger wibble;
diff --git a/clang/test/ARCMT/objcmt-ns-macros.m.result b/clang/test/ARCMT/objcmt-ns-macros.m.result
new file mode 100644
index 00000000000..ab8e8d20036
--- /dev/null
+++ b/clang/test/ARCMT/objcmt-ns-macros.m.result
@@ -0,0 +1,13 @@
+// RUN: rm -rf %t
+// RUN: %clang_cc1 -objcmt-migrate-property -mt-migrate-directory %t %s -x objective-c -fobjc-runtime-has-weak -fobjc-arc -fobjc-default-synthesize-properties -triple x86_64-apple-darwin11
+// RUN: c-arcmt-test -mt-migrate-directory %t | arcmt-test -verify-transformed-files %s.result
+// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -fsyntax-only -x objective-c -fobjc-runtime-has-weak -fobjc-arc -fobjc-default-synthesize-properties %s.result
+
+typedef long NSInteger;
+#define NS_ENUM(_type, _name) enum _name : _type _name; enum _name : _type
+
+typedef NS_ENUM(NSInteger, wibble) {
+ blah,
+ blarg
+};
+;
OpenPOWER on IntegriCloud