Pergunta

Dado um número de linha de um código particular de origem de classe (Java / C #) - há uma maneira fácil de obter o nome do método que se enquadra? (Se ele cai dentro de um) (presumivelmente usando uma árvore de sintaxe abstrata)

(Isto seria útil para limitar a saída de checkstyle apenas o método tocado).

Eu estou supondo que você teria que usar uma árvore de sintaxe abstrata para fazer a linha # -.> MethodName

Foi útil?

Solução

(específico de Java)

Se o arquivo de classe foi compilado com informações de depuração, em seguida, tabela de números da linha irá conter um mapeamento de código <-> número da linha. Eu não acho que há um built-in API para obter a esta em tempo de execução, embora eu tenho certeza que você provavelmente pode fazer com com algumas das libs engenharia bytecode lá fora, como ASM ou BCEL.

Outras dicas

Eu não sei sobre Java, mas NET assembléias não têm números de linha armazenados em suas tabelas de metadados -. Você precisaria de um arquivo PDB (base de dados do programa) para esse tipo de informação

Sim, como você disse, usando o tipo certo de AST. A DMS Software Reengineering Toolkit pode construir ASTs para Java e para C #. Cada nó AST é decorada com dados de números de linha. Cada nó AST corresponde a uma regra gramatical.

Assim, o problema de determinar o nome do método para um número de linha é muito fácil: encontrar um nó na AST com o número da linha correspondente e subir na árvore até que um nó AST é encontrada que representa uma declaração de método; encontrar o método de nome de sub desse nó e imprimi-lo.

Este truque é muito utilizado em ferramentas de análise estática construídos utilizando DMS, para relatar um nome de método agressor para um problema diagnosticado em um número de linha particular. DMS é projetado para permitir que outros para construir essas ferramentas de análise estática.

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