Refactor clang-format's formatter.
authorManuel Klimek <klimek@google.com>
Tue, 12 May 2015 09:23:57 +0000 (09:23 +0000)
committerManuel Klimek <klimek@google.com>
Tue, 12 May 2015 09:23:57 +0000 (09:23 +0000)
commit3d3ea84a4f8fcdf1f4c17b80c10389b92b6ad502
tree119ae2caf435e20d2a0620cee16a02dc6d6d55fc
parent108c325d6edca86aec9a86132bb7c657471ab40c
Refactor clang-format's formatter.

Summary:
a) Pull out a class LevelIndentTracker whose responsibility is to keep track
   of the indent of levels across multiple annotated lines.
b) Put all responsibility for merging lines into the LineJoiner; make the
   LineJoiner iterate over the lines so we never operate on a line that might
   be merged later; this makes the interface safer to use.
c) Move formatting of the end-of-file whitespace into formatFirstToken.

Fix bugs that became obvious after the refactoring:
1. We would not format lines with offsets correctly inside nested blocks if
   only the outer expression was affected:
   int x = s({ // clang-format only this line
     class X {
       public:
    // ^ this starts at the non-modified indnent level; previously we would
    //   not fix this, now we correctly outdent it.
       void f();
     };
   });
2. We would incorrectly align comments across lines that do not have comments
   for lines with nested blocks:
   int expression; // with comment
   int x = s({
     int y; // comment
     int z; // we would incorrectly align this comment with the comment on
            // 'expression'
   });

llvm-svn: 237104
clang/lib/Format/UnwrappedLineFormatter.cpp
clang/lib/Format/UnwrappedLineFormatter.h
clang/unittests/Format/FormatTest.cpp