Имя метода из номера строки - PullRequest
4 голосов
/ 22 июня 2009

Учитывая номер строки исходного кода определенного класса (Java / C #) - есть ли простой способ получить имя метода, в который он попадает? (Если оно находится в пределах одного) (Предположительно, с использованием абстрактного синтаксического дерева)

(Было бы полезно ограничить вывод checkstyle только касаемым методом).

Я предполагаю, что вам нужно использовать абстрактное синтаксическое дерево, чтобы выполнить строку # -> MethodName.

Ответы [ 3 ]

2 голосов
/ 22 июня 2009

(Java-специфические)

Если файл класса был скомпилирован с отладочной информацией, тогда таблица номеров строк будет содержать отображение номера строки кода <->. Я не думаю, что есть встроенный API для этого во время выполнения, но я уверен, что вы, вероятно, можете сделать это с некоторыми из библиотек инженерных байт-кодов, такими как ASM или BCEL.

2 голосов
/ 22 июня 2009

Я не знаю о Java, но в сборках .NET номера строк не хранятся в их таблицах метаданных - для такой информации вам понадобится файл PDB (база данных программ).

0 голосов
/ 19 августа 2009

Да, как вы сказали, используя правильный вид AST. DMS Software Reengineering Toolkit может создавать AST для Java и для C #. Каждый узел AST украшен данными номера строки. Каждый узел AST соответствует правилу грамматики.

Таким образом, проблема определения имени метода для номера строки довольно проста: найдите узел в AST с соответствующим номером строки и поднимайтесь по дереву, пока не будет найден узел AST, представляющий объявление метода; найти поддерево имени метода из этого узла и распечатать его.

Этот прием широко используется в инструментах статического анализа, созданных с использованием DMS, для сообщения имени вызывающего проблемы метода для проблемы, диагностированной по определенному номеру строки. DMS является предназначен для того, чтобы другие могли создавать такие инструменты статического анализа.

...