[PATCH] clang-apply-replacements: Add code-formatting post processing step

Edwin Vane edwin.vane at intel.com
Fri Sep 20 06:27:02 PDT 2013

  As you guessed, this functionality is being moved from clang-modernize. First step is to add it here, next step is to remove it from clang-modernize.

Comment at: clang-apply-replacements/lib/Tooling/ApplyReplacements.cpp:324
@@ +323,3 @@
+  // cleanups unecessary ranges to finish
+  coalesceRanges(ChangedRanges);
Guillaume Papin wrote:
> Maybe correct the mistakes in this comment or simply remove it since the code that follows is self-explanatory.
I've fixed this and several other comments that got copy-pasted from clang-modernizer.

Comment at: clang-apply-replacements/lib/Tooling/ApplyReplacements.cpp:328-330
@@ +327,5 @@
+void reformatRanges(const llvm::StringRef FileName, const RangeVec &Ranges,
+                    clang::SourceManager &SM, clang::format::FormatStyle Style,
+                    std::vector<tooling::Replacement> &Replacements) {
+  const clang::FileEntry *Entry = SM.getFileManager().getFile(FileName);
Guillaume Papin wrote:
> nit: I think we can get rid of the extra qualifications `clang::` and `llvm::`.
Actually, there's this bug in doxygen that causes it not to be able to match a function definition with it's implementation if we don't fully spell out the namespaces even though there's a using declaration.  You should find that only the function prototypes use unnecessary namespaces. Other code, or file local functions should not have unnecessary names.

Comment at: clang-apply-replacements/tool/ClangApplyReplacementsMain.cpp:145
@@ +144,3 @@
+  format::FormatStyle FormatStyle;
+  if (FormatStyleOpt.getNumOccurrences() > 0) {
+    if (!handleFormatStyle(argv[0], FormatStyle, Diagnostics))
Guillaume Papin wrote:
> This line is redundant with `handleFormatStyle()`'s first line.
This test is actually for a different purpose but I changed the post condition of `handleFormatStyle()` and now format option handling is self contained.

Comment at: clang-apply-replacements/tool/ClangApplyReplacementsMain.cpp:213-221
@@ +212,11 @@
+    assert(Entry && "expected an existing file");
+    FileID ID = FormattingSM.translateFile(Entry);
+    const RewriteBuffer *FormattedBuffer = 0;
+    if (!ID.isInvalid())
+      FormattedBuffer = FormattingRewriter.getRewriteBufferFor(ID);
+    if (FormattedBuffer)
+      FormattedBuffer->write(FileStream);
+    else
+      BufferI->second.write(FileStream);
+  }
Guillaume Papin wrote:
> Eventually:
> ```
>   const RewriteBuffer *Buffer = &BufferI->second;
>   FileID ID = FormattingSM.translateFile(Entry);
>   if (!ID.isInvalid())
>     Buffer = FormattingRewriter.getRewriteBufferFor(ID);
>   Buffer->write(FileStream);
> ```
This is not the same. `getRewriteBufferFor()` may return `NULL` if a buffer wasn't changed.

Comment at: test/clang-apply-replacements/format.cpp:3
@@ +2,3 @@
+// yes.cpp requires formatting after replacements are applied. no.cpp does not.
Guillaume Papin wrote:
> Is the no.cpp test really needed?
Yes. It tests for a bug that was recently found in the migrator. If a file is changed but not formatted, it should still be written to disk. I'll update the comments.


More information about the cfe-commits mailing list