2009-06-17 11 views
6

Ogni volta che eseguo un ciclo di commit in svn, esamino il diff quando scrivo i miei commenti. Ho pensato che sarebbe stato davvero bello mostrare la funzione effettiva in cui ho apportato le modifiche quando ho mostrato il diff.Ottenere svn diff per mostrare la funzione C++ durante il commit

Ho controllato this page, che ha indicato che l'opzione -p mostrerà la funzione C in cui si trova la modifica. Quando ho provato a utilizzare l'opzione -p con un codice C++, tuttavia, di solito restituisce l'identificatore di accesso (privato , pubblico, protetto, ecc.), che non è molto utile.

Ho notato che esiste un'opzione -F per diff che fa lo stesso di -p, ma accetta un'espressione regolare specificata dall'utente. Mi chiedevo: esiste una semplice espressione regolare per abbinare una funzione C++? Sembra che sarebbe tutto ciò che è necessario per farlo funzionare.

Mi piacerebbe passare un po 'di tempo a guardarlo da solo, ma il lavoro è in modalità Crunch e questo mi è sembrato qualcosa che molte persone avrebbero trovato utile, quindi ho pensato di pubblicarlo qui.

EDIT: Non sto cercando qualcosa che sia una regex di tipo slam-dunk-catch, ma qualcosa che potrebbe semplicemente trovare la definizione di funzione più vicina al di sopra della diff area mostrerebbe. Il fatto che non sarebbe neanche lontanamente perfetto, e un po 'buggy va bene per me. Fintanto che funziona nel modo giusto forse il 60% delle volte sarebbe un miglioramento significativo della produttività IMHO.

risposta

3

C'è una semplice regex per abbinare una funzione C++? No.

Esiste una regex (complessa) per abbinare un C++. Forse o potrebbe essere possibile scriverne uno.

Ma direi che le espressioni regolari non sono facilmente all'altezza di un compito del genere (se si desidera una sorta di corrispondenza con gli excat) né sono lo strumento giusto per tale compito.

Basta pensare a case come questo. Come gestiresti questa roba?

void (*function(int, void (*)(int)))(int); 

func1(int), func2(double); double func3(int); 

L'unica soluzione reale consiste nell'utilizzare un parser utilizzando yacc/lex. Quale per il tuo caso d'uso, naturalmente, non fa nulla.

Quindi, o metter su un po 'di regex incompleta che si inserisce la maggior parte delle funzioni di firme nel codice

+0

Hmmm ... Immagino che la soluzione sia più complessa di quanto pensassi. –

1

TortoiseSVN utilizza i seguenti regex per il supporto completamento automatico nella sua finestra impegnarsi per i file C++:

.h, .hpp, .hxx = ^\s*(?:class|struct)\s+([\w_]+)|\W([\w_]+)\(
.cpp, .c, .cxx = \W(([\w_]+)::([\w_]+))|\W([\w_]+)\(

Non so come precisa sono, però.

+0

Sono s ** t: ad es. 'void hallo() {' non è riconosciuto come firma della funzione – jitter

+0

Sembra che abbiano bisogno della dichiarazione dello spazio dei nomi, visto a :: in là. – Joey

+0

Ma non fornisco :) usando namespace std; – jitter

1

Non so di un'opzione in SVN che farà questo, e una soluzione basata su regex sarà probabilmente uno o più dei seguenti:

  • un incubo per codice e mantenere, con un sacco di casi particolari
  • diverse funzioni errate e mancanti valida C++

È necessario un qualche tipo di parser per questo. È tecnicamente possibile enumerare tutti i possibili casi di regex, ma scrivere un parser è il modo corretto per risolvere questo problema. Se avete tempo a rotolare la vostra soluzione sarei check out ANTLR, hanno diverse grammatiche/C C++ disponibili su questa pagina:

ANTLR Grammar Lists

2

Se avete intenzione di essere l'applicazione di questo solo per tuoi impegna mi sento di raccomandare facendo l'abitudine di aggiungere un commit commento a la funzione, ad esempio:

void something() 
{ 
    ... 
    some thing = 1; 
    ... 
} 

a

void something() 
// last change by me: a better value for thing 
{ 
    ... 
    some thing = 2; 
    ... 
} 

sarà visualizzata per la functio n e il tuo commento con le modifiche. Come bonus, altre persone saranno in grado di capire cosa stai facendo.

+0

+1, buona risposta pronta all'uso; probabilmente è qualcosa che dovrei fare comunque. –

+0

Sì, penso in generale sovrastimare l'importanza dei commenti di commit globali e sottovalutare l'importanza dei commenti in linea. –

+0

Stavo cercando, e sto ancora cercando, una semplice espressione regolare che richiama le chiamate di funzione del modulo: :: (). Puoi venire con qualcosa che corrisponderà a quello? –

Problemi correlati