diff options
author | Fariborz Jahanian <fjahanian@apple.com> | 2013-07-18 20:11:45 +0000 |
---|---|---|
committer | Fariborz Jahanian <fjahanian@apple.com> | 2013-07-18 20:11:45 +0000 |
commit | 92463274e647e007aa70efb4872b02057b63d8cc (patch) | |
tree | 869e0c7cf1b49ad5e2e39827453d72fe4619f233 /clang/lib | |
parent | 61b23b7edce7d558beca44fd8ebc82407f9ff2ce (diff) | |
download | bcm5719-llvm-92463274e647e007aa70efb4872b02057b63d8cc.tar.gz bcm5719-llvm-92463274e647e007aa70efb4872b02057b63d8cc.zip |
ObjectiveC migration. migration to NS_ENUM/SN_OPTION
- wip.
llvm-svn: 186604
Diffstat (limited to 'clang/lib')
-rw-r--r-- | clang/lib/ARCMigrate/ObjCMT.cpp | 27 | ||||
-rw-r--r-- | clang/lib/Edit/RewriteObjCFoundationAPI.cpp | 13 |
2 files changed, 40 insertions, 0 deletions
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. |