From 6cf581436e9e59a18f6a362027a69eaaa9b67597 Mon Sep 17 00:00:00 2001 From: Manuel Klimek Date: Mon, 7 Jan 2013 08:54:53 +0000 Subject: [PATCH] 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 "//". git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@171713 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Format/Format.cpp | 14 +++++++------- unittests/Format/FormatTest.cpp | 3 +++ 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/lib/Format/Format.cpp b/lib/Format/Format.cpp index a6beff0e4f..35c1e403c6 100644 --- a/lib/Format/Format.cpp +++ b/lib/Format/Format.cpp @@ -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 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( diff --git a/unittests/Format/FormatTest.cpp b/unittests/Format/FormatTest.cpp index 3e672ae5a3..27ca53c1ea 100644 --- a/unittests/Format/FormatTest.cpp +++ b/unittests/Format/FormatTest.cpp @@ -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) { -- 2.40.0