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:
- 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(); }; });
- 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' });
If the implementation isn't in the header anymore, this might deserve a small comment.