6
votes

clang-format: pause sur les arguments de fonction au lieu des qualificateurs de fonction (noexcept)

Je recherche un moyen de formater le code C ++ ci-dessous avec le format clang (version 9.0.0) de telle sorte que les définitions de fonction qui dépassent la limite de 80 colonnes soient brisées après les déclarations d'argument au lieu des qualificateurs de fonction C ++ comme noexcept :

---
BasedOnStyle: LLVM

AlignAfterOpenBracket: Align
AllowAllArgumentsOnNextLine: 'true'
AllowAllConstructorInitializersOnNextLine: 'true'
AllowAllParametersOfDeclarationOnNextLine: 'true'
AllowShortCaseLabelsOnASingleLine: 'false'
AllowShortFunctionsOnASingleLine: Empty
AllowShortLambdasOnASingleLine: Empty
AlwaysBreakTemplateDeclarations: 'Yes'
BinPackArguments: 'true'
BinPackParameters: 'true'
BreakConstructorInitializers: BeforeComma
BreakConstructorInitializersBeforeComma: 'true'
ConstructorInitializerIndentWidth: 2
FixNamespaceComments: 'true'
IndentCaseLabels: 'true'
IndentPPDirectives: AfterHash
PenaltyBreakAssignment: 1000
PenaltyBreakBeforeFirstCallParameter: 50
PointerAlignment: Left
...

L'extrait ci-dessus montre mon code formaté avec le style par défaut LLVM et le code ci-dessous est celui que je veux avoir après un formatage approprié:

void scheduler::stop_mark(service& current,
                          service const& stopped) const noexcept {
  // ...
}

La différence entre les deux extraits est que la ligne est interrompue après le service& current, au lieu de noexcept .

Ce comportement est reproductible lors de l'utilisation du style par défaut LLVM mais j'utilise les options ci-dessous pour référence:

void scheduler::stop_mark(service &current, service const &stopped) const
    noexcept {
  // ...
}

Est-il possible d'obtenir un tel formatage via le format clang?

J'ai déjà inspecté toutes les options possibles sur https://zed0.co.uk/clang-format-configurator/ et je n'ai pas trouvé l'option de format clang correspondante.


1 commentaires

FWIW, il semble traiter l'entrée entre parenthèses (ex: param decl) comme une unité, ne se divise pas lors de la correspondance des parens, c'est-à-dire que ( et ) sont sur la même ligne dans la limite des colonnes.


3 Réponses :


3
votes

Je suis d'accord qu'aucune combinaison de règles n'obtiendra le résultat souhaité, mais il existe un moyen de le forcer lorsque vous repérez des choses comme celle-ci.

Ajoutez un commentaire de ligne (peut être vide) après votre premier paramètre. clang-format alignera alors vos paramètres pour vous.

void scheduler::stop_mark(service& current, //
                          service const& stopped) const noexcept {
  // ...
}


1 commentaires

Vous pouvez justifier de ne pas attribuer de points comme bon vous semble. J'aurais préféré le silence, personnellement. Cela ne change rien au fait qu'il ne semble pas y avoir de configuration qui fasse ce que vous voulez.



0
votes

À ma connaissance, vous ne pouvez pas faire cela.

Ma première pensée était de définir BinPackParameters sur false , mais il semble que le clang-format ait une préférence pour interrompre les qualificateurs de fonction, même dans ce cas.


0 commentaires

2
votes

Pour ce que ça vaut, il semble que clang-format 10.0.1 fasse ce que vous voulez:

$> clang-format --version
clang-format version 10.0.1 (Fedora 10.0.1-3.fc32)
$> echo " void scheduler::stop_mark(service &current, service const &stopped) const noexcept { /* ... */ }" | clang-format --style=LLVM
void scheduler::stop_mark(service &current,
                          service const &stopped) const noexcept { /* ... */
}



1 commentaires

Oui, vous avez raison, il semble que cela ait été corrigé dans l'une des dernières versions de LLVM