2015-05-05 2 views
8

Clang-Format verfügt über 2 Optionen BinPackParameters und BinPackArguments. Sie scheinen zu steuern, wie Funktionsdeklarationen und Funktionsaufrufe eingerückt werden.Clang-Format BinPackArguments funktioniert nicht wie erwartet

BinPackParameters scheint das erwartete Ergebnis für eine Funktionsdeklaration zu liefern, aber BinPackArguments scheint nicht zu funktionieren, wie man es für einen Funktionsaufruf erwarten würde.

Hier ist ein einfaches Testdatei:

#include <stdbool.h> 

void function_with_a_huge_name_that_should_just_not_be(unsigned int a, char *b, unsigned int c, unsigned int d, unsigned int e) 
{ 
    return; 
} 

int main() 
{ 
    function_with_a_huge_name_that_should_just_not_be(13, "bb", 1234234, 4324324, 2355345); 
} 

Und das ist, wie es formatiert ist:

#include <stdbool.h> 

void function_with_a_huge_name_that_should_just_not_be(unsigned int a, 
    char *b, 
    unsigned int c, 
    unsigned int d, 
    unsigned int e) 
{ 
    return; 
} 

int main() 
{ 
    function_with_a_huge_name_that_should_just_not_be(
     13, "bb", 1234234, 4324324, 2355345); 
} 

Meine .clang-format Datei ist wie folgt:

--- 
AccessModifierOffset: -2 
AlignAfterOpenBracket: false 
AlignEscapedNewlinesLeft: false 
AlignOperands: true 
AlignTrailingComments: true 
AllowAllParametersOfDeclarationOnNextLine: false 
AllowShortBlocksOnASingleLine: false 
AllowShortCaseLabelsOnASingleLine: false 
AllowShortIfStatementsOnASingleLine: false 
AllowShortLoopsOnASingleLine: false 
AllowShortFunctionsOnASingleLine: Inline 
AlwaysBreakAfterDefinitionReturnType: false 
AlwaysBreakBeforeMultilineStrings: false 
AlwaysBreakTemplateDeclarations: false 
BinPackParameters: false 
BinPackArguments: false 
BreakBeforeBinaryOperators: None 
BreakBeforeBraces: Linux 
BreakBeforeTernaryOperators: true 
BreakConstructorInitializersBeforeComma: true 
ColumnLimit:  80 
CommentPragmas: '^ IWYU pragma:' 
ConstructorInitializerAllOnOneLineOrOnePerLine: true 
ConstructorInitializerIndentWidth: 4 
ContinuationIndentWidth: 4 
Cpp11BracedListStyle: false 
DerivePointerAlignment: false 
IndentCaseLabels: false 
IndentWidth:  4 
IndentWrappedFunctionNames: false 
IndentFunctionDeclarationAfterType: false 
KeepEmptyLinesAtTheStartOfBlocks: false 
Language:  Cpp 
MaxEmptyLinesToKeep: 2 
NamespaceIndentation: None 
ObjCBlockIndentWidth: 2 
ObjCSpaceAfterProperty: false 
ObjCSpaceBeforeProtocolList: true 
PenaltyBreakBeforeFirstCallParameter: 19 
PenaltyBreakComment: 300 
PenaltyBreakString: 1000 
PenaltyBreakFirstLessLess: 120 
PenaltyExcessCharacter: 1000000 
PenaltyReturnTypeOnItsOwnLine: 60 
PointerAlignment: Right 
SpaceAfterCStyleCast: false 
SpaceBeforeAssignmentOperators: true 
SpaceBeforeParens: ControlStatements 
SpaceInEmptyParentheses: false 
SpacesBeforeTrailingComments: 2 
SpacesInAngles: false 
SpacesInCStyleCastParentheses: false 
SpacesInContainerLiterals: false 
SpacesInParentheses: false 
SpacesInSquareBrackets: false 
Standard:  Auto 
TabWidth:  4 
UseTab:   Never 

Mein clang- Formatversion ist: 3.6.0 (tags/RELEASE_360/final)

Mit beiden BinPackParameters und BinPackArguments ist falsch Ich hätte erwartet, dass die gleiche Einrückung für den Funktionsaufruf erhalten, wie ich für die Funktionsdeklaration bekomme.

Irgendeine Idee, was ich falsch mache?

Antwort

1

Versuchen Sie, ColumnLimit auf 0 zu setzen. Es sieht so aus, als ob diese Option "überschreibt" oder eine höhere Priorität als BinPackParameters und BinPackArguments Optionen hat.

+2

Danke, aber mit 'ColumnLimit' 0 gibt es keine Veränderung im Styling, da keine Linie jemals als zu groß angesehen werden kann, um brechen zu müssen. – Lefteris

+0

Das hat wirklich für mich funktioniert. "Ein Spaltenlimit von 0 bedeutet, dass es kein Spaltenlimit gibt. In diesem Fall berücksichtigt das Clam-Format die Zeilentrennungsentscheidungen der Eingabe innerhalb von Anweisungen, sofern sie nicht anderen Regeln widersprechen." http://clang.llvm.org/docs/ClangFormatStyleOptions.html – cs01

+1

Gibt es eine Lösung dafür? Ich habe auch einen Fehler in LLVM bezüglich dieses Problems gemacht, weil ich das clang-Format mit diesem schrecklichen Fehler nicht benutzen kann: https://bugs.llvm.org/show_bug.cgi?id=35968 – Taw

0

BinPack * -Optionen, die auf false gesetzt sind, erzwingen, dass Parameter/Argumente entweder alle in einer Zeile oder jede in einer separaten Zeile stehen. Beide Fälle sind erlaubt, aber nicht gemischt, z. zwei Parameter in einer Zeile und der Rest in einer anderen Zeile ist nicht erlaubt.

Das clang-Format scheint für jeden Fall das Format "Alles auf einer Zeile" und das Format "Jede Zeile auf separater Zeile" auszuwählen.

1

Ich glaube nicht, dass Sie etwas falsch machen. Was passiert, ist, dass das clang-Format erkennt, dass die Zeile, in der Sie die Funktion aufrufen, länger ist als Ihr Spaltenlimit (80 Zeichen in Ihren Einstellungen). Ihre AlignAfterOpenBracket ist auf false gesetzt, so Clang-Format platziert die Argumente in einer neuen Zeile (Beachten Sie, dass AlignAfterOpenBracket zusätzliche Möglichkeiten in späteren Versionen von Clang-Format gewonnen hat).

Sie haben beide BinPack... Einstellungen auf false festgelegt, jedoch gibt es eine zusätzliche Einstellung, die die Funktionsdeklaration gegenüber dem Funktionsaufruf AllowAllParametersOfDeclarationOnNextLine steuert (in Ihrem Beispiel auf false gesetzt). Bei der Funktionsdeklaration werden alle Parameter in separaten Zeilen angezeigt, wenn sie nicht in die gleiche Zeile wie der Funktionsname passen. Für den Funktionsaufruf gibt es keine entsprechende Einstellung.

In Ihrem Fall werden die Argumente, die Sie der Funktion geben, in der nächsten Zeile nach dem Funktionsnamen platziert. Die Länge der zweiten Zeile ist < 80, so dass das clang-Format nichts mehr damit macht. Wenn die Argumentenzeile länger als das Spaltenlimit gewesen wäre, hätte das Clang-Format sie in separaten Zeilen platziert.

Die Antwort ist, dass es ab Version 3.9 keine Möglichkeit gibt, das clang-Format so zu konfigurieren, dass jedes Argument in einer separaten Zeile platziert wird, wenn sie in eine Zeile passen.

Verwandte Themen