зеркало из https://github.com/microsoft/clang-1.git
Penalize tokens with a lower parenthesis level than the start of the line.
This prevents formattings like this (assuming "parameter" doesn't fit the line): bool f = someFunction() && someFunctionWithParam( parameter) && someOtherFunction(); Here, "parameter" - the start of line 2 - has a parenthesis level of 2, but there are subsequent tokens ("&&" and "someOtherFunction") with a lower level. This is bad for readability as "parameter" hides "someOtherFunction". With this patch, this changes to: bool f = someFunction() && someFunctionWithParam(parameter) && someOtherFunction(); git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@171038 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
cf225b67e6
Коммит
a4974cf6ae
|
@ -83,6 +83,7 @@ FormatStyle getGoogleStyle() {
|
|||
|
||||
struct OptimizationParameters {
|
||||
unsigned PenaltyIndentLevel;
|
||||
unsigned PenaltyLevelDecrease;
|
||||
};
|
||||
|
||||
class UnwrappedLineFormatter {
|
||||
|
@ -95,6 +96,7 @@ public:
|
|||
Annotations(Annotations), Replaces(Replaces),
|
||||
StructuralError(StructuralError) {
|
||||
Parameters.PenaltyIndentLevel = 15;
|
||||
Parameters.PenaltyLevelDecrease = 10;
|
||||
}
|
||||
|
||||
void format() {
|
||||
|
@ -110,6 +112,7 @@ public:
|
|||
State.FirstLessLess.push_back(0);
|
||||
State.ForLoopVariablePos = 0;
|
||||
State.LineContainsContinuedForLoopSection = false;
|
||||
State.StartOfLineLevel = 1;
|
||||
|
||||
// The first token has already been indented and thus consumed.
|
||||
moveStateToNextToken(State);
|
||||
|
@ -155,6 +158,9 @@ private:
|
|||
/// \brief The number of tokens already consumed.
|
||||
unsigned ConsumedTokens;
|
||||
|
||||
/// \brief The parenthesis level of the first token on the current line.
|
||||
unsigned StartOfLineLevel;
|
||||
|
||||
/// \brief The position to which a specific parenthesis level needs to be
|
||||
/// indented.
|
||||
std::vector<unsigned> Indent;
|
||||
|
@ -186,6 +192,8 @@ private:
|
|||
return Other.ConsumedTokens > ConsumedTokens;
|
||||
if (Other.Column != Column)
|
||||
return Other.Column > Column;
|
||||
if (Other.StartOfLineLevel != StartOfLineLevel)
|
||||
return Other.StartOfLineLevel > StartOfLineLevel;
|
||||
if (Other.Indent.size() != Indent.size())
|
||||
return Other.Indent.size() > Indent.size();
|
||||
for (int i = 0, e = Indent.size(); i != e; ++i) {
|
||||
|
@ -247,6 +255,8 @@ private:
|
|||
State.Column = State.Indent[ParenLevel];
|
||||
}
|
||||
|
||||
State.StartOfLineLevel = ParenLevel + 1;
|
||||
|
||||
if (Line.Tokens[0].Tok.is(tok::kw_for))
|
||||
State.LineContainsContinuedForLoopSection =
|
||||
Previous.Tok.isNot(tok::semi);
|
||||
|
@ -343,7 +353,7 @@ private:
|
|||
return Level;
|
||||
|
||||
if (Right.Tok.is(tok::arrow) || Right.Tok.is(tok::period))
|
||||
return 200;
|
||||
return 50;
|
||||
|
||||
return 3;
|
||||
}
|
||||
|
@ -375,6 +385,10 @@ private:
|
|||
if (NewLine) {
|
||||
CurrentPenalty += Parameters.PenaltyIndentLevel * State.Indent.size() +
|
||||
splitPenalty(State.ConsumedTokens - 1);
|
||||
} else {
|
||||
if (State.Indent.size() < State.StartOfLineLevel)
|
||||
CurrentPenalty += Parameters.PenaltyLevelDecrease *
|
||||
(State.StartOfLineLevel - State.Indent.size());
|
||||
}
|
||||
|
||||
addTokenToState(NewLine, true, State);
|
||||
|
|
|
@ -379,8 +379,9 @@ TEST_F(FormatTest, FormatsFunctionDefinition) {
|
|||
|
||||
TEST_F(FormatTest, FormatsAwesomeMethodCall) {
|
||||
verifyFormat(
|
||||
"SomeLongMethodName(SomeReallyLongMethod(CallOtherReallyLongMethod(\n"
|
||||
" parameter, parameter, parameter)), SecondLongCall(parameter));");
|
||||
"SomeLongMethodName(SomeReallyLongMethod(\n"
|
||||
" CallOtherReallyLongMethod(parameter, parameter, parameter)),\n"
|
||||
" SecondLongCall(parameter));");
|
||||
}
|
||||
|
||||
TEST_F(FormatTest, ConstructorInitializers) {
|
||||
|
@ -454,6 +455,13 @@ TEST_F(FormatTest, BreaksDesireably) {
|
|||
" aaaaaaaaaaa(aaaaaaaaa) || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
|
||||
" aaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
|
||||
" (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
|
||||
|
||||
verifyFormat(
|
||||
"{\n {\n {\n"
|
||||
" Annotation.SpaceRequiredBefore =\n"
|
||||
" Line.Tokens[i - 1].Tok.isNot(tok::l_paren) &&\n"
|
||||
" Line.Tokens[i - 1].Tok.isNot(tok::l_square);\n"
|
||||
" }\n }\n}");
|
||||
}
|
||||
|
||||
TEST_F(FormatTest, BreaksAccordingToOperatorPrecedence) {
|
||||
|
|
Загрузка…
Ссылка в новой задаче