Question

Étant donné le numéro de ligne d'un code source de classe particulier (Java / C #), existe-t-il un moyen facile d'obtenir le nom de la méthode dans laquelle elle s'inscrit? (S'il est inférieur à un) (utilisant probablement un arbre de syntaxe abstraite)

(Cela serait utile pour limiter la sortie de checkstyle à la seule méthode utilisée).

Je suppose que vous devrez utiliser un arbre de syntaxe abstraite pour effectuer la ligne # - > MethodName.

Était-ce utile?

La solution

(spécifique à Java)

Si le fichier de classe a été compilé avec les informations de débogage, la table des numéros de ligne contiendra un mappage de code < - > numéro de ligne. Je ne pense pas qu’il existe une API intégrée permettant de résoudre ce problème au moment de l’exécution, même si je suis sûr que vous pouvez probablement utiliser certaines des bibliothèques d’ingénierie de code-octet telles que ASM ou BCEL.

Autres conseils

Je ne connais pas Java, mais les assemblys .NET ne possèdent pas de numéros de ligne dans leurs tables de métadonnées - vous auriez besoin d'un fichier PDB (base de données de programmes) pour ce type d'informations.

Oui, comme vous l'avez dit, en utilisant le bon type d'AST. Le le DMS Software Reengineering Toolkit peut créer des AST pour Java et pour C #. Chaque nœud AST est décoré avec des données de numéro de ligne. Chaque nœud AST correspond à une règle de grammaire.

Le problème de détermination du nom de la méthode pour un numéro de ligne est donc assez simple: recherchez un nœud dans l'AST avec le numéro de ligne correspondant et grimpez dans l'arborescence jusqu'à trouver un nœud AST représentant une déclaration de méthode; recherchez le sous-arbre de nom de méthode à partir de ce nœud et imprimez-le.

Cette astuce est très utilisée dans les outils d’analyse statique construits avec DMS pour signaler un nom de méthode fautif pour un problème diagnostiqué à un numéro de ligne particulier. DMS est conçu pour permettre à d’autres de construire de tels outils d’analyse statique.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top