Correctly indent with tabs when whitespace starts from the column not divisible by TabWidth.

Summary:
The width of the first inserted tab character depends on the initial
column, so we need to handle the first tab in a special manner.

Reviewers: klimek, djasper

Reviewed By: klimek

CC: cfe-commits

Differential Revision: http://llvm-reviews.chandlerc.com/D1763

llvm-svn: 191497
This commit is contained in:
Alexander Kornienko 2013-09-27 09:45:40 +00:00
parent 36c671e2c7
commit db4c21f994
3 changed files with 27 additions and 3 deletions

View File

@ -225,7 +225,7 @@ void WhitespaceManager::generateChanges() {
C.PreviousEndOfTokenColumn, C.EscapedNewlineColumn);
else
appendNewlineText(ReplacementText, C.NewlinesBefore);
appendIndentText(ReplacementText, C.Spaces);
appendIndentText(ReplacementText, C.Spaces, C.StartOfTokenColumn - C.Spaces);
ReplacementText.append(C.CurrentLinePrefix);
storeReplacement(C.OriginalWhitespaceRange, ReplacementText);
}
@ -264,10 +264,18 @@ void WhitespaceManager::appendNewlineText(std::string &Text, unsigned Newlines,
}
}
void WhitespaceManager::appendIndentText(std::string &Text, unsigned Spaces) {
void WhitespaceManager::appendIndentText(std::string &Text, unsigned Spaces,
unsigned WhitespaceStartColumn) {
if (!Style.UseTab) {
Text.append(std::string(Spaces, ' '));
} else {
unsigned FirstTabWidth =
Style.TabWidth - WhitespaceStartColumn % Style.TabWidth;
// Indent with tabs only when there's at least one full tab.
if (FirstTabWidth + Style.TabWidth <= Spaces) {
Spaces -= FirstTabWidth;
Text.append("\t");
}
Text.append(std::string(Spaces / Style.TabWidth, '\t'));
Text.append(std::string(Spaces % Style.TabWidth, ' '));
}

View File

@ -157,7 +157,8 @@ private:
void appendNewlineText(std::string &Text, unsigned Newlines,
unsigned PreviousEndOfTokenColumn,
unsigned EscapedNewlineColumn);
void appendIndentText(std::string &Text, unsigned Spaces);
void appendIndentText(std::string &Text, unsigned Spaces,
unsigned WhitespaceStartColumn);
SmallVector<Change, 16> Changes;
SourceManager &SourceMgr;

View File

@ -5760,6 +5760,20 @@ TEST_F(FormatTest, ConfigurableUseOfTab) {
Tab.IndentWidth = 8;
Tab.UseTab = true;
Tab.AlignEscapedNewlinesLeft = true;
EXPECT_EQ("if (aaaaaaaa && // q\n"
" bb)\t\t// w\n"
"\t;",
format("if (aaaaaaaa &&// q\n"
"bb)// w\n"
";",
Tab));
EXPECT_EQ("if (aaa && bbb) // w\n"
"\t;",
format("if(aaa&&bbb)// w\n"
";",
Tab));
verifyFormat("class X {\n"
"\tvoid f() {\n"
"\t\tsomeFunction(parameter1,\n"
@ -5843,6 +5857,7 @@ TEST_F(FormatTest, ConfigurableUseOfTab) {
" \t \t in multiple lines\t\n"
" \t */",
Tab));
Tab.UseTab = false;
EXPECT_EQ("/*\n"
" a\t\tcomment\n"