Da un po 'di tempo mantengo uno script ad hoc per verificare lo stile del codice rispetto alle linee guida del nostro progetto.
Sono a conoscenza di AStyle / Uncrustify e li ho usati, ma sono i migliori per una pulizia in codice una tantum, ma non è pratico eseguire tutto il codice attraverso un processo automatico dopo ogni commit.
Per spiegare il problema un po 'di più, sì - abbiamo una documentazione in stile codice, ma gli sviluppatori non sempre seguono esattamente, e non è proprio bello dare loro una posta personale ogni volta che fanno qualche piccolo cambiamento che va contro qualche convenzione.
Quindi ho preso l'approccio per gestire questo tipo di avvertimenti del compilatore, segnalare incoerenze ma lasciare che lo sviluppatore risolva (alcuni di voi potrebbero avere dimestichezza con il controllore di stile pep8 di Python). Una volta ogni tanto facciamo pulizie di stile.
In generale sono molto contento del risultato (a differenza della maggior parte degli strumenti di controllo dello stile), ottieni molta flessibilità - così puoi scegliere dove essere severi e dove essere rilassato rispetto alle convenzioni (evita troppi falsi anche i positivi sono importanti).
Attualmente sto usando Python e Pygments per analizzare il codice sorgente C (anche alcuni C ++ ma principalmente C) e poi il mio script per verificare i risultati con token che soddisfano le nostre convenzioni. Funziona abbastanza bene, non ho bisogno dell'AST completo che puoi ottenere con GCC o Clang per esempio, semplicemente sapendo se il testo è un commento, una stringa, una punteggiatura, un preprocessore ... ecc. È sufficiente (cosa si otterrebbe dalla sintassi evidenziazione o un tokenizzatore di origine).
Ma alla fine ho dovuto scrivere alcune funzioni di utilità per la fonte:
- estrai il corpo di un blocco tra parentesi.
- trova le parentesi corrispondenti.
- identifica i cast.
- controllo degli spazi bianchi attorno alla punteggiatura.
... niente di veramente avanzato.
Le convenzioni esatte non sono probabilmente così importanti, ma per un esempio qui ci sono alcuni controlli:
- Posizionamento di parentesi graffe per 'if' assegni di controllo suddivisi in più righe.
- Posizionamento di
break
in un'istruzioneswitch
. - Spazi attorno a operatori, parentesi, chiamate alle funzioni, dopo le virgole.
- Indentazione per istruzioni multilinea if
- Consistenza delle rientranze.
A questo punto sarei interessato ad abbandonare le mie proprie funzioni di utilità, ma ho ancora uno script che controlla lo stile del codice, se c'è qualcos'altro ben mantenuto che risolve problemi simili.
Sarei sorpreso se non ci fossero altre persone che fanno progetti simili per mantenere uno stile sorgente coerente in questo modo, quindi sono interessato a conoscere eventuali alternative disponibili.
Domanda:
Considerando il flusso di lavoro che ho descritto, chiunque può citare le proprie esperienze utilizzando un flusso di lavoro simile, ci sono progetti che già lo fanno, sono interessato a vedere un precedente.