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.

Foi útil?

Solução

Os trabalhos no código fonte:

Os trabalhos no assembly:

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.

Você deve definitivamente verificar para fora Roslyn desde MS acaba de abrir (ou em breve aberto) o código com uma licença Apache 2 aqui . Você também pode verificar uma forma de analisar esta informação com este código de GitHub .

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).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top