2015-05-05 10 views
8

clang-format ha 2 opzioni chiamate BinPackParameters e BinPackArguments. Sembrano controllare il modo in cui le dichiarazioni di funzione e le chiamate di funzione sono rientrate.BinPackArguments in formato clang non funziona come previsto

BinPackParameters sembra fornire il risultato previsto per una dichiarazione di funzione ma BinPackArguments non sembra funzionare come ci si aspetterebbe per una chiamata di funzione.

Ecco un semplice file di test:

#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); 
} 

e questo è il modo in cui viene formattato:

#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); 
} 

Il mio file .clang-format è la seguente:

--- 
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 

mio clang- la versione in formato è: 3.6.0 (tags/RELEASE_360/final)

Sia con BinPackParameters sia con BinPackArguments in modo falso, mi sarei aspettato di ottenere lo stesso rientro per la chiamata di funzione che sto ottenendo per la dichiarazione di funzione.

Qualche idea su cosa sto facendo male?

risposta

1

Provare a impostare ColumnLimit su 0. Sembra che questa opzione "sovrascriva" o abbia una priorità più elevata rispetto alle opzioni BinPackParameters e BinPackArguments.

+2

Grazie ma con 'ColumnLimit' 0 non vi è alcun cambiamento nello stile poiché nessuna riga può mai essere considerata troppo grande per aver bisogno di essere interrotta. – Lefteris

+0

Questo ha funzionato davvero per me. "Un limite di colonna pari a 0 significa che non vi è alcun limite di colonne, in questo caso il formato clang rispetterà le decisioni di interruzione di riga all'interno delle istruzioni a meno che non siano in contraddizione con altre regole". http://clang.llvm.org/docs/ClangFormatStyleOptions.html – cs01

+1

C'è una soluzione per questo? Ho anche messo un bug su LLVM riguardo questo problema, perché non posso usare clang-format con questo bug orribile: https://bugs.llvm.org/show_bug.cgi?id=35968 – Taw

0

BinPack * le opzioni impostate su false costringono i parametri/argomenti a essere tutti su una riga o su una riga separata. Entrambi i casi sono consentiti, ma non si mischiano, ad es. due parametri su una riga e il resto su un'altra linea non è consentito.

clang-format sembra scegliere il formato all-on-one vs. each-on-separate-line individualmente per ogni caso.

1

Non penso che tu stia facendo qualcosa di sbagliato. Quello che succede è che il formato clang si rende conto che la linea in cui si chiama la funzione è più lunga del limite della colonna (80 caratteri nelle impostazioni). Il tuo AlignAfterOpenBracket è impostato su false, quindi il formato clang pone gli argomenti su una nuova riga (nota che AlignAfterOpenBracket ha ottenuto ulteriori possibilità nelle versioni successive di clang-format).

aver impostato entrambi BinPack... impostazioni falso, tuttavia v'è un'impostazione aggiuntiva che controlla la dichiarazione di funzione vs la chiamata di funzione, AllowAllParametersOfDeclarationOnNextLine (insieme al falso nel tuo esempio). Per la dichiarazione di funzione, questo farà sì che tutti i parametri siano su linee separate se non si adattano sulla stessa riga del nome della funzione. Per la chiamata di funzione non ci sono impostazioni corrispondenti.

Nel tuo caso, gli argomenti che hai assegnato alla funzione sono posizionati sulla riga successiva dopo il nome della funzione. La lunghezza della seconda riga è < 80, quindi clang-format non fa nulla di più con esso. Se la riga degli argomenti sarebbe stata più lunga del limite della colonna, il formato clang li avrebbe posizionati su righe separate.

Quindi la risposta è che dalla versione 3.9 non è possibile configurare il formato clang per posizionare ogni argomento su una riga separata se si adattano a una riga.

Problemi correlati