Author: alexfh Date: Fri Mar 15 08:42:02 2013 New Revision: 177153 URL: http://llvm.org/viewvc/llvm-project?rev=177153&view=rev Log: Indent all lines in a multi-line comment by the same amount.
Summary: Do this to avoid spoling nicely formatted multi-line comments (e.g. with code examples or similar stuff). Reviewers: djasper Reviewed By: djasper CC: cfe-commits, klimek Differential Revision: http://llvm-reviews.chandlerc.com/D544 Modified: cfe/trunk/lib/Format/Format.cpp cfe/trunk/unittests/Format/FormatTest.cpp Modified: cfe/trunk/lib/Format/Format.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Format/Format.cpp?rev=177153&r1=177152&r2=177153&view=diff ============================================================================== --- cfe/trunk/lib/Format/Format.cpp (original) +++ cfe/trunk/lib/Format/Format.cpp Fri Mar 15 08:42:02 2013 @@ -193,36 +193,34 @@ public: } private: - void indentBlockComment(const FormatToken &Tok, int BaseIndent) { + void indentBlockComment(const FormatToken &Tok, int Indent) { SourceLocation TokenLoc = Tok.Tok.getLocation(); + int IndentDelta = Indent - SourceMgr.getSpellingColumnNumber(TokenLoc) + 1; const char *Start = SourceMgr.getCharacterData(TokenLoc); const char *Current = Start; const char *TokEnd = Current + Tok.TokenLength; + llvm::SmallVector<SourceLocation, 16> LineStarts; while (Current < TokEnd) { if (*Current == '\n') { ++Current; - SourceLocation Loc = TokenLoc.getLocWithOffset(Current - Start); - int Indent = BaseIndent; - int Spaces = 0; - while (Current < TokEnd && *Current == ' ') { - ++Spaces; - ++Current; - } - if (Current < TokEnd && *Current == '*') - ++Indent; - else - Indent += 3; - - if (Spaces < Indent) - Replaces.insert(tooling::Replacement( - SourceMgr, Loc, 0, std::string(Indent - Spaces, ' '))); - else if (Spaces > Indent) - Replaces.insert( - tooling::Replacement(SourceMgr, Loc, Spaces - Indent, "")); + LineStarts.push_back(TokenLoc.getLocWithOffset(Current - Start)); + // If we need to outdent the line, check that it's indented enough. + for (int i = 0; i < -IndentDelta; ++i, ++Current) + if (Current >= TokEnd || *Current != ' ') + return; } else { ++Current; } } + + for (size_t i = 0; i < LineStarts.size(); ++i) { + if (IndentDelta > 0) + Replaces.insert(tooling::Replacement(SourceMgr, LineStarts[i], 0, + std::string(IndentDelta, ' '))); + else if (IndentDelta < 0) + Replaces.insert( + tooling::Replacement(SourceMgr, LineStarts[i], -IndentDelta, "")); + } } std::string getNewLineText(unsigned NewLines, unsigned Spaces) { Modified: cfe/trunk/unittests/Format/FormatTest.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/Format/FormatTest.cpp?rev=177153&r1=177152&r2=177153&view=diff ============================================================================== --- cfe/trunk/unittests/Format/FormatTest.cpp (original) +++ cfe/trunk/unittests/Format/FormatTest.cpp Fri Mar 15 08:42:02 2013 @@ -619,14 +619,6 @@ TEST_F(FormatTest, AlignsMultiLineCommen " * comment.\n" " */\n" " void f() {}")); - EXPECT_EQ("/*\n" - " A comment.\n" - " */\n" - "void f() {}", - format(" /*\n" - " A comment.\n" - " */\n" - " void f() {}")); EXPECT_EQ("class C {\n" " /*\n" " * Another multi-line\n" @@ -641,6 +633,22 @@ TEST_F(FormatTest, AlignsMultiLineCommen " */\n" "void f() {}\n" "};")); + EXPECT_EQ("/*\n" + " 1. This is a comment with non-trivial formatting.\n" + " 1.1. We have to indent/outdent all lines equally\n" + " 1.1.1. to keep the formatting.\n" + " */", + format(" /*\n" + " 1. This is a comment with non-trivial formatting.\n" + " 1.1. We have to indent/outdent all lines equally\n" + " 1.1.1. to keep the formatting.\n" + " */")); + EXPECT_EQ("/*\n" + " Don't try to outdent if there's not enough inentation.\n" + " */", + format(" /*\n" + " Don't try to outdent if there's not enough inentation.\n" + " */")); } TEST_F(FormatTest, CommentsInStaticInitializers) { _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
