aboutsummaryrefslogtreecommitdiff
path: root/lib/Frontend/FrontendActions.cpp
diff options
context:
space:
mode:
authorNick Lewycky <nicholas@mxc.ca>2010-04-24 01:30:46 +0000
committerNick Lewycky <nicholas@mxc.ca>2010-04-24 01:30:46 +0000
commitba5f6eced29937e4e4851a2c0980744768413d66 (patch)
tree7c65077ea2d105c3761012d52510063c5ce36530 /lib/Frontend/FrontendActions.cpp
parent970c618c3f9ce7e010a30587118afc03434cfd99 (diff)
Teach clang -fixit to modify files in-place, or -fixit=suffix to create new
files with the additional suffix in the middle. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@102230 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Frontend/FrontendActions.cpp')
-rw-r--r--lib/Frontend/FrontendActions.cpp90
1 files changed, 21 insertions, 69 deletions
diff --git a/lib/Frontend/FrontendActions.cpp b/lib/Frontend/FrontendActions.cpp
index e2b2fd7deb..6cd960be20 100644
--- a/lib/Frontend/FrontendActions.cpp
+++ b/lib/Frontend/FrontendActions.cpp
@@ -19,6 +19,7 @@
#include "clang/Frontend/FixItRewriter.h"
#include "clang/Frontend/FrontendDiagnostic.h"
#include "clang/Frontend/Utils.h"
+#include "llvm/ADT/OwningPtr.h"
#include "llvm/Support/raw_ostream.h"
using namespace clang;
@@ -113,85 +114,36 @@ ASTConsumer *FixItAction::CreateASTConsumer(CompilerInstance &CI,
return new ASTConsumer();
}
-/// AddFixItLocations - Add any individual user specified "fix-it" locations,
-/// and return true on success.
-static bool AddFixItLocations(CompilerInstance &CI,
- FixItRewriter &FixItRewrite) {
- const std::vector<ParsedSourceLocation> &Locs =
- CI.getFrontendOpts().FixItLocations;
- for (unsigned i = 0, e = Locs.size(); i != e; ++i) {
- const FileEntry *File = CI.getFileManager().getFile(Locs[i].FileName);
- if (!File) {
- CI.getDiagnostics().Report(diag::err_fe_unable_to_find_fixit_file)
- << Locs[i].FileName;
- return false;
- }
-
- RequestedSourceLocation Requested;
- Requested.File = File;
- Requested.Line = Locs[i].Line;
- Requested.Column = Locs[i].Column;
- FixItRewrite.addFixItLocation(Requested);
- }
+class FixItActionSuffixInserter : public FixItPathRewriter {
+ std::string NewSuffix;
- const std::string &OutputFile = CI.getFrontendOpts().OutputFile;
- if (Locs.empty() && !OutputFile.empty()) {
- // FIXME: we will issue "FIX-IT applied suggested code changes" for every
- // input, but only the main file will actually be rewritten.
- const std::vector<std::pair<FrontendOptions::InputKind, std::string> > &Inputs =
- CI.getFrontendOpts().Inputs;
- for (unsigned i = 0, e = Inputs.size(); i != e; ++i) {
- const FileEntry *File = CI.getFileManager().getFile(Inputs[i].second);
- assert(File && "Input file not found in FileManager");
- RequestedSourceLocation Requested;
- Requested.File = File;
- Requested.Line = 0;
- Requested.Column = 0;
- FixItRewrite.addFixItLocation(Requested);
- }
- }
+public:
+ explicit FixItActionSuffixInserter(std::string NewSuffix)
+ : NewSuffix(NewSuffix) {}
- return true;
-}
+ std::string RewriteFilename(const std::string &Filename) {
+ llvm::sys::Path Path(Filename);
+ std::string Suffix = Path.getSuffix();
+ Path.eraseSuffix();
+ Path.appendSuffix(NewSuffix + "." + Suffix);
+ return Path.c_str();
+ }
+};
bool FixItAction::BeginSourceFileAction(CompilerInstance &CI,
llvm::StringRef Filename) {
+ const FrontendOptions &FEOpts = getCompilerInstance().getFrontendOpts();
+ if (!FEOpts.FixItSuffix.empty()) {
+ PathRewriter.reset(new FixItActionSuffixInserter(FEOpts.FixItSuffix));
+ } else {
+ PathRewriter.reset();
+ }
Rewriter.reset(new FixItRewriter(CI.getDiagnostics(), CI.getSourceManager(),
- CI.getLangOpts()));
- if (!AddFixItLocations(CI, *Rewriter))
- return false;
-
+ CI.getLangOpts(), PathRewriter.get()));
return true;
}
void FixItAction::EndSourceFileAction() {
- const FrontendOptions &FEOpts = getCompilerInstance().getFrontendOpts();
- if (!FEOpts.OutputFile.empty()) {
- // When called with 'clang -fixit -o filename' output only the main file.
-
- const SourceManager &SM = getCompilerInstance().getSourceManager();
- FileID MainFileID = SM.getMainFileID();
- if (!Rewriter->IsModified(MainFileID)) {
- getCompilerInstance().getDiagnostics().Report(
- diag::note_fixit_main_file_unchanged);
- return;
- }
-
- llvm::OwningPtr<llvm::raw_ostream> OwnedStream;
- llvm::raw_ostream *OutFile;
- if (FEOpts.OutputFile == "-") {
- OutFile = &llvm::outs();
- } else {
- std::string Err;
- OutFile = new llvm::raw_fd_ostream(FEOpts.OutputFile.c_str(), Err,
- llvm::raw_fd_ostream::F_Binary);
- OwnedStream.reset(OutFile);
- }
-
- Rewriter->WriteFixedFile(MainFileID, *OutFile);
- return;
- }
-
// Otherwise rewrite all files.
Rewriter->WriteFixedFiles();
}