Pergunta
Quais analisadores estão disponíveis para analisar código C#?
Estou procurando um analisador C# que possa ser usado em C# e me dê acesso a informações de linha e arquivo sobre cada artefato do código analisado.
Solução
Os trabalhos no código fonte:
- CSParser : De C # 1,0 a 2,0, open-source
- Metaspec C # Parser : De C # 1,0 a 3,0, produto comercial (cerca de 5000 $)
- #recognize ! De C # 1,0 a 3,0, do produto comercial (cerca de 900 €) (resposta por SharpRecognize )
- SharpDevelop Analisador (resposta por Akselsson )
- NRefactory : De C # 1,0 a 4,0 (+ assíncrona), open-source, analisador usado em SharpDevelop. Inclui análise semântica.
- C # Parser e CodeDOM : Um completo C # 4.0 Parser, já suportam o recurso assíncrona C # 5.0. produto comercial (49 $ a 299 $) (resposta por Ken Beckett )
- Microsoft Roslyn CTP : Compiler como um serviço.
Os trabalhos no assembly:
- System.Reflection
- Microsoft Common Compiler Infrastructure : De C # 1,0 a 3,0, Microsoft Public License. Usado por FXCop Spec #
- Mono.Cecil : De C # 1,0 a 3,0, open-source
O problema com a montagem de "análise" é que temos menos informações sobre linha e arquivo (as informações que se baseia em arquivo.pdb e Pdb contém linhas informações apenas para métodos)
Eu personnaly recomendar Mono.Cecil e NRefactory .
Outras dicas
Mono (open source) inclui compilador C # (e de analisador claro)
Se você estiver indo para compilar C # v3.5 para .net montagens:
var cp = new Microsoft.CSharp.CSharpCodeProvider(new Dictionary<string, string>() { { "CompilerVersion", "v3.5" } });
http://msdn.microsoft.com/en- us / library / microsoft.csharp.csharpcodeprovider.aspx
Se você estiver familiarizado com ANTLR, você pode usar Antlr C # gramática .
Eu tenho implementado apenas o que você está pedindo (AST de análise de código C #) no OWASP projeto Plataforma O2 usando APIs SharpDevelop AST.
A fim de torná-lo mais fácil de consumir eu escrevi uma API rápida que expõe uma série de elementos-chave de código fonte (usando instruções, tipos, métodos, propriedades, campos, comentários) e é capaz de reescrever o código original C # para C # e em VBNET.
Você pode ver esta API em ação neste arquivo de script O2 XRule: ascx_View_SourceCode_AST.cs.o2 .
Por exemplo, este é como você processar um C # código-fonte de texto e preencher uma série 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");
}
O exemplo em ascx_View_SourceCode_AST.cs.o2 também mostra como você pode usar as informações obtidas a partir da AST para selecionar sobre o código fonte de um tipo, método, comentário, etc ..
Para referência aqui é o código da API que escreveu (note que esta é a minha primeira passagem pelo usando C # AST analisador de SharpDevelop, e eu ainda estou começando minha cabeça em torno de como ele funciona):
Nós lançamos recentemente um # analisador C que lida com todos os C # 4.0 recursos, mais o novo recurso assíncrona: C # analisador e CodeDOM
Esta biblioteca gera um modelo de objeto semântica que retém comentários e informações de formatação e pode ser modificado e salvo. Ele também suporta o uso de consultas LINQ para analisar o código-fonte.
SharpDevelop , um IDE de código aberto, vem com um analisador de código-base visitante que funciona muito bem. Ele pode ser usado independentemente do IDE.
Considere usar a reflexão sobre um binário construído em vez de analisar o código C # diretamente. A reflexão API é realmente fácil de usar e, talvez, você pode obter todas as informações que você precisa?
Tenha um olhar em ouro Analisador . Ele tem uma IU muito intuitiva que permite que você interativamente testar sua gramática e gerar código C #. Há uma abundância de exemplos disponíveis com ele e é totalmente gratuito.
Talvez você poderia tentar com ironia sobre irony.codeplex.com.
É muito rápido e um c # gramática já existe.
A gramática em si é escrito diretamente no c # em uma BNF como caminho (conseguido com alguns operadores sobrecargas)
A melhor coisa com ele é que a "gramática" produz a AST diretamente.
Algo que está ganhando força e muito apropriado para o trabalho é Nemerle
Você pode ver como ele poderia resolvê-lo nestes vídeos do NDC:
Não em C #, mas um C completo # 2/3/4 analisador que constrói ASTs completo está disponível com a nossa DMS Software Reengineering Toolkit .
DMS fornece uma vasta infra-estrutura para análise, construção de árvores, construção de tabelas de símbolos e fluxo análises, transformação source-to-source, e regeneração de código fonte a partir do ASTs (modificado). (Ele também lida com muitas outras línguas do que apenas C #).
EDIT (setembro) de 2013: Esta resposta não foi atualizado recentemente. DMS tem de cabo longo C # 5.0
GPPG pode ser útil, se você estiver disposto a escrever seu próprio parser (que é divertido).