r248904 - clang-format: Use Rewriter again to write the output files.

Daniel Jasper via cfe-commits cfe-commits at lists.llvm.org
Wed Sep 30 06:59:29 PDT 2015


Author: djasper
Date: Wed Sep 30 08:59:29 2015
New Revision: 248904

URL: http://llvm.org/viewvc/llvm-project?rev=248904&view=rev
Log:
clang-format: Use Rewriter again to write the output files.

This has two advantages:
1. Atomic writes.
2. Proper handling of line endings (hopefully solving llvm.org/PR24999

Modified:
    cfe/trunk/tools/clang-format/ClangFormat.cpp

Modified: cfe/trunk/tools/clang-format/ClangFormat.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/clang-format/ClangFormat.cpp?rev=248904&r1=248903&r2=248904&view=diff
==============================================================================
--- cfe/trunk/tools/clang-format/ClangFormat.cpp (original)
+++ cfe/trunk/tools/clang-format/ClangFormat.cpp Wed Sep 30 08:59:29 2015
@@ -19,6 +19,7 @@
 #include "clang/Basic/SourceManager.h"
 #include "clang/Basic/Version.h"
 #include "clang/Format/Format.h"
+#include "clang/Rewrite/Core/Rewriter.h"
 #include "llvm/ADT/StringMap.h"
 #include "llvm/Support/CommandLine.h"
 #include "llvm/Support/Debug.h"
@@ -77,7 +78,7 @@ AssumeFileName("assume-filename",
                cl::desc("When reading from stdin, clang-format assumes this\n"
                         "filename to look for a style config file (with\n"
                         "-style=file) and to determine the language."),
-               cl::cat(ClangFormatCategory));
+               cl::init("<stdin>"), cl::cat(ClangFormatCategory));
 
 static cl::opt<bool> Inplace("i",
                              cl::desc("Inplace edit <file>s, if specified."),
@@ -109,8 +110,7 @@ namespace format {
 
 static FileID createInMemoryFile(StringRef FileName, MemoryBuffer *Source,
                                  SourceManager &Sources, FileManager &Files) {
-  const FileEntry *Entry = Files.getVirtualFile(FileName == "-" ? "<stdin>" :
-                                                    FileName,
+  const FileEntry *Entry = Files.getVirtualFile(FileName,
                                                 Source->getBufferSize(), 0);
   Sources.overrideFileContents(Entry, Source, true);
   return Sources.createFileID(Entry, SourceLocation(), SrcMgr::C_User);
@@ -132,7 +132,7 @@ static bool fillRanges(MemoryBuffer *Cod
       IntrusiveRefCntPtr<DiagnosticIDs>(new DiagnosticIDs),
       new DiagnosticOptions);
   SourceManager Sources(Diagnostics, Files);
-  FileID ID = createInMemoryFile("-", Code, Sources, Files);
+  FileID ID = createInMemoryFile("<irrelevant>", Code, Sources, Files);
   if (!LineRanges.empty()) {
     if (!Offsets.empty() || !Lengths.empty()) {
       llvm::errs() << "error: cannot use -lines with -offset/-length\n";
@@ -255,8 +255,8 @@ static bool format(StringRef FileName) {
 
   bool IncompleteFormat = false;
   Replaces = tooling::mergeReplacements(
-      Replaces,
-      reformat(FormatStyle, ChangedCode, Ranges, FileName, &IncompleteFormat));
+      Replaces, reformat(FormatStyle, ChangedCode, Ranges, AssumedFileName,
+                         &IncompleteFormat));
   if (OutputXML) {
     llvm::outs() << "<?xml version='1.0'?>\n<replacements "
                     "xml:space='preserve' incomplete_format='"
@@ -269,27 +269,26 @@ static bool format(StringRef FileName) {
     outputReplacementsXML(Replaces); 
     llvm::outs() << "</replacements>\n";
   } else {
-    std::string FormattedCode =
-        applyAllReplacements(Code->getBuffer(), Replaces);
+    FileManager Files((FileSystemOptions()));
+    DiagnosticsEngine Diagnostics(
+        IntrusiveRefCntPtr<DiagnosticIDs>(new DiagnosticIDs),
+        new DiagnosticOptions);
+    SourceManager Sources(Diagnostics, Files);
+    FileID ID = createInMemoryFile(AssumedFileName, Code.get(), Sources, Files);
+    Rewriter Rewrite(Sources, LangOptions());
+    tooling::applyAllReplacements(Replaces, Rewrite);
     if (Inplace) {
       if (FileName == "-")
         llvm::errs() << "error: cannot use -i when reading from stdin.\n";
-      else {
-        std::error_code EC;
-        raw_fd_ostream FileOut(FileName, EC, llvm::sys::fs::F_Text);
-        if (EC) {
-          llvm::errs() << EC.message() << "\n";
-          return true;
-        }
-        FileOut << FormattedCode;
-      }
+      else if (Rewrite.overwriteChangedFiles())
+        return true;
     } else {
       if (Cursor.getNumOccurrences() != 0)
         outs() << "{ \"Cursor\": "
                << tooling::shiftedCodePosition(Replaces, Cursor)
                << ", \"IncompleteFormat\": "
                << (IncompleteFormat ? "true" : "false") << " }\n";
-      outs() << FormattedCode;
+      Rewrite.getEditBuffer(ID).write(outs());
     }
   }
   return false;
@@ -350,3 +349,4 @@ int main(int argc, const char **argv) {
   }
   return Error ? 1 : 0;
 }
+




More information about the cfe-commits mailing list