Quels analyseurs sont disponibles pour analyser le code C #?
Je recherche un analyseur C # qui peut être utilisé en C # et me donne accès aux informations de ligne et de fichier sur chaque artefact du code analysé.
Quels analyseurs sont disponibles pour analyser le code C #?
Je recherche un analyseur C # qui peut être utilisé en C # et me donne accès aux informations de ligne et de fichier sur chaque artefact du code analysé.
Réponses:
Fonctionne sur le code source:
Fonctionne au montage:
Le problème avec "l'analyse" de l'assembly est que nous avons moins d'informations sur la ligne et le fichier (les informations sont basées sur le fichier .pdb, et Pdb contient des informations sur les lignes uniquement pour les méthodes)
Je recommande personnellement Mono.Cecil et NRefactory .
Mono (open source) inclut le compilateur C # (et bien sûr l'analyseur)
Si vous allez compiler C # v3.5 en assemblys .net:
var cp = new Microsoft.CSharp.CSharpCodeProvider(new Dictionary<string, string>() { { "CompilerVersion", "v3.5" } });
http://msdn.microsoft.com/en-us/library/microsoft.csharp.csharpcodeprovider.aspx
CodeDomProvider.Parse()
méthode.
Si vous connaissez ANTLR, vous pouvez utiliser la grammaire Antlr C # .
J'ai implémenté exactement ce que vous demandez (analyse AST du code C #) dans le projet OWASP O2 Platform à l' aide des API SharpDevelop AST.
Afin de faciliter la consommation, j'ai écrit une API rapide qui expose un certain nombre d'éléments clés du code source (en utilisant des instructions, des types, des méthodes, des propriétés, des champs, des commentaires) et est capable de réécrire le code C # original en C # et en VBNET .
Vous pouvez voir cette API en action sur ce fichier de script O2 XRule: ascx_View_SourceCode_AST.cs.o2 .
Par exemple, voici comment traiter un texte de code source C # et remplir un certain nombre de TreeViews & TextBoxes:
public void updateView(string sourceCode)
{
var ast = new Ast_CSharp(sourceCode);
ast_TreeView.show_Ast(ast);
types_TreeView.show_List(ast.astDetails.Types, "Text");
usingDeclarations_TreeView.show_List(ast.astDetails.UsingDeclarations,"Text");
methods_TreeView.show_List(ast.astDetails.Methods,"Text");
fields_TreeView.show_List(ast.astDetails.Fields,"Text");
properties_TreeView.show_List(ast.astDetails.Properties,"Text");
comments_TreeView.show_List(ast.astDetails.Comments,"Text");
rewritenCSharpCode_SourceCodeEditor.setDocumentContents(ast.astDetails.CSharpCode, ".cs");
rewritenVBNet_SourceCodeEditor.setDocumentContents(ast.astDetails.VBNetCode, ".vb");
}
L'exemple sur ascx_View_SourceCode_AST.cs.o2 montre également comment vous pouvez ensuite utiliser les informations recueillies auprès de l'AST pour sélectionner sur le code source un type, une méthode, un commentaire, etc.
Pour référence, voici le code API qui a écrit (notez que c'est ma première tentative d'utilisation de l'analyseur C # AST de SharpDevelop, et je suis toujours en train de comprendre comment cela fonctionne):
Nous avons récemment publié un analyseur C # qui gère toutes les fonctionnalités C # 4.0 ainsi que la nouvelle fonctionnalité async: C # Parser et CodeDOM
Cette bibliothèque génère un modèle d'objet sémantique qui conserve les commentaires et les informations de formatage et peut être modifié et enregistré. Il prend également en charge l'utilisation de requêtes LINQ pour analyser le code source.
SharpDevelop , un IDE open source, est livré avec un analyseur de code basé sur les visiteurs qui fonctionne très bien. Il peut être utilisé indépendamment de l'IDE.
Envisagez d'utiliser la réflexion sur un binaire généré au lieu d'analyser directement le code C #. L'API de réflexion est vraiment facile à utiliser et peut-être pouvez-vous obtenir toutes les informations dont vous avez besoin?
Jetez un œil à Gold Parser . Il possède une interface utilisateur très intuitive qui vous permet de tester de manière interactive votre grammaire et de générer du code C #. Il existe de nombreux exemples disponibles et il est entièrement gratuit.
Peut-être que vous pourriez essayer avec Irony sur irony.codeplex.com.
C'est très rapide et la grammaire ac # existe déjà.
La grammaire elle-même est écrite directement en c # de manière BNF (obtenue avec certaines surcharges d'opérateurs)
La meilleure chose avec cela est que la "grammaire" produit directement l'AST.
Quelque chose qui prend de l'ampleur et très approprié pour le travail est Nemerle
vous pouvez voir comment cela pourrait le résoudre dans ces vidéos de NDC:
Pas en C #, mais un analyseur C # 2/3/4 complet qui construit des AST complets est disponible avec notre boîte à outils de réingénierie logicielle DMS .
Le DMS fournit une vaste infrastructure pour l'analyse, la création d'arbres, la construction de tables de symboles et d'analyses de flux, la transformation source-source et la régénération du code source à partir des AST (modifiés). (Il gère également de nombreux autres langages que le simple C #.)
EDIT (septembre) 2013: Cette réponse n'a pas été mise à jour récemment. DMS gère depuis longtemps C # 5.0