Fix comments before labels.

Before:
switch (...) {
  // a
  // b
// c
case first:
  break;
}

After:
switch (...) {
// a
// b
// c
case first:
  break;
}

llvm-svn: 179107
This commit is contained in:
Daniel Jasper 2013-04-09 17:46:55 +00:00
parent bbae991db6
commit b67cc423eb
2 changed files with 15 additions and 7 deletions

View File

@ -1396,14 +1396,21 @@ public:
deriveLocalStyle();
for (unsigned i = 0, e = AnnotatedLines.size(); i != e; ++i) {
Annotator.calculateFormattingInformation(AnnotatedLines[i]);
// Adapt level to the next line if this is a comment.
// FIXME: Can/should this be done in the UnwrappedLineParser?
if (i + 1 != e && AnnotatedLines[i].First.is(tok::comment) &&
AnnotatedLines[i].First.Children.empty() &&
AnnotatedLines[i + 1].First.isNot(tok::r_brace))
AnnotatedLines[i].Level = AnnotatedLines[i + 1].Level;
}
// Adapt level to the next line if this is a comment.
// FIXME: Can/should this be done in the UnwrappedLineParser?
const AnnotatedLine* NextNoneCommentLine = NULL;
for (unsigned i = AnnotatedLines.size() - 1; i > 0; --i) {
if (NextNoneCommentLine && AnnotatedLines[i].First.is(tok::comment) &&
AnnotatedLines[i].First.Children.empty())
AnnotatedLines[i].Level = NextNoneCommentLine->Level;
else
NextNoneCommentLine = AnnotatedLines[i].First.isNot(tok::r_brace)
? &AnnotatedLines[i]
: NULL;
}
std::vector<int> IndentForLevel;
bool PreviousLineWasTouched = false;
const AnnotatedToken *PreviousLineLastToken = 0;

View File

@ -432,6 +432,7 @@ TEST_F(FormatTest, FormatsSwitchStatement) {
" // Do nothing.\n"
"}");
verifyFormat("switch (x) {\n"
"// comment\n"
"// if 1, do f()\n"
"case 1:\n"
" f();\n"