Fix layouting of single-line-comments preceded by an escaped newline.

Previously, we'd format
  int i;\
  // comment
as
  int i; // comment

The problem is that the escaped newline is part of the next token, and
thus the raw token text of the comment doesn't start with "//".

llvm-svn: 171713
This commit is contained in:
Manuel Klimek
2013-01-07 08:54:53 +00:00
parent 096f544edc
commit c74d292229
2 changed files with 10 additions and 7 deletions

View File

@@ -520,8 +520,8 @@ private:
class TokenAnnotator {
public:
TokenAnnotator(const UnwrappedLine &Line, const FormatStyle &Style,
SourceManager &SourceMgr)
: Line(Line), Style(Style), SourceMgr(SourceMgr) {
SourceManager &SourceMgr, Lexer &Lex)
: Line(Line), Style(Style), SourceMgr(SourceMgr), Lex(Lex) {
}
/// \brief A parser that gathers additional information about tokens.
@@ -865,10 +865,9 @@ private:
} else if (isBinaryOperator(Line.Tokens[i])) {
Annotation.Type = TokenAnnotation::TT_BinaryOperator;
} else if (Tok.Tok.is(tok::comment)) {
// FIXME: Use Lexer::getSpelling(Tok, SourceMgr, LangOpts, bool*);
StringRef Data(SourceMgr.getCharacterData(Tok.Tok.getLocation()),
Tok.Tok.getLength());
if (Data.startswith("//"))
std::string Data(
Lexer::getSpelling(Tok.Tok, SourceMgr, Lex.getLangOpts()));
if (StringRef(Data).startswith("//"))
Annotation.Type = TokenAnnotation::TT_LineComment;
else
Annotation.Type = TokenAnnotation::TT_BlockComment;
@@ -1012,6 +1011,7 @@ private:
const UnwrappedLine &Line;
FormatStyle Style;
SourceManager &SourceMgr;
Lexer &Lex;
std::vector<TokenAnnotation> Annotations;
};
@@ -1142,7 +1142,7 @@ private:
LineRange.getBegin()))
continue;
TokenAnnotator Annotator(TheLine, Style, SourceMgr);
TokenAnnotator Annotator(TheLine, Style, SourceMgr, Lex);
if (!Annotator.annotate())
break;
UnwrappedLineFormatter Formatter(

View File

@@ -290,6 +290,9 @@ TEST_F(FormatTest, UnderstandsSingleLineComments) {
verifyFormat(
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
" bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb; // Trailing comment");
EXPECT_EQ("int i; // single line trailing comment",
format("int i;\\\n// single line trailing comment"));
}
TEST_F(FormatTest, UnderstandsMultiLineComments) {