[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