2009-06-17 10 views
6

Ilekroć wykonuję cykl zatwierdzania w svn, sprawdzam różnicę podczas pisania moich komentarzy. Pomyślałem, że byłoby miło pokazać rzeczywistą funkcję, w której dokonałem modyfikacji przy wyświetlaniu porównania.Uzyskiwanie różnicy svn do pokazywania funkcji C++ podczas zatwierdzania

Sprawdziłem , które wspomniało, że opcja -p pokaże funkcję C, w której znajduje się ta zmiana. Kiedy jednak spróbowałem użyć opcji -p z jakimś kodem C++, zwykle zwraca ona specyfikator dostępu (prywatny publiczne, chronione itp.), co nie jest zbyt przydatne.

Zauważyłem, że istnieje opcja -F dla diff, która robi to samo co -p, ale przyjmuje wyrażenie regularne określone przez użytkownika. Zastanawiam się: czy istnieje proste wyrażenie regularne pasujące do funkcji C++? Wygląda na to, że to wszystko, co konieczne, aby to zadziałało.

Spędziłbym trochę czasu, przyglądając się temu samemu, ale praca jest w trybie chrupania i wydawało mi się, że wiele osób mogłoby się przydać, więc pomyślałem, że opublikuję to tutaj.

EDYCJA: Nie szukam czegoś, co jest regexem typu catch-all, ale coś, co po prostu znajdowałoby najbliższą definicję funkcji nad różnicą obszarową. Fakt, że byłby nigdzie bliski ideału i nieco błędny, jest w porządku ze mną. Tak długo jak to działa, być może 60% czasu byłoby znaczącym usprawnieniem wydajności IMHO.

Odpowiedz

3

Czy istnieje prosty regex dopasować funkcję C++?

Czy istnieje (złożone) wyrażenie regularne pasujące do C++. Może lub może być możliwe do napisania.

Ale powiedziałbym, że wyrażenia regularne nie są łatwe do spełnienia (z uwagi na to, że chciałbyś mieć jakiś rodzaj dopasowania), ani nie są właściwym narzędziem do wykonania tego zadania.

Po prostu pomyśl o tym case jak ten. Jak sobie z tym poradzisz?

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

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

Jedynym realnym rozwiązaniem jest użycie parsera przy użyciu narzędzia yacc/lex. Co oczywiście dla ciebie nie robi nic.

Więc albo włamać się razem trochę niekompletny regex, który pasuje do większości funkcji podpisów w kodzie

+0

Hmmm ... Myślę, że rozwiązanie tego jest o wiele bardziej skomplikowane, niż myślałem. –

1

TortoiseSVN wykorzystuje następujące regexes wsparcia autouzupełnianie w jego oknie zatwierdzenia dla plików C++:

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

nie wiem jak dokładne są, choć.

+0

Są to s ** t: np. 'void hallo() {' nie jest rozpoznawany jako podpis funkcji – jitter

+0

Wygląda na to, że potrzebują deklaracji przestrzeni nazw, widząc :: tam. – Joey

+0

Ale nie dostarczam żadnych :) using namespace std; – jitter

1

nie wiem od opcja w SVN, że zrobi to, a rozwiązanie regex oparte będzie prawdopodobnie jedną lub więcej z następujących cech:

  • koszmar do kodu i utrzymywać, z dużą przypadków szczególnych
  • niepoprawne, a brakujące kilka ważne funkcje C++

trzeba jakiś parser do tego. Technicznie możliwe jest wyliczenie wszystkich możliwych przypadków wyrażeń regularnych, ale pisanie analizatora składni jest poprawną metodą rozwiązania tego problemu. Jeśli masz czas, aby rzucić swoje własne rozwiązanie chciałbym sprawdzić się ANTLR, mają kilka C/C++ gramatyki dostępne na tej stronie:

ANTLR Grammar Lists

2

Jeśli masz zamiar być zastosowanie to tylko swoje zobowiązuje Polecam dokonywania zwyczaj dodawania commit komentarz funkcja, np:

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

do

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

wyświetli dla was funk n i twój komentarz ze zmianami. Jako bonus, inni ludzie będą w stanie zrozumieć, co robisz.

+0

+1, dobra out-of-the-box odpowiedź; to prawdopodobnie coś, co i tak powinienem robić. –

+0

Tak, ogólnie rzecz biorąc, uważam, że ważność komentarzy dotyczących ogólnego zaangażowania jest zbyt duża i nie doceniam wagi komentarzy wewnętrznych. –

+0

Szukałem, i wciąż szukam, prostego regexu, który wychwyciłby wywołania funkcji w postaci: :: (). Czy możesz wymyślić coś, co będzie pasowało do tego? –

Powiązane problemy