Nom de la méthode à partir du numéro de ligne

É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 se trouve? (S’il se situe dans une des limites) (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 faire la ligne # -> MethodName.

    (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 du 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 librairies d’ingénierie de bytecode comme ASM ou BCEL.

    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 (Program Database) pour ce type d’informations.

    Oui, comme vous l’avez dit, en utilisant le bon type d’AST. 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 montez dans l’arborescence jusqu’à trouver un nœud AST représentant une déclaration de méthode; trouvez le sous-arbre de nom de méthode à partir de ce noeud et imprimez-le.

    Cette astuce est largement utilisée dans les outils d’parsing statique construits à l’aide de 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 créer de tels outils d’parsing statique.