2009-06-17 11 views
6

Chaque fois que je fais un cycle de validation dans svn, j'examine le diff quand j'écris mes commentaires. J'ai pensé que ce serait vraiment sympa de montrer la fonction réelle que j'ai fait les modifications lors de l'affichage du diff.Obtenir svn diff pour afficher la fonction C++ pendant la validation

J'ai vérifié this page, qui a mentionné que l'option -p montrera la fonction C que la modification est en. Lorsque j'ai essayé d'utiliser l'option -p avec du code C++, cependant, il retourne généralement le spécificateur d'accès (privé public, protégé, etc.), ce qui n'est pas très pratique.

J'ai remarqué qu'il existe une option -F pour diff qui fait la même chose que -p, mais prend une regex spécifiée par l'utilisateur. Je me demandais: existe-t-il une simple regex pour correspondre à une fonction C++? Il semble que ce serait tout ce qui est nécessaire pour que cela fonctionne. Je passerais un peu de temps à regarder cela moi-même, mais le travail est en mode crunch et cela semblait être quelque chose que beaucoup de gens trouveraient utile, alors j'ai pensé que je l'afficherais ici.

EDIT: Je ne cherche pas quelque chose qui soit une regex catch-all de slam-dunk, mais quelque chose qui trouverait simplement la définition de fonction la plus proche au-dessus de la zone diff montrerait. Le fait que ce serait loin d'être parfait, et un peu buggé est d'accord avec moi. Tant que cela fonctionne bien peut-être que 60% du temps serait une amélioration significative de la productivité à mon humble avis.

Répondre

3

est-il d'un simple regex pour correspondre à une fonction C++? Y a-t-il une regex (complexe) pour correspondre à un C++? Peut-être ou pourrait être possible d'en écrire un. Mais je dirais que les expressions régulières ne sont pas facilement à la hauteur d'une telle tâche (étant donné que vous voulez une sorte de correspondance d'exct) et ne sont pas le bon outil pour une telle tâche.

Il suffit de penser à case comme celui-ci. Comment allez-vous gérer ce genre de choses.

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

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

La seule vraie solution consiste à utiliser un analyseur en utilisant yacc/lex. Lequel pour votre cas d'utilisation bien sûr ne fait rien.

Donc, soit pirater ensemble une regex incomplète qui correspond à la plupart des signatures de fonctions dans votre code

+0

Hmmm ... Je suppose que la solution à ce problème est beaucoup plus complexe que je ne le pensais. –

1

TortoiseSVN utilise les expressions rationnelles suivantes pour le soutien de saisie semi-automatique dans sa boîte de dialogue de fichiers pour C++:

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

Je ne sais pas comment ils sont exacts, cependant.

+0

Ils sont s ** t: par ex. 'void hallo() {' n'est pas reconnu comme la signature de la fonction – jitter

+0

On dirait qu'ils ont besoin de la déclaration de l'espace de noms, voir un :: dans là. – Joey

+0

Mais je ne fournis aucune :) using namespace std; – jitter

1

Je ne sais pas d'une option SVN qui le fera, et une solution à base regex sera probablement un ou plusieurs des éléments suivants:

  • un cauchemar au code et à entretenir, avec beaucoup des cas particuliers
  • incorrectes, et manquant plusieurs fonctions C++ valide

Vous avez besoin d'une sorte d'analyseur pour cela. Il est techniquement possible d'énumérer tous les cas regex possibles, mais l'écriture d'un analyseur est la bonne façon de résoudre ce problème. Si vous avez le temps de rouler votre propre solution je vérifierais à ANTLR, ils ont plusieurs grammaires C/C++ disponible sur cette page:

ANTLR Grammar Lists

2

Si vous allez à appliquer ce que pour votre commits je recommande de prendre l'habitude d'ajouter un commettras commentaire à la fonction, par exemple:

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

à

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

affiche pour vous le foncti n et votre commentaire avec les modifications. En prime, les autres pourront comprendre ce que vous faites.

+0

+1, bonne réponse prête à l'emploi; c'est probablement quelque chose que je devrais faire de toute façon. –

+0

Oui, je pense en général surestimer l'importance des commentaires de validation globale et sous-estimer l'importance des commentaires en ligne. –

+0

Je cherchais, et cherche toujours, une simple regex qui attraperait les appels de fonction du formulaire: :: (). Pouvez-vous trouver quelque chose qui correspond à cela? –

Questions connexes