diff options
author | Fariborz Jahanian <fjahanian@apple.com> | 2014-10-07 19:01:46 +0000 |
---|---|---|
committer | Fariborz Jahanian <fjahanian@apple.com> | 2014-10-07 19:01:46 +0000 |
commit | 80ebf8da7ed85e7cc3f04c1112e62a95b875a79d (patch) | |
tree | ba480bb69d741405570bb61bc6fe986931239889 /clang/lib/ARCMigrate/ObjCMT.cpp | |
parent | 0cb3c9bb248780fe5eb32604bd8ea0c82d4e018f (diff) | |
download | bcm5719-llvm-80ebf8da7ed85e7cc3f04c1112e62a95b875a79d.tar.gz bcm5719-llvm-80ebf8da7ed85e7cc3f04c1112e62a95b875a79d.zip |
Objective-C SDK modernization. When modernizing to
use NS_ENUM/NS_OPTIONS macros, add an import of
Foundation.h (or its module) as necessary.
rdar://18498550
llvm-svn: 219225
Diffstat (limited to 'clang/lib/ARCMigrate/ObjCMT.cpp')
-rw-r--r-- | clang/lib/ARCMigrate/ObjCMT.cpp | 32 |
1 files changed, 25 insertions, 7 deletions
diff --git a/clang/lib/ARCMigrate/ObjCMT.cpp b/clang/lib/ARCMigrate/ObjCMT.cpp index f9c6e6e644f..c21e7324ebb 100644 --- a/clang/lib/ARCMigrate/ObjCMT.cpp +++ b/clang/lib/ARCMigrate/ObjCMT.cpp @@ -81,6 +81,8 @@ class ObjCMigrateASTConsumer : public ASTConsumer { void inferDesignatedInitializers(ASTContext &Ctx, const ObjCImplementationDecl *ImplD); + + bool InsertFoundation(ASTContext &Ctx, SourceLocation Loc); public: std::string MigrateDir; @@ -95,6 +97,7 @@ public: const PPConditionalDirectiveRecord *PPRec; Preprocessor &PP; bool IsOutputFile; + bool FoundationIncluded; llvm::SmallPtrSet<ObjCProtocolDecl *, 32> ObjCProtocolDecls; llvm::SmallVector<const Decl *, 8> CFFunctionIBCandidates; llvm::StringMap<char> WhiteListFilenames; @@ -111,7 +114,8 @@ public: ASTMigrateActions(astMigrateActions), NSIntegerTypedefed(nullptr), NSUIntegerTypedefed(nullptr), Remapper(remapper), FileMgr(fileMgr), PPRec(PPRec), PP(PP), - IsOutputFile(isOutputFile) { + IsOutputFile(isOutputFile), + FoundationIncluded(false){ for (ArrayRef<std::string>::iterator I = WhiteList.begin(), E = WhiteList.end(); I != E; ++I) { @@ -809,11 +813,8 @@ bool ObjCMigrateASTConsumer::migrateNSEnumDecl(ASTContext &Ctx, if (const EnumType *EnumTy = qt->getAs<EnumType>()) { if (EnumTy->getDecl() == EnumDcl) { bool NSOptions = UseNSOptionsMacro(PP, Ctx, EnumDcl); - if (NSOptions) { - if (!Ctx.Idents.get("NS_OPTIONS").hasMacroDefinition()) - return false; - } - else if (!Ctx.Idents.get("NS_ENUM").hasMacroDefinition()) + if (!Ctx.Idents.get("NS_ENUM").hasMacroDefinition() && + !InsertFoundation(Ctx, TypedefDcl->getLocStart())) return false; edit::Commit commit(*Editor); rewriteToNSMacroDecl(EnumDcl, TypedefDcl, *NSAPIObj, commit, !NSOptions); @@ -827,7 +828,8 @@ bool ObjCMigrateASTConsumer::migrateNSEnumDecl(ASTContext &Ctx, // We may still use NS_OPTIONS based on what we find in the enumertor list. bool NSOptions = UseNSOptionsMacro(PP, Ctx, EnumDcl); // For sanity check, see if macro NS_ENUM can be seen. - if (!Ctx.Idents.get("NS_ENUM").hasMacroDefinition()) + if (!Ctx.Idents.get("NS_ENUM").hasMacroDefinition() + && !InsertFoundation(Ctx, TypedefDcl->getLocStart())) return false; edit::Commit commit(*Editor); bool Res = rewriteToNSEnumDecl(EnumDcl, TypedefDcl, *NSAPIObj, @@ -1612,6 +1614,22 @@ void ObjCMigrateASTConsumer::inferDesignatedInitializers( } } +bool ObjCMigrateASTConsumer::InsertFoundation(ASTContext &Ctx, + SourceLocation Loc) { + if (FoundationIncluded) + return true; + if (Loc.isInvalid()) + return false; + edit::Commit commit(*Editor); + if (Ctx.getLangOpts().Modules) + commit.insert(Loc, "@import Foundation;\n"); + else + commit.insert(Loc, "#import <Foundation/Foundation.h>\n"); + Editor->commit(commit); + FoundationIncluded = true; + return true; +} + namespace { class RewritesReceiver : public edit::EditsReceiver { |