From: Alexander Kornienko Date: Fri, 27 Sep 2013 09:45:40 +0000 (+0000) Subject: Correctly indent with tabs when whitespace starts from the column not divisible by... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=acf8e90b22cfea07ba2edeaa5101160eda8dc82c;p=clang 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 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@191497 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Format/WhitespaceManager.cpp b/lib/Format/WhitespaceManager.cpp index c0a3f5d60b..50ff8582d3 100644 --- a/lib/Format/WhitespaceManager.cpp +++ b/lib/Format/WhitespaceManager.cpp @@ -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, ' ')); } diff --git a/lib/Format/WhitespaceManager.h b/lib/Format/WhitespaceManager.h index 2c58216d1c..642b5b682b 100644 --- a/lib/Format/WhitespaceManager.h +++ b/lib/Format/WhitespaceManager.h @@ -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 Changes; SourceManager &SourceMgr; diff --git a/unittests/Format/FormatTest.cpp b/unittests/Format/FormatTest.cpp index d54c0421fc..c5fa70c98e 100644 --- a/unittests/Format/FormatTest.cpp +++ b/unittests/Format/FormatTest.cpp @@ -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"