diff options
author | Alexander Kornienko <alexfh@google.com> | 2013-03-14 16:10:54 +0000 |
---|---|---|
committer | Alexander Kornienko <alexfh@google.com> | 2013-03-14 16:10:54 +0000 |
commit | f753615897c86928517e48e4d106e669d59618c5 (patch) | |
tree | a0dce4f13a55008ecbb6f45c9dabf3b45324e9f6 /lib/Format/Format.cpp | |
parent | bfa1edd8247b80e951a570ff2486fe5fa9898c41 (diff) |
Multi-line comment alignment
Summary:
Aligns continuation lines of multi-line comments to the base
indentation level +1:
class A {
/*
* test
*/
void f() {}
};
The first revision is work in progress. The implementation is not yet complete.
Reviewers: djasper
Reviewed By: djasper
CC: cfe-commits, klimek
Differential Revision: http://llvm-reviews.chandlerc.com/D541
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@177080 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Format/Format.cpp')
-rw-r--r-- | lib/Format/Format.cpp | 57 |
1 files changed, 45 insertions, 12 deletions
diff --git a/lib/Format/Format.cpp b/lib/Format/Format.cpp index ab895c7d1c..777d5e8f72 100644 --- a/lib/Format/Format.cpp +++ b/lib/Format/Format.cpp @@ -128,16 +128,14 @@ public: if (Tok.Parent != NULL || !Comments.empty()) { if (Style.ColumnLimit >= Spaces + WhitespaceStartColumn + Tok.FormatTok.TokenLength) { - Comments.push_back(StoredComment()); - Comments.back().Tok = Tok.FormatTok; - Comments.back().Spaces = Spaces; - Comments.back().NewLines = NewLines; - if (NewLines == 0) - Comments.back().MinColumn = WhitespaceStartColumn + Spaces; - else - Comments.back().MinColumn = Spaces; - Comments.back().MaxColumn = - Style.ColumnLimit - Tok.FormatTok.TokenLength; + StoredComment Comment; + Comment.Tok = Tok.FormatTok; + Comment.Spaces = Spaces; + Comment.NewLines = NewLines; + Comment.MinColumn = + NewLines > 0 ? Spaces : WhitespaceStartColumn + Spaces; + Comment.MaxColumn = Style.ColumnLimit - Tok.FormatTok.TokenLength; + Comments.push_back(Comment); return; } } @@ -146,6 +144,10 @@ public: // If this line does not have a trailing comment, align the stored comments. if (Tok.Children.empty() && !isTrailingComment(Tok)) alignComments(); + + if (Tok.Type == TT_BlockComment) + indentBlockComment(Tok.FormatTok, Spaces); + storeReplacement(Tok.FormatTok, getNewLineText(NewLines, Spaces)); } @@ -191,6 +193,38 @@ public: } private: + void indentBlockComment(const FormatToken &Tok, int BaseIndent) { + SourceLocation TokenLoc = Tok.Tok.getLocation(); + const char *Start = SourceMgr.getCharacterData(TokenLoc); + const char *Current = Start; + const char *TokEnd = Current + Tok.TokenLength; + 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, "")); + } else { + ++Current; + } + } + } + std::string getNewLineText(unsigned NewLines, unsigned Spaces) { return std::string(NewLines, '\n') + std::string(Spaces, ' '); } @@ -227,8 +261,7 @@ private: unsigned MinColumn = 0; unsigned MaxColumn = UINT_MAX; comment_iterator Start = Comments.begin(); - for (comment_iterator I = Comments.begin(), E = Comments.end(); I != E; - ++I) { + for (comment_iterator I = Start, E = Comments.end(); I != E; ++I) { if (I->MinColumn > MaxColumn || I->MaxColumn < MinColumn) { alignComments(Start, I, MinColumn); MinColumn = I->MinColumn; |