llvm::StringRef Filename, InputKind Kind,
DiagnosticClient *DiagClient);
-/// \brief Like applyTransformations but no source file is modified, compilation
-/// happens using in-memory buffers.
-bool applyTransformationsInMemory(CompilerInvocation &origCI,
- llvm::StringRef Filename, InputKind Kind,
- DiagnosticClient *DiagClient);
-
typedef void (*TransformFn)(MigrationPass &pass);
std::vector<TransformFn> getAllTransformations();
TransformationAction(FrontendAction *WrappedAction);
};
-class InMemoryTransformationAction : public WrapperFrontendAction {
-protected:
- virtual void ExecuteAction();
-
-public:
- InMemoryTransformationAction(FrontendAction *WrappedAction);
-};
-
}
}
HelpText<"Check for ARC migration issues that need manual handling">;
def arcmt_modify : Flag<"-arcmt-modify">,
HelpText<"Apply modifications to files to conform to ARC">;
-def arcmt_modify_in_memory : Flag<"-arcmt-modify-in-memory">,
- HelpText<"Apply ARC conforming modifications & compile using memory buffers">;
def import_module : Separate<"-import-module">,
HelpText<"Import a module definition file">;
HelpText<"Check for ARC migration issues that need manual handling">;
def ccc_arrmt_modify : Flag<"-ccc-arrmt-modify">, CCCDriverOpt,
HelpText<"Apply modifications to files to conform to ARC">;
-def ccc_arrmt_modify_in_memory : Flag<"-ccc-arrmt-modify-in-memory">,
- HelpText<"Apply ARC conforming modifications & compile using memory buffers">;
// Make sure all other -ccc- options are rejected.
def ccc_ : Joined<"-ccc-">, Group<ccc_Group>, Flags<[Unsupported]>;
enum {
ARCMT_None,
ARCMT_Check,
- ARCMT_Modify,
- ARCMT_ModifyInMemory
+ ARCMT_Modify
} ARCMTAction;
/// The input files and their types.
return migration.getRemapper().overwriteOriginal(*Diags);
}
-//===----------------------------------------------------------------------===//
-// applyTransformationsInMemory.
-//===----------------------------------------------------------------------===//
-
-bool arcmt::applyTransformationsInMemory(CompilerInvocation &origCI,
- llvm::StringRef Filename, InputKind Kind,
- DiagnosticClient *DiagClient) {
- if (!origCI.getLangOpts().ObjC1)
- return false;
-
- // Make sure checking is successful first.
- CompilerInvocation CInvokForCheck(origCI);
- if (arcmt::checkForManualIssues(CInvokForCheck, Filename, Kind, DiagClient))
- return true;
-
- CompilerInvocation CInvok(origCI);
- CInvok.getFrontendOpts().Inputs.clear();
- CInvok.getFrontendOpts().Inputs.push_back(std::make_pair(Kind, Filename));
-
- MigrationProcess migration(CInvok, DiagClient);
-
- std::vector<TransformFn> transforms = arcmt::getAllTransformations();
- assert(!transforms.empty());
-
- for (unsigned i=0, e = transforms.size(); i != e; ++i) {
- bool err = migration.applyTransform(transforms[i]);
- if (err) return true;
- }
-
- origCI.getLangOpts().ObjCAutoRefCount = true;
- migration.getRemapper().transferMappingsAndClear(origCI);
-
- return false;
-}
-
//===----------------------------------------------------------------------===//
// CollectTransformActions.
//===----------------------------------------------------------------------===//
TransformationAction::TransformationAction(FrontendAction *WrappedAction)
: WrapperFrontendAction(WrappedAction) {}
-
-void InMemoryTransformationAction::ExecuteAction() {
- CompilerInstance &CI = getCompilerInstance();
- if (arcmt::applyTransformationsInMemory(CI.getInvocation(), getCurrentFile(),
- getCurrentFileKind(),
- CI.getDiagnostics().getClient()))
- return;
-
- WrapperFrontendAction::ExecuteAction();
-}
-
-InMemoryTransformationAction::InMemoryTransformationAction(
- FrontendAction *WrappedAction)
- : WrapperFrontendAction(WrappedAction) {}
-
if (!Args.hasArg(options::OPT_fno_objc_arc)) {
if (const Arg *A = Args.getLastArg(options::OPT_ccc_arrmt_check,
- options::OPT_ccc_arrmt_modify,
- options::OPT_ccc_arrmt_modify_in_memory)) {
+ options::OPT_ccc_arrmt_modify)) {
switch (A->getOption().getID()) {
default:
llvm_unreachable("missed a case");
case options::OPT_ccc_arrmt_modify:
CmdArgs.push_back("-arcmt-modify");
break;
- case options::OPT_ccc_arrmt_modify_in_memory:
- CmdArgs.push_back("-arcmt-modify-in-memory");
- break;
}
}
}
case FrontendOptions::ARCMT_Modify:
Res.push_back("-arcmt-modify");
break;
- case FrontendOptions::ARCMT_ModifyInMemory:
- Res.push_back("-arcmt-modify-in-memory");
- break;
}
bool NeedLang = false;
Opts.ARCMTAction = FrontendOptions::ARCMT_None;
if (const Arg *A = Args.getLastArg(OPT_arcmt_check,
- OPT_arcmt_modify,
- OPT_arcmt_modify_in_memory)) {
+ OPT_arcmt_modify)) {
switch (A->getOption().getID()) {
default:
llvm_unreachable("missed a case");
case OPT_arcmt_modify:
Opts.ARCMTAction = FrontendOptions::ARCMT_Modify;
break;
- case OPT_arcmt_modify_in_memory:
- Opts.ARCMTAction = FrontendOptions::ARCMT_ModifyInMemory;
- break;
}
}
case FrontendOptions::ARCMT_Modify:
Act = new arcmt::TransformationAction(Act);
break;
- case FrontendOptions::ARCMT_ModifyInMemory:
- Act = new arcmt::InMemoryTransformationAction(Act);
- break;
}
// If there are any AST files to merge, create a frontend action