47 votes

un outil de refactoring C / C ++ basé sur libclang? (même le plus simple "exemple de jouet")

Comme je l'ai souligné - ici - , il semble clang est libclang doit être grande pour la mise en œuvre de la tâche difficile qui est C/C++ d'analyse de code et les modifications (découvrez la vidéo de présentation et diapositives).

Savez-vous de tout C/C++ refactoring outil basé sur libclang ?

"Tout" inclut même un simple état d'alpha du projet, avec le soutien de l'un refactoristation technique. Il peut être sans préprocesseur de soutien. Comme un exemple de la fonctionnellement à propos de qui je parle: la modification des noms de méthode, si elle prend en charge plusieurs fichiers ou un seul fichier à la fois. Vous demandez peut-être ce que le but est de demander à même de petits exemples, Ma pensée est que la création d'une liste d'exemples de code et de petits outils qui sont dans un endroit fournira une meilleure ressource pour apprendre à mettre en œuvre refactorisation avec libclang. Je crois qu'à partir de simples projets peuvent se développer de grands projets, - dans un véritable opensource façon :).

23voto

axw Points 2630

Clang contient une bibliothèque appelée "CIndex" qui a été développé, je crois, pour faire de la complétion de code dans IDEs. Il peut également être utilisé pour l'analyse de C++ et de la marche de l'AST, mais ne pas avoir quelque chose dans la façon de refactoring. Voir Eli Bendersky de l'article ici.

J'ai commencé un projet récemment: cmonster. C'est un Python API pour l'analyse de C++ (à l'aide de libclang), l'analyse de l'AST, avec une interface pour la "réécriture" (c'est à dire l'insertion/suppression/modification de la source de la valeur). Il n'y a pas de belle façon (encore) pour faire des choses comme la modification des noms de fonction et de les avoir traduits dans la source des modifications, mais il ne serait pas terriblement difficile à faire.

Je n'ai pas encore créé un dégagement avec cette fonctionnalité (bien que c'est dans le dépôt github), que je suis en attente pour llvm/clang 3.0 pour être libéré.

Aussi, je tiens à souligner deux choses:

  • Le code est très rude, la qualifiant d'alpha serait peut-être généreux.
  • Je ne suis pas un expert sur ce sujet (contrairement, disons, le Docteur Ira Baxter là-bas).

Ajuster les attentes de façon appropriée.

Mise à jour: cmonster 0.2 a été libéré, ce qui inclut les fonctionnalités décrites. Check it out sur Github.

15voto

David C. Bishop Points 2107

Google travaille sur un outillage bibliothèque pour Clang. Depuis la version 3.2. Il comprend un ASTMatchers bibliothèque de sorte que vous pouvez construire une requête et ne pas avoir à marcher sur la AST.

Il y a une grande présentation vidéo sur le sujet qui marche à travers un simple renommer un exemple. (Ce qui est de la même gars comme MapReduce parler affiché ci-dessus, mais est plus récente et plus sur une simple mise en œuvre pratique plutôt que la conception interne et de l'entreprise des trucs de Google ont en cours).

La source, pour cet exemple, qui renomme une méthode est disponible dans l' outillage de la branche. Il peut être quelque part dans le coffre, mais je ne le trouve pas. Également Renommer le getDeclAs fonction de getNodesAs que l'autre est apparemment obsolète.). Il est plus avancé exemple qui supprime dupliqué c_str appels (qui est dans le coffre et quelqu'un a posté ci-dessus).

Voici la documentation pour LibASTMatchers et LibTooling.

EDIT: Certains des meilleurs docs pour ASTMatcher. Ici et ici.

EDIT: Google sont en train de travailler sur quelque chose qui s'appelle Clangd qui vise à être une sorte de Bruit de serveur pour le refactoring.

8voto

Reuben Morais Points 683

Google a créé un outil de refactoring basé sur Clang pour sa base de code C ++ et prévoit de le publier. Je ne connais pas l'état actuel du projet, mais vous pouvez voir cette démo présentée à la réunion des développeurs LLVM 2011: https://www.youtube.com/watch?v=mVbDzTM21BQ .

De plus, les fonctions de complétion automatique et de refactoring intégrées à XCode (4+) sont basées sur libclang.

6voto

synthesizerpatel Points 9762

C'est peut-être un peu 'méta', mais il y a un exemple écrit en clang comme outil pour fonctionner sur clang (bien que, il y a plus que cela.

RemoveCStrCalls.cpp

 //  This file implements a tool that prints replacements that remove redundant
//  calls of c_str() on strings.
//
//  Usage:
//  remove-cstr-calls <cmake-output-dir> <file1> <file2> ...
//
//  Where <cmake-output-dir> is a CMake build directory in which a file named
//  compile_commands.json exists (enable -DCMAKE_EXPORT_COMPILE_COMMANDS in
//  CMake to get this output).
//
//  <file1> ... specify the paths of files in the CMake source tree. This path
//  is looked up in the compile command database. If the path of a file is
//  absolute, it needs to point into CMake's source tree. If the path is
//  relative, the current working directory needs to be in the CMake source
//  tree and the file must be in a subdirectory of the current working
//  directory. "./" prefixes in the relative files will be automatically
//  removed, but the rest of a relative path must be a suffix of a path in
//  the compile command line database.
//
//  For example, to use remove-cstr-calls on all files in a subtree of the
//  source tree, use:
//
//    /path/in/subtree $ find . -name '*.cpp'|
//        xargs remove-cstr-calls /path/to/source
 

5voto

Ira Baxter Points 48153

Pas open source, mais a été utilisé pour réaliser de très non-jouet massive automatisé de refactoring des programmes C++ : notre Logiciel DMS de la Réingénierie du Toolkit. DMS est une "bibliothèque" (nous l'avons appelé une "boîte à outils") des équipements peut composer pour obtenir anlaysis et/ou de la traduction automatique.

Pertinents pour C++, DMS fournit à ce point dans le temps:

  • Plein le C++11 de l'analyseur, la construction de l'AST et capables de régénérer le code source avec précision y compris les commentaires, avec un préprocesseur
  • Plein analyseur C++ avec le nom et le type de résolution pour le C++ (ANSI, GNU, MS Visual C++)
  • Contrôle de flux de l'analyse pour le C++
  • Source-à-source de transformations
  • Partiellement complète de "renommer" les machines (voir la discussion ci-dessous)

Ce que je peux dire par expérience que le C++ est une chienne d'une langue à transformer.

Nous continuons à travailler sur elle, et effectuent un fiable outil de renommage. Même cela est difficile; un problème clé est le nom de l'observation au problème. Vous avez une variable locale X et Y à l'intérieur de cette étendue; vous essayez de renommer Y de X et de découvrir que la variable locale "capture" de l'accès. Il est incroyable de voir comment de nombreux espaces de noms et de capturer des types que vous avez à vous soucier en C++. Et ce qui est nécessaire comme base pour de nombreux autres refactorings.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X