[cfe-commits] [clang-tools-extra] r171858 - /clang-tools-extra/trunk/clang-format/ClangFormat.cpp
Manuel Klimek
klimek at google.com
Tue Jan 8 07:19:57 PST 2013
Author: klimek
Date: Tue Jan 8 09:19:57 2013
New Revision: 171858
URL: http://llvm.org/viewvc/llvm-project?rev=171858&view=rev
Log:
Implements the features requested in PR14679.
- adds '-h' as an alias for '-help'.
- adds an optional <file> argument
- adds an option -i to in-place edit the given file
- adds a help text to explain what the tool does
Modified:
clang-tools-extra/trunk/clang-format/ClangFormat.cpp
Modified: clang-tools-extra/trunk/clang-format/ClangFormat.cpp
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-format/ClangFormat.cpp?rev=171858&r1=171857&r2=171858&view=diff
==============================================================================
--- clang-tools-extra/trunk/clang-format/ClangFormat.cpp (original)
+++ clang-tools-extra/trunk/clang-format/ClangFormat.cpp Tue Jan 8 09:19:57 2013
@@ -24,6 +24,8 @@
using namespace llvm;
+static cl::opt<bool> Help("h", cl::desc("Alias for -help"), cl::Hidden);
+
static cl::opt<int> Offset(
"offset", cl::desc("Format a range starting at this file offset."),
cl::init(0));
@@ -33,13 +35,17 @@
static cl::opt<std::string> Style(
"style", cl::desc("Coding style, currently supports: LLVM, Google."),
cl::init("LLVM"));
+static cl::opt<bool> Inplace("i",
+ cl::desc("Inplace edit <file>, if specified."));
+
+static cl::opt<std::string> FileName(cl::Positional, cl::desc("[<file>]"),
+ cl::init("-"));
namespace clang {
namespace format {
static FileID createInMemoryFile(const MemoryBuffer *Source,
- SourceManager &Sources,
- FileManager &Files) {
+ SourceManager &Sources, FileManager &Files) {
const FileEntry *Entry =
Files.getVirtualFile("<stdio>", Source->getBufferSize(), 0);
Sources.overrideFileContents(Entry, Source, true);
@@ -48,11 +54,12 @@
static void format() {
FileManager Files((FileSystemOptions()));
- DiagnosticsEngine Diagnostics(IntrusiveRefCntPtr<DiagnosticIDs>(
- new DiagnosticIDs), new DiagnosticOptions);
+ DiagnosticsEngine Diagnostics(
+ IntrusiveRefCntPtr<DiagnosticIDs>(new DiagnosticIDs),
+ new DiagnosticOptions);
SourceManager Sources(Diagnostics, Files);
OwningPtr<MemoryBuffer> Code;
- if (error_code ec = MemoryBuffer::getSTDIN(Code)) {
+ if (error_code ec = MemoryBuffer::getFileOrSTDIN(FileName, Code)) {
llvm::errs() << ec.message() << "\n";
return;
}
@@ -75,14 +82,36 @@
tooling::Replacements Replaces = reformat(FStyle, Lex, Sources, Ranges);
Rewriter Rewrite(Sources, LangOptions());
tooling::applyAllReplacements(Replaces, Rewrite);
- Rewrite.getEditBuffer(ID).write(outs());
+ if (Inplace) {
+ std::string ErrorInfo;
+ llvm::raw_fd_ostream FileStream(FileName.c_str(), ErrorInfo,
+ llvm::raw_fd_ostream::F_Binary);
+ if (!ErrorInfo.empty()) {
+ llvm::errs() << "Error while writing file: " << ErrorInfo << "\n";
+ return;
+ }
+ Rewrite.getEditBuffer(ID).write(FileStream);
+ FileStream.flush();
+ } else {
+ Rewrite.getEditBuffer(ID).write(outs());
+ }
}
} // namespace format
} // namespace clang
int main(int argc, const char **argv) {
- cl::ParseCommandLineOptions(argc, argv);
+ cl::ParseCommandLineOptions(
+ argc, argv,
+ "A tool to format C/C++/Obj-C code.\n\n"
+ "Currently supports LLVM and Google style guides.\n"
+ "If no arguments are specified, it formats the code from standard input\n"
+ "and writes the result to the standard output.\n"
+ "If <file> is given, it reformats the file. If -i is specified together\n"
+ "with <file>, the file is edited in-place. Otherwise, the result is\n"
+ "written to the standard output.\n");
+ if (Help)
+ cl::PrintHelpMessage();
clang::format::format();
return 0;
}
More information about the cfe-commits
mailing list